- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在编写一种音频插件,我得到了一组值,这些值表示基于步进的信号,例如:
具有这些值:
[ 0.27, 0.43, 0.48, 0.51, 0.85, 0.15, 0.48, 0.01, 0.28, 0.84, 0.15, 0.22, 0.11, 0.86, 0.66, 0.92, 0.40, 0.71 ]
我正在寻找将这些值转换为更大的插值数组,这些插值表示平滑信号,例如正弦波。像这样的东西(对不起我的绘画艺术):
我应该在这里使用什么样的数学?在我的开发环境(基于 Ruby)中,我有很多数学函数。但我不知道从哪里开始。
最佳答案
这里你想要的是一个digital filter - 特别是低通滤波器。
有两种简单的数字滤波器,Finite Impulse Response和 Infinite Impulse Response .
FIR 滤波器的工作原理是对前 n 个音频样本进行一些加权求和,然后使用它来生成输出样本。之所以称为“有限脉冲响应”,是因为输入中的单个脉冲只能影响有限数量的输出样本。
相比之下,IIR 滤波器除了使用当前样本外,还使用自己之前的输出。由于这种反馈特性,它被称为“无限脉冲响应”;单个脉冲可以影响所有 future 的样本。
在这两者中,IIR 滤波器实现起来最简单,其最基本的形式如下所示:
state(N) = state(N - 1) * weighting + sample(N)
output(N) = state(N)
也就是说,对于每个输入样本,将先前的状态值减少一定量并添加输入,然后将其用作输出。因此,它基本上是一个移动平均过滤器。
例如,如果您将“加权”设置为 0.95,则每个输出样本 95% 受先前样本的影响,5% 受当前样本的影响,输出值将随着输入的变化而缓慢变化。它还将按比例放大 20 倍(1/(1-weighting)),因此您应该相应地重新归一化它。
以下是前几个步骤如何处理您的输入数据:
state = 20 * 0.27
。状态/20 = 0.27
state = state * 0.95 + 0.43 = 26.08
state/20 = 0.278
。 state = state * 0.95 + 0.48 = 5.76
状态/20 = 0.288
等等。如果您需要比输入数据点更多的输出数据点,请在输入过滤器之前重复输入样本 n 次,或者将输入样本与 n 个零样本交错。两者都是有效的,尽管它们对过滤后的输出有不同的影响。
数字滤波器设计背后有很多理论;在实践中,对于一个简单的实现,您可能可以使用这个一阶滤波器,并调整权重值以适应。
关于ruby - 基于步进的信号平滑一个 - 我如何插值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853737/
我是一名优秀的程序员,十分优秀!