WaveShaperNode的传递函数

时间:2015-02-03 18:01:52

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

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

y = f(x)

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

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

2 个答案:

答案 0 :(得分:2)

WaveShaper节点本身不启用通用传输功能 - 但您可以使用它来执行此操作。要回答你的问题 - x是数组的偏移量,稍加预处理。

你给wavehaper的曲线就像一个x的查找表 - 跨越范围[-1,1]。 Y不需要在[-1,1]中 - 但x确实如此。因此,要在[-1,1]中求解x的f(x),只需得到

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

或类似的东西。

如果x等于零,那么实际上并非如此,那么y必须如此;但它很可能。例如,可以使用wavehaper来实现DC偏移。

那&#34; sampleRate&#34;您的演示代码中的位是傻瓜 - 您应该使用maxint而不是samplerate来确定数组的大小。 sampleRate是一个时域事物,wavehaper只在幅度向量中运行。

答案 1 :(得分:0)

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