相位调制合成中的裂纹来源
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];
我正在尝试制作一个基于波表和 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];