红宝石 – 有效地“缩放”或“调整大小”数组数组的算法(音频重采样)

前端之家收集整理的这篇文章主要介绍了红宝石 – 有效地“缩放”或“调整大小”数组数组的算法(音频重采样)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
做音频处理(虽然它也可以是图像处理)我有一个数组的一维数组. (它们恰好是表示音频样本的16位有符号整数,这个问题可以同样适用于不同大小的浮点数或整数.)

为了匹配不同频率的音频(例如,将44.1kHz采样与22kHz采样混合),我需要拉伸或压缩数组,以满足特定的长度.

将数组减半是简单的:放弃每一个其他样本.

[231,8143,16341,2000,-9352,...] => [231,...]

将数组宽度加倍略简单:将每个条目双倍放置(或者可选地在相邻的“实数”样本之间执行一些插值).

[231,4187,12242,...]

我想要的是一种高效,简单的算法,可以处理任何缩放因子,并且(理想情况下)可选地支持在该过程中执行一种或另一种的插值.

我的用例恰好是使用Ruby数组,但是我会很乐意在大多数任何语言或伪代码中获得答案.

解决方法

这是我在几分钟内一起投掷的东西,就像我在离开工作一样,然后在晚餐后再品尝一杯葡萄酒:
sample = [231,-9352]
new_sample = []
sample.zip([] * sample.size).each_cons(2) do |a,b|
  a[1] = (a[0] + b[0]).to_f / 2 # <-- simple average could be replaced with something smarter
  new_sample << a
end
new_sample.flatten!
new_sample[-1] = new_sample[-2]
new_sample # => [231,4187.0,12242.0,9170.5,2000]

我认为这是一个开始,但显然没有完成,因为-9352没有传播到最后的数组.我没有打扰将浮点数转换成ints;我想你知道如何做到这一点.

猜你在找的Ruby相关文章