我不确定我的问题的正确标题是什么 所以这就是问题所在 假设我有N个样本,例如: 1 2 3 4 。 。 。 Ñ
现在,我希望通过从N个样本中转储(N-M)数据,将样本的大小从N减少到M. 我希望倾销尽可能“分发”, 所以,如果我有100个样本,并希望将其压缩到50个样本,我会扔掉所有其他样本。另一个例子,假设数据是100个样本,我想将其压缩为25个样本。我会在每组100/25样本中丢弃1个样本,这意味着我遍历每个样本并计数,每次我的计数达到4时,我会丢弃样本并重新开始计数。 问题是如果上面的4例如是2.333,我该怎么做呢。如何处理小数点以分配丢弃样本?
非常感谢..
答案 0 :(得分:3)
您要查找的字词为resampling,downsampling和decimation。请注意,在一般情况下,您不能丢弃数据的子集而不会冒aliasing的风险。在抽取之前,您需要先low pass filter您的数据,以便新的Nyquist rate上面没有任何信息可能会出现别名。
当您想要按非整数值进行下采样时,例如2.333根据您上面的示例,您通常会通过整数因子M进行上采样,然后使用不同的整数因子N进行下采样,其中分数M/N
为您提供所需的重采样因子。在您的示例M = 3
和N = 7
中,您将上采样3倍,然后下采样7倍。
答案 1 :(得分:0)
答案 2 :(得分:0)
对于您希望听起来不错的音频数据(与频域中的混叠和失真相反),请参阅Paul 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];
}