相位调制合成中的裂纹来源

Source of crackle in phase modulation synthesis

我正在尝试制作一个基于波表和 DDS 的简单相位调制合成器。我有一个包含 4096 个正弦波样本的 12 位波表,我正在使用一个 32 位相位累加器。

实现我的想法是可行的,但它似乎有很多与调制相位调制深度相关的低电平裂纹。我正在这样生成样本:

Modulator = Modulation*SineWavetable[PhaseAc2>>20];
Sample = SineWavetable[(PhaseAc1 + Modulator)>>20];

我认为可以通过稍微调整 "Modulation" 参数来产生裂纹 hard/fast 但这似乎不是问题的原因。谁能告诉我这种相位调制方法的潜在问题?

一如既往,谢谢!

事实证明,类型转换在这里非常重要!我试图将 int32_t(调制器)与 uint32_t(PhaseAc1)混合,这会导致奇怪的溢出问题,相位会暂时出现故障,从而导致声音问题。相位累加器是在数组索引部分之外计算的,并在单个变量处移动,如下所示:

Modulator = Modulation*SineWavetable[PhaseAc2>>20];
PhaseAc1 += (int32_t)Modulator;
Sample = SineWavetable[(PhaseAc1 + Modulator)>>20];