WaveShaperNode的传递函数
Transfer function of WaveShaperNode
我很难理解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是一个时域的东西,而波形整形器只在幅度矢量中工作。
- 如何传递函数中的参数
- 如何在单击、Knockout时传递函数中的值
- D3选择html——传递函数时,索引从1开始,而不是从0开始
- 在谷歌地图的addListener事件中传递函数
- 如何在javascript中设置传递函数
- 什么's调用函数和传递函数的区别
- 在Angular Directive中传递函数作为参数不会;不起作用
- Skrollr:当滚动位置在最后一个关键帧之后时传递函数
- 在JS中传递函数作为参数,并访问接收函数's变量
- 如何在aspx页面中的转发器ItemDataBound中传递函数中的Control.ClientID
- setTimeout()/setInterval()赢得't执行**我正在传递函数对象,而不是执行函数
- WaveShaperNode的传递函数
- 在 .on('click') 事件处理程序中传递函数和函数参数
- 通过 x 标记访问器传递函数
- javascript:传递函数
- ES6类,传递函数作为参数来注册expressjs路由
- JavaScript:获取传递函数的参数
- 传递函数后不要更改对象
- 如何传递函数来比较项目
- 动态添加onclick到元素,传递函数参数