看来我对 FM Synthesis 的研究还不够多。我当前的算法如下所示:
modulator = sin( 2 * pi * fm_freq * i/sample_rate )
carrier = sin( 2 * pi * ( freq + modulator ) * i/sample_rate )
它不是生成一个稳定的波形,而是生成从纯正弦波到严重失真的声音扭曲。我究竟做错了什么?
看来我对 FM Synthesis 的研究还不够多。我当前的算法如下所示:
modulator = sin( 2 * pi * fm_freq * i/sample_rate )
carrier = sin( 2 * pi * ( freq + modulator ) * i/sample_rate )
它不是生成一个稳定的波形,而是生成从纯正弦波到严重失真的声音扭曲。我究竟做错了什么?
它应该更像这样:
modulator = A_mod * sin(2 * pi * fm_freq * i / sample_rate)
carrier = sin (2 * pi * (freq * (1 + modulator)) * i / sample_rate)
两个主要变化是:
调制信号需要一个比例因子 ( A_mod
),它决定了 FM 的幅度——通常A_mod << 1
载波频率需要乘以(1 + modulator)
而不仅仅是modulator
,因为它需要以freq
偏差为+/- A_mod * freq
中心(在您的版本中,中心频率为零,您的瞬时频率在 之间变化+/- freq
!)。
您正在做的实际上是相位调制而不是频率调制。但是,您不能将调制器与样本索引相乘:尝试
carrier = sin( 2 * pi * ( freq*i/sample_rate + modulator ) )
实际的频率调制并不那么简单,它更像是
phi += 2 * pi * (freq + modulator)/sample_rate
carrier = sin(phi)