位相アキュムレータのコードを見ていますが、理解できないので単純な人に違いありません。コードは非常に単純です。
すべてのクロック ティックは次のことを行います。 accum = accum + NCO_param; 累積を返します。
accum は 32 ビットのレジスタです。明らかに、ある時点でそれはロールオーバーします。
私の質問は本当に次のとおりです。これはフェーズにどのように関係していますか?
位相アキュムレータのコードを見ていますが、理解できないので単純な人に違いありません。コードは非常に単純です。
すべてのクロック ティックは次のことを行います。 accum = accum + NCO_param; 累積を返します。
accum は 32 ビットのレジスタです。明らかに、ある時点でそれはロールオーバーします。
私の質問は本当に次のとおりです。これはフェーズにどのように関係していますか?
この記事が役立つかもしれません。
実行中のステップでは、カウンタ (正確には位相アキュムレータと呼ばれます) は、周波数基準からパルスごとに特定の増分だけ進むように指示されます。位相アキュムレータ (位相) の出力は、データ テーブル内の各項目を順番に選択するために使用されます。最後に、DAC はこの一連のデータをアナログ波形に変換します。
実行中のステップでは、カウンタ (正確には位相アキュムレータと呼ばれます) は、周波数基準からパルスごとに特定の増分だけ進むように指示されます。位相アキュムレータ (位相) の出力は、データ テーブル内の各項目を順番に選択するために使用されます。最後に、DAC はこの一連のデータをアナログ波形に変換します。周期的な波形を生成するには、テーブルを 1 回通過するのに波形の周期と同じ時間がかかるように回路を設定します。たとえば、基準周波数が 1 MHz で、テーブルに 1000 エントリが含まれている場合、位相増分 1 でテーブルを完全に通過するには 1000 / 1 MHz = 1 ms かかるため、出力波形の周波数は次のようになります。 1/(1 ミリ秒) = 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(note) 周期で 0-1 から実行されます。