分布式地“转储”/“压缩”数据样本

时间:2012-01-18 06:06:49

标签: java math audio signal-processing

我不确定我的问题的正确标题是什么 所以这就是问题所在 假设我有N个样本,例如: 1 2 3 4 。 。 。 Ñ

现在,我希望通过从N个样本中转储(N-M)数据,将样本的大小从N减少到M. 我希望倾销尽可能“分发”, 所以,如果我有100个样本,并希望将其压缩到50个样本,我会扔掉所有其他样本。另一个例子,假设数据是100个样本,我想将其压缩为25个样本。我会在每组100/25样本中丢弃1个样本,这意味着我遍历每个样本并计数,每次我的计数达到4时,我会丢弃样本并重新开始计数。 问题是如果上面的4例如是2.333,我该怎么做呢。如何处理小数点以分配丢弃样本?

非常感谢..

3 个答案:

答案 0 :(得分:3)

您要查找的字词为resamplingdownsamplingdecimation。请注意,在一般情况下,您不能丢弃数据的子集而不会冒aliasing的风险。在抽取之前,您需要先low pass filter您的数据,以便新的Nyquist rate上面没有任何信息可能会出现别名。

当您想要按非整数值进行下采样时,例如2.333根据您上面的示例,您通常会通过整数因子M进行上采样,然后使用不同的整数因子N进行下采样,其中分数M/N为您提供所需的重采样因子。在您的示例M = 3N = 7中,您将上采样3倍,然后下采样7倍。

答案 1 :(得分:0)

  1. 您似乎在谈论采样率和数字信号处理
  2. 在缩小之前,您通常会对数据进行过滤,以确保样本中的高频不会混淆较低的频率。例如,在您的(取每四个值)中,每四个样本重复一次的频率将别名为“DC”或零周期频率(例如“234123412341”从每个分组的第一个开始将获得“2,2” ,2,2“,这可能不是你想要的。(一个3周期也会像一个周期的别名(231231231231)=> 231 ...(除非我做错了因为我累了)。有点超出我现在想要讨论的内容,因为这是一个非常高级的主题。
  3. 如果你可以将你的“2.333”表示为某种分数,那么就看,那是7/3。你说的每4个样本中有1个(1/4),我会说你每7个样本中就有3个样本。所以你可以(拿,摔,拿,摔,拿,摔,掉)。但可能还有其他方法。

答案 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];
}