分布式“转储”/“压缩”数据样本
Posted
技术标签:
【中文标题】分布式“转储”/“压缩”数据样本【英文标题】:Distributedly "dumping"/"compressing" data samples 【发布时间】:2012-01-18 06:06:48 【问题描述】:我不太确定我的问题的正确标题是什么 所以这里的问题 假设我有 N 个样本,例如: 1 2 3 4 . . . 否
现在我想通过从 N 个样本中转储 (N-M) 个数据,将样本的大小从 N 减少到 M。 我希望倾销尽可能“分散”, 因此,如果我有 100 个样本并想将其压缩为 50 个样本,我会丢弃所有其他样本。另一个例子,假设数据是 100 个样本,我想将其压缩为 25 个样本。我会在每组 100/25 个样本中丢弃 1 个样本,这意味着我会遍历每个样本并计数,每次计数达到 4 时,我都会丢弃样本并重新开始计数。 问题是如果上面的 4 例如是 2.333,我该怎么做。如何处理小数点分布丢弃样本?
非常感谢..
【问题讨论】:
【参考方案1】:您要查找的术语是resampling、downsampling 和decimation。请注意,在一般情况下,您不能只丢弃一部分数据而不冒aliasing 的风险。在抽取之前,您需要先 low pass filter 您的数据,这样您的新 Nyquist rate 上方就没有任何信息会被别名。
当您想按非整数值进行下采样时,例如2.333 根据您上面的示例,您通常会通过按整数因子 M 进行上采样,然后按不同的整数因子 N 进行下采样,其中分数 M/N
为您提供所需的重采样因子。在您的示例 M = 3
和 N = 7
中,您将先上采样 3 倍,然后再下采样 7 倍。
【讨论】:
【参考方案2】:-
您似乎在谈论采样率和数字信号处理
在减少之前,您通常会过滤数据以确保样本中的高频不会与低频混叠。例如,在您的(每四个值)中,每四个样本重复的频率将别名为“DC”或零周期频率(例如,从每个分组的第一个开始的“234123412341”将得到“2,2 ,2,2",这可能不是您想要的。(3 循环也将别名为像它自己的循环 (231231231231) => 231...(除非我做错了,因为我累了)。过滤是有点超出我现在想讨论的范围,因为这是一个相当高级的话题。
如果您可以将“2.333”表示为某种分数,让我们看看,那就是 7/3。你说的是每 4 个样本中的 1 个(1/4)所以我想说你每 7 个样本中取 3 个。所以你可以(采取,放弃,采取,放弃,采取,放弃,放弃)。但可能还有其他方法。
【讨论】:
【参考方案3】:对于您想要听起来不错的音频数据(而不是在频域中出现混叠和失真),请参阅 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];
【讨论】:
以上是关于分布式“转储”/“压缩”数据样本的主要内容,如果未能解决你的问题,请参考以下文章