Google Chrome中createPeriodicWave()的参数是什么?

问题描述 投票:5回答:2
var ctx = new webkitAudioContext();
    pw = ctx.createWaveshaper();

每次我在Google Chrome中使用CreatePeriodicWave()时,我都会得到

SyntaxError: Failed to construct 'PeriodicWave': invalid real array

我应该在函数中放置什么来避免这个错误?

javascript google-chrome html5-audio web-audio
2个回答
3
投票

createPeriodicWave期望两个参数 - 都是Float32Array实例 - 指定傅立叶级数的系数。第一个是real部分,它是余弦项的数组。第二个,imag,代表正弦术语。

但是你有什么特别的问题需要解决吗?我有一种感觉,只知道args是Float32Array可能不会有那么大的帮助。


13
投票

要获得PeriodicWave,代码如下:

var context = new webkitAudioContext();
var realCoeffs = new Float32Array([0,0]); // No DC offset or cosine fundamental freq
var imagCoeffs = new Float32Array([0,1]); // sine of amplitude 1 at fundamental freq (First imaginary coeff is ignored)
var wave = context.createPeriodicWave(realCoeffs, imagCoeffs); // will be a simple sine wave

然后,您可以在wave中使用PeriodicWaveform OscillatorNode

var osc = context.createOscillator();
osc.setPeriodicWave(wave);
osc.frequency.value = 440;
osc.connect(context.destination);
osc.start(0);

您可以通过查找“傅里叶级数”来了解有关系数的更多信息。缺点是:

让我们说f是你的基本频率(相当于osc.frequency.value

对于实系数,Kr

  • Kr[0]是DC偏移(由cos(0 f t)创建的“波”的幅度)
  • Kr[1]是基频处余弦波的幅度(cos(1 f t))
  • Kr[2]是二次谐波余弦波的幅度(cos(2 f t))
  • 等等...

对于虚数系数它是相同的,除了它们是正弦波,而第0个系数被忽略,因为它将是波sin(0*t)的幅度,对于所有t为0。

Sawtooth wave example:

注意:如果你真的只想要一个锯齿,你可以通过将振荡器节点中的type属性设置为“锯齿”来生成它,但如果假设该选项不可用,那么你可以这样做。

对于锯齿波,您可以在这里看到系数:http://mathworld.wolfram.com/FourierSeriesSawtoothWave.html

锯齿具有1/2的DC偏移(即第一实系数) - 其余的实系数为0 - 并且形式为1 /(nπ)的虚系数。因此,为了生产锯齿,您将更换线条

var realCoeffs = new Float32Array([0,0]);
var imagCoeffs = new Float32Array([0,1]);

以上,具有以下内容:

var numCoeffs = 64; // The more coefficients you use, the better the approximation
var realCoeffs = new Float32Array(numCoeffs);
var imagCoeffs = new Float32Array(numCoeffs);

realCoeffs[0] = 0.5;
for (var i = 1; i < numCoeffs; i++) { // note i starts at 1
    imagCoeffs[i] = 1 / (i * Math.PI);
}
© www.soinside.com 2019 - 2024. All rights reserved.