javascript - WaveShaperNode 的传递函数

标签 javascript audio signal-processing web-audio-api transfer-function

我无法理解 Web Audio API 中 WaveShaperNode 的传输函数如何工作。据我了解,传递函数是一个波形整形器,它接收信号输入x并产生新信号y。所以,

y = f(x)

我知道如果x等于0,那么y也应该等于0。因此,0 = f(0)。为了适应适当的范围,y 应该在 [-1, 1] 之间,因此这个函数:y = x/(1 + |x|) 限制输出范围为 [-1, 1]。切比雪夫多项式对于用于“扭曲”音乐输入信号的传递函数很有用。

但是对于传递函数,您需要输入信号x才能操纵它并创建输出y。但是,使用 Web Audio API 中的 WaveShaperNode,您无法访问原始输入x(或者您可以吗?)。我经常看到这样的算法:

for(var i = 0; i < sampleRate; i++){
    var x = i * 2 / sampleRate - 1;
    this.curve[i] = (3 + distortionAmount) * x * 20 * (Math.PI / 180) / (Math.PI + distortionAmount * Math.abs(x));
}

其中,在上面的代码中,this.curve 是一个 Float32Array,表示每个示例帧的图形。我假设这里的 x 应该代表输入音频信号。然而,它实际上并不代表确切的输入音频信号。这是因为它只代表平均正弦波而实际输入并不重要? WaveShaperNode 是否采用原始输入 x 并使用(乘以?)我们创建的一般曲线来计算输出 y

最佳答案

WaveShaper 节点本身不启用通用传递函数 - 但您可以使用它来实现这一点。回答你的问题 - x 是数组的偏移量,需要进行一些预处理。

您提供给波形成形器的曲线就像 x 的查找表 - 分布在 [-1,1] 范围内。 Y 不需要在 [-1,1] 中 - 但 x 可以。因此,要求解 [-1,1] 中的 x 的 f(x),您只需得到 处的值

curve[ Math.floor( (x+1)/2 * (curve.length-1) ) ];

或者类似的东西。

如果 x 等于 0,那么 y 也一定为零,这实际上是不正确的;但这是有可能的。例如,您可以使用波形整形器来实现直流偏移。

演示代码中的“sampleRate”位很愚蠢 - 您应该使用 maxint 而不是 Samplerate 来确定数组的大小。 sampleRate 是一个时域的东西,waveshaper 只在幅度向量中操作。

关于javascript - WaveShaperNode 的传递函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28305662/

相关文章:

javascript - iPad 上点击事件响应缓慢

javascript - 带有 node.js 的 Ruby 子进程

c# - 我无法弄清楚为什么这个代码在与后台工作人员一起使用时会失败

python - 如何将音调轨道从旋律提取算法转换为类似音频信号的嗡嗡声

javascript - 不确定如何使用 AJAX

javascript - 当我从点击回调中调用它时,颜色框看起来不正确

audio - 如何在您的网站PHP/Flash上​​播放音频?

java - 实时java音量调节

在 ARM Cortex 中从 float 转换为 q7_t?

math - 逆 FFT 的计算复杂度