WaveShaperNode的传递函数

Transfer function of WaveShaperNode

本文关键字:传递函数 WaveShaperNode      更新时间:2023-09-26

我很难理解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 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是数组中的偏移量,需要进行一些预处理。

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

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

或者类似的东西。

事实上,如果x等于零,那么y也必须等于零;但很可能。例如,您可以使用波形整形器来实现直流偏移。

演示代码中的"sampleRate"位很愚蠢——应该使用maxint而不是sampleRate来确定数组的大小。sampleRate是一个时域的东西,而波形整形器只在幅度矢量中工作。

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