来自一组样本值的createPeriodicWave

时间:2016-09-27 10:45:11

标签: javascript audio web-audio

我有一条曲线 - 比如一条正弦曲线 - 以均匀的间隔采样到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,可以使用AudioContext.createPeriodicWave()来完成。

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

  • 真实:一系列余弦术语(传统上是A术语)。
  • imag :一系列正弦术语(传统上是B术语)。

我不太确定这些值对于采样值数组的意义。 如何从采样值转换为余弦项和正弦项?

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

2 个答案:

答案 0 :(得分:2)

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

但是如果您已经有波形,只需将其保存在AudioBuffer中,将其分配到AudioBufferSourceNode,将loop设置为true,并将其用作您的音频源而不是带有自定义OscillatorNode的{​​{1}}。

答案 1 :(得分:1)

如果您真的只想拍摄波形,那么只需使用AudioBufferSource并将其循环(作为AudioBuffer)。

周期波是不同的 - 它们通过改变每个谐波的相对系数来协调地控制振荡器的波形。如果你创建的PeriodicWave只有值" 1"在" imag"的第二个位置数组,你会得到一个正弦波。同样,您可以通过控制高次谐波来创建方波,三角波或锯齿波 - 请参阅https://en.wikipedia.org/wiki/Non-sinusoidal_waveform。这些浪潮最终会变得非常丰富 -

如果要将其转换为PeriodicWave,则需要将其转换为PeriodicWave使用的相对谐波强度集,使用FFT算法(https://en.wikipedia.org/wiki/Discrete_Fourier_transform是一个不错的介绍)。网上有一些库可以做到这一点,比如DSP.js(https://github.com/corbanbrook/dsp.js/)。

(这曾经被称为Wavetable,但这也让人感到困惑。也许它应该被重命名为HarmonicWaveTable?)