我有一条曲线 - 比如一条正弦曲线 - 以均匀的间隔采样到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()来完成。
但是,此方法接受以下参数而不是采样值:
我不太确定这些值对于采样值数组的意义。 如何从采样值转换为余弦项和正弦项?
编辑:采样的曲线不一定是正弦波或余弦波。它可以采取任意形状。
答案 0 :(得分:2)
如果您确定您拥有的时域波形是周期性的,那么您只需对波形进行傅里叶变换即可得到傅立叶系数。变换的实部和虚部可以作为real
和imag
参数传递给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?)