WaveShaperNode 的传递函数

Transfer function of WaveShaperNode

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

y = f(x)

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

但是对于传递函数,您需要输入信号 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?

WaveShaperNode 被描述为应用非线性失真。因此它不会有经典的线性时不变传递函数(严格只适用于线性失真)。

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

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

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

或类似的东西。

如果 x 等于零,那么 y 也必须等于零,这实际上是不正确的;但很有可能。例如,您可以使用波形整形器来实现 DC 偏移。

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