createPeriodicWave 从样本值数组

createPeriodicWave from an array of sample values

我有一条曲线——比如说,正弦曲线——以均匀的间隔采样到 Float32Array 中,称为 samples。曲线按采样。如果将 samples(经过一些舍入)放在屏幕上,我们将得到如下内容:

 1.0 |    x           x
 0.5 |  x   x       x   x
 0.0 | x     x     x     x     x
-0.5 |        x   x       x   x
-1.0 |          x           x

samples 数组的内容是这些数字:

0, 0.5, 1, 0.5, 0, -0.5, -1, -0.5, 0, ...

如您所见,曲线由每个给定样本的 表示。我想创建一个 PeriodicWave from these sample values, which can be done by using AudioContext.createPeriodicWave().

但是,此方法接受以下参数而不是采样值:

我不太确定这些值对于一组采样值意味着什么。 如何将采样值转换为余弦项和正弦项?

编辑:采样的曲线不一定是正弦波或余弦波。它可以是任意形状。

如果你真的只想获取波形,那么只需使用 AudioBufferSource 并循环播放它(作为 AudioBuffer)。

PeriodicWaves 有所不同 - 它们是一种通过改变每个谐波的相对系数来和谐地控制振荡器波形的方法。如果您在 "imag" 数组的第二个槽中创建了一个只有值“1”的 PeriodicWave,您将得到一个正弦波。同样,您可以通过控制高次谐波来创建方波、三角波或锯齿波 - 请参阅 https://en.wikipedia.org/wiki/Non-sinusoidal_waveform。这些浪潮最终可能变得非常富有 -

如果你想把它变成一个PeriodicWave,你需要把它变成PeriodicWave使用的一组相对谐波强度,使用FFT算法(https://en.wikipedia.org/wiki/Discrete_Fourier_transform is a decent introduction). There are libraries on the net to do this, like DSP.js (https://github.com/corbanbrook/dsp.js/)。

(这个以前叫Wavetable,但是也太乱了,也许应该改名为HarmonicWaveTable?)

如果你确定你的时域波形是周期性的,那么你可以对波形进行傅里叶变换,得到傅里叶系数。转换的实部和虚部可以作为 realimag 参数传递给 createPeriodicWave.

但是如果你已经有了波形,只需将它保存在 AudioBuffer 中,将其分配给 AudioBufferSourceNode,将 loop 设置为 true,然后使用它作为您的音频源,而不是带有自定义 PeriodicWave.

OscillatorNode