分布式“倾销” /“压缩”数据样本

问题描述:

我真的不知道什么是我的问题 正确的标题所以这里的问题 假设我有样本的N多,如:。 。 。 N分布式“倾销” /“压缩”数据样本

现在我想通过从N个样本中倾倒(N-M)数据来将样本的大小从N减少到M. 我希望倾销尽可能“分布式”, 就像我有100个样品并想将其压缩到50个样品一样,我会扔掉所有其他样品。另一个例子,比如数据是100个样本,我想压缩到25个样本。我会在每组100/25个样本中丢掉1个样本,这意味着我遍历每个样本并计数,每当我的计数达到4时,我就扔掉样本并重新开始计数。 问题是,如果以上4例如是2.333,我该如何做到这一点。如何处理小数点以分散地丢弃样本?

非常感谢..

您正在查找的术语是resamplingdownsamplingdecimation。请注意,在一般情况下,您不能丢掉数据的一部分而不冒险冒着aliasing。您需要先抽取数据low pass filter,然后抽取数据,以便在新的Nyquist rate之上没有任何信息会被别名化。

如果您希望以非整数值进行下采样, 2.333根据上面的示例,通常通过以整数因子M进行上采样,然后以不同的整数因子N进行下采样,其中M/N分数为您提供所需的重采样因子。在你的示例M = 3N = 7中,所以你可以上采样3倍,然后下采样7倍。

  1. 你似乎在谈论的采样率和数字信号处理
  2. 你减少之前,通常过滤数据,使您的样品中确定的高频率没有别名降低频率。例如,在你的(每四个数值)中,每四个采样重复一次的频率就会变成“DC”或零循环频率(例如“234123412341”,从每个分组的第一个开始就会得到“2,2 ,2,2“,这可能不是你想要的(一个3周期也会像它自己一样的周期(231231231231)=> 231 ...(除非我做错了,因为我累了)。稍微超出我现在要讨论的范围,因为它是一个非常高级的话题。
  3. 如果你能代表你的“2.333”作为某种分数,让我们看看,那是7/3。 4个样本(1/4)我会说你每7个样本中就有3个样本,所以你可能会(采取,丢弃,取,落,取,放,下落),但也可能有其他方法

对于你想听起来像样的音频数据(而不是频域中的别名和失真) ,请参阅保罗·R的涉及重采样的答案。重采样的一种方法是内插,例如使用窗口化的Sinc插值内核,该内核将对数据进行适当的低通滤波并允许创建内插的中间值。

对于非采样和非音频数据,如果您只想以接近均匀分布的方式丢弃一些采样,并且不关心增加频域噪声和失真,可能会出现类似情况工作:

float myRatio = (float)(N-1)/(float)(M-1); // check to make sure M > 1 beforehand 
for (int i=0; i < M; i++) { 
    int j = (int)roundf(myRatio * (float)i); // nearest bin decimation 
    myNewArrayLengthM[i] = myOldArrayLengthN[j]; 
}