【问题标题】: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,我该怎么做。如何处理小数点分布丢弃样本?
非常感谢..
【问题讨论】:
标签:
java
math
audio
signal-processing
【解决方案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];
}