gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:36:42 26 4
gpt4 key购买 nike

我正在编写一种音频插件,我得到了一组值,这些值表示基于步进的信号,例如:

enter image description here

具有这些值:

[ 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 ]

我正在寻找将这些值转换为更大的插值数组,这些插值表示平滑信号,例如正弦波。像这样的东西(对不起我的绘画艺术):

enter image description here

我应该在这里使用什么样的数学?在我的开发环境(基于 Ruby)中,我有很多数学函数。但我不知道从哪里开始。

最佳答案

这里你想要的是一个digital filter - 特别是低通滤波器。

有两种简单的数字滤波器,Finite Impulse ResponseInfinite 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)),因此您应该相应地重新归一化它。

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

  1. 首先设置 state = 20 * 0.27
  2. 输出状态/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. 输出状态/20 = 0.288

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

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

关于ruby - 基于步进的信号平滑一个 - 我如何插值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33853737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com