基于步进的信号平滑一个 - 我如何插值?
Step Based signal to smooth one - How can I interpolate?
我正在编写一种音频插件,我得到了一组代表阶跃信号的值,例如:
具有这些值:
[ 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 and Infinite Impulse Response。
FIR 滤波器的工作原理是对前 n 个音频样本进行一些加权求和,然后使用它来生成输出样本。它被称为 "Finite Impulse Response",因为输入中的单个脉冲只能影响有限数量的输出样本。
相比之下,IIR 滤波器除了当前样本之外还使用其自己的先前输出。之所以叫"Infinite Impulse Response"是因为这个反馈属性;一个单一的冲动可以影响所有未来的样本。
在这两者中,IIR 滤波器实现起来最简单,其最基本的形式如下所示:
state(N) = state(N - 1) * weighting + sample(N)
output(N) = state(N)
也就是说,对于每个输入样本,将先前的状态值减少一定量并添加输入,然后将其用作输出。因此,它基本上是一个移动平均过滤器。
例如,如果将 'weighting' 设置为 0.95,则每个输出样本受先前样本的影响为 95%,受当前样本的影响为 5%,并且输出值会随着输入的变化而缓慢变化.它还将按比例放大 20 倍(1/(1-加权)),因此您应该相应地对其进行重新归一化。
以下是前几个步骤如何处理您的输入数据:
- 从设置
state = 20 * 0.27
开始。
- 输出
state / 20 = 0.27
- 更新
state = state * 0.95 + 0.43 = 26.08
- 输出
state / 20 = 0.278
。
- 更新
state = state * 0.95 + 0.48 = 5.76
- 输出
state / 20 = 0.288
等等。如果您需要比输入数据点更多的输出数据点,请在输入过滤器之前重复输入样本 n 次,或者将输入样本与 n 个零样本交错。两者都是有效的,尽管它们对过滤后的输出有不同的影响。
数字滤波器设计背后有很多理论;在实践中,对于一个简单的实现,您可能可以使用这个一阶滤波器,并调整权重值以适应。
我正在编写一种音频插件,我得到了一组代表阶跃信号的值,例如:
具有这些值:
[ 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 and Infinite Impulse Response。
FIR 滤波器的工作原理是对前 n 个音频样本进行一些加权求和,然后使用它来生成输出样本。它被称为 "Finite Impulse Response",因为输入中的单个脉冲只能影响有限数量的输出样本。
相比之下,IIR 滤波器除了当前样本之外还使用其自己的先前输出。之所以叫"Infinite Impulse Response"是因为这个反馈属性;一个单一的冲动可以影响所有未来的样本。
在这两者中,IIR 滤波器实现起来最简单,其最基本的形式如下所示:
state(N) = state(N - 1) * weighting + sample(N)
output(N) = state(N)
也就是说,对于每个输入样本,将先前的状态值减少一定量并添加输入,然后将其用作输出。因此,它基本上是一个移动平均过滤器。
例如,如果将 'weighting' 设置为 0.95,则每个输出样本受先前样本的影响为 95%,受当前样本的影响为 5%,并且输出值会随着输入的变化而缓慢变化.它还将按比例放大 20 倍(1/(1-加权)),因此您应该相应地对其进行重新归一化。
以下是前几个步骤如何处理您的输入数据:
- 从设置
state = 20 * 0.27
开始。 - 输出
state / 20 = 0.27
- 更新
state = state * 0.95 + 0.43 = 26.08
- 输出
state / 20 = 0.278
。 - 更新
state = state * 0.95 + 0.48 = 5.76
- 输出
state / 20 = 0.288
等等。如果您需要比输入数据点更多的输出数据点,请在输入过滤器之前重复输入样本 n 次,或者将输入样本与 n 个零样本交错。两者都是有效的,尽管它们对过滤后的输出有不同的影响。
数字滤波器设计背后有很多理论;在实践中,对于一个简单的实现,您可能可以使用这个一阶滤波器,并调整权重值以适应。