0

ウェーブテーブルと DDS に基づいた単純な位相変調シンセサイザーを作成しようとしています。正弦波の 4096 サンプルを含む 12 ビット ウェーブテーブルがあり、32 ビット フェーズ アキュムレータを使用しています。

私のアイデアの実装は機能しますが、位相変調の深さの変調に関連する低レベルのクラックルがたくさんあるようです. 私は次のようにサンプルを生成しています:

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

「Modulation」パラメーターを少しハード/ファストにモジュレートすることでクラックルが発生するのではないかと考えましたが、これが問題の原因ではないようです。この位相変調方法の潜在的な問題について教えてもらえますか?

いつものように、ありがとう!

4

1 に答える 1

0

結局のところ、タイプキャスティングはここでは非常に重要です! int32_t (Modulator) と uint32_t (PhaseAc1) を混ぜようとしたところ、奇妙なオーバーフローの問題が発生し、位相が瞬間的にグリッチして、可聴の問題が発生しました。位相アキュムレータは、配列インデックス セクションの外で計算され、次のように単一の変数でシフトされました。

Modulator = Modulation*SineWavetable[PhaseAc2>>20];
PhaseAc1 += (int32_t)Modulator;
Sample = SineWavetable[(PhaseAc1 + Modulator)>>20];
于 2015-08-21T20:31:54.710 に答える