0

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

y = f(x)

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

但是对于传递函数,您需要输入信号x才能对其进行操作并创建输出y。但是,使用 Web 音频 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

4

2 回答 2

2

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 也必须如此,这实际上是不正确的;但这很可能。例如,您可以使用波形整形器来实现 DC 偏移。

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

于 2015-02-04T01:10:52.687 回答
0

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

于 2015-02-03T18:36:13.487 回答