我无法理解 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),您只需得到 p> 处的值
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/