我正在尝试频率调制音频信号。我可以通过使用下面的方程式y = cos(Fc + sin(Fm))成功地用另一个正弦波(调制器)调制正弦波(载波),但是我不知道如何调整音频信号因为显然我不能使用上述公式。我的问题是:如何将输入数据与调制信号组合以获得FM信号?
答案 0 :(得分:1)
不幸的是,我无法让Paul的方法工作,但我有一个工作的音频信号FM合成解决方案。我在Excel中做了很多测试,并意识到如何做到这一点。这是算法
for (i = 0; i < N; i++) {
// increase the frequency with increasing amlitudes (fc + fm)
if (input[i] < input[i+1])
out[i] = cos(acos(input[i]) + A * sin(2 * pi * mf * i));
else //decrease the frequency with decreasing amplitudes (fc - fm)
out[i] = cos(acos(input[i]) - A * sin(2 * pi * mf * i));
}
它运行良好但它确实会产生一些不良谐波(可能是由于舍入误差),因此您可能必须使用某种滤波器(移动平均线可能在减少这些不需要的谐波方面做得很好)。当应用于音频信号时,您可能需要取出音频包络并将其与调制信号相乘,以免在音频的安静部分应用FM等。
答案 1 :(得分:0)
您可以将FM视为动态改变播放速率,其中播放速率的变化与您的调制信号成比例。因此,对于正常播放,您的播放速率与采样率Fs
相同。对于音频信号的FM版本,您的播放速率为Fs * (1 + A * f(t))
,其中A
是调制幅度,f(t)
是调制信号。要实现这一点,您需要使用实部和小数分量维护相位累加器,然后根据当前(调制)采样率更新相位累加器。使用相位累加器的整数部分来确定样本索引n
并使用小数部分使您能够进行插值,例如,样本n
和n + 1
之间。
这与wavetable synthesis非常相似,除了您的波形表是采样声音而不是周期性波形。参见例如this question on dsp.stackexchange.com了解更多信息。
答案 2 :(得分:0)
只需用输入信号的f(t)替换载波方程cos(t),其中t可以通过采样数据的采样率进行缩放。然后像以前一样调制dt。
请注意,对于采样数据并根据输入信号的带宽,要使此f(t)声音“良好”,您可能需要使用更高阶插值方法和低通滤波器(例如窗口化Sinc卷积),而不是仅仅使用最近的样本或两个样本之间的线性插值,这可能在频域中变得非常差。