基于步进的信号平滑一个 - 我如何插值?

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-加权)),因此您应该相应地对其进行重新归一化。

以下是前几个步骤如何处理您的输入数据:

  1. 从设置 state = 20 * 0.27 开始。
  2. 输出state / 20 = 0.27
  3. 更新state = state * 0.95 + 0.43 = 26.08
  4. 输出state / 20 = 0.278
  5. 更新state = state * 0.95 + 0.48 = 5.76
  6. 输出state / 20 = 0.288

等等。如果您需要比输入数据点更多的输出数据点,请在输入过滤器之前重复输入样本 n 次,或者将输入样本与 n 个零样本交错。两者都是有效的,尽管它们对过滤后的输出有不同的影响。

数字滤波器设计背后有很多理论;在实践中,对于一个简单的实现,您可能可以使用这个一阶滤波器,并调整权重值以适应。