DSP / FPGA位相アキュムレータはどのように機能しますか?
-
03-07-2019 - |
質問
私は位相アキュムレータのコードを見ていますが、手に入らないので単純な人でなければなりません。 コードは非常に簡単です:
Every Clock Tick do: accum = accum + NCO_param; return accum;
accumは32ビットのレジスタです。明らかに、ある時点でロールオーバーします。
私の質問は、これはどのようにフェーズに関係するのですか?
解決
この記事が役立つ場合があります。
実行中のステップでは、カウンタ(適切には位相アキュムレータと呼ばれます)は、周波数基準からの各パルスで特定の増分だけ進むように指示されます。位相アキュムレータの出力(位相)は、データテーブル内の各アイテムを順番に選択するために使用されます。最後に、DACはこのデータシーケンスをアナログ波形に変換します。
実行中のステップでは、カウンター (適切にフェーズと呼ばれます アキュムレータ)進むように指示されます 各パルスで一定の増分で 周波数基準から。の 位相アキュムレータの出力( フェーズ)で各アイテムを選択するために使用されます データテーブルを順番に。最後に、 DACはこのデータシーケンスを アナログ波形。 周期的な波形を生成するには、 回路は1つのパスが テーブルを介して等しい時間がかかります 波形の周期に。にとって たとえば、基準周波数が 1 MHz、およびテーブルには1000 エントリ、完全なパススルー 位相増分が1のテーブル 1000/1 MHz = 1ミリ秒かかるため、 出力波形の周波数は 1 /(1 ms)= 1 kHzである。
このシステムは、より高い 単純に増加させることにより、出力周波数 位相増分 カウンターはテーブルをさらに実行します 早く。上記の例では、 位相増分は1に等しいため、 次の可能な周波数は 増分を2に設定すると、結果 出力周波数が2倍になります。に 周波数をより細かく制御する これよりも、標準フェーズ 増分は、たとえば10に設定できます。 その後、わずかに高くまたは低くすることができます 出力周波数。例えば、 増分を11に増やすと 出力周波数を10%増やし、 9に減らすと減少します 同じによる出力周波数 割合。より正確に 周波数にわたって必要な、より カウンタにはビットが必要です。
他のヒント
自分の質問に答えると、別の興味深い記事オンライン周波数合成用の位相アキュムレータ。
位相アキュムレータの仕組みについての私の理解は次のとおりです。
アキュムレータレジスタは実際には360度を表します。したがって、値0は0度を表し、値2 ^ 32は360度を表します。
位相アキュムレータは、クロックティックごとに値(M)を追加します。これは、円の周りを(M / 2 ^ 32)度だけ移動する角度を表します。レジスタがオーバーフローすると、360度全体を循環して最初からやり直します。
式は次のとおりです:
x(0-2Pi)ではなく、waveform(x)period = x(0-1)の周期を持つオシレーターを使用した例
acc / accumulatorと呼ばれるオーディオストリームごとに1つの変数、
サンプルごとに、accaddで蓄積します:
var accadd = 1.0/( sampleRate / p2freq( note ) ) ;
acc+= accadd;
acc = acc%1.0;// not sure to do this as accurately using if statement. can reset acc every noteOn
2pi周期の古典的なSinを使用している場合、1.0ではなく2piを使用してください
波形が1秒あたりp2freq(注)周期で0から1に実行されるように。