AN-1396: ダイレクト・デジタル・シンセサイザ(DDS)の出力スペクトルにおける1 次位相切り捨てスプリアスの周波数および振幅予測方法
はじめに
最近のダイレクト・デジタル・シンセサイザ(DDS)は、通常、アキュムレータ出力に周期的なN ビット・デジタル・ランプを生成するために、アキュムレータとデジタル周波数チューニング・ワード(FTW)を採用しています(図1 参照)。このデジタル・ランプは、式1 に従ってDDS の出力周波数(fO)を決定します。ここで、fSは DDS のサンプル・レート(システム・クロック周波数)です。

所定の DDS に対し、FTW を構成するビット数(N)は、FTWの最下位ビット(LSB)の値だけが変化した時に生じ得るfOの最小変化量を決定します。つまり、FTW における1 LSB の変化は、DDS のチューニング分解能を決定します。例えばN = 32 のDDS は、N = 24 のDDS よりも細かいチューニング分解能を備えています。DDS の非常に細かいチューニング能力の実例を示すためにAD9912 の場合を考えます。このデバイスはN = 48 で、248分の 1(281,474,976,710,656 分の 1)のチューニング分解能を備えています。実際、fS = 1 GHz の場合のAD9912 の周波数チューニング分解能は、約3.6 μHz(0.0000036 Hz)です。
N ビットのFTW を使用するDDS の場合、図1 をよく見ると、アキュムレータ出力におけるビット数(N)と、角度/振幅変換ブロックへの入力におけるビット数(P)の間に、明らかな相違があることが分かります。つまり、P はN 以下の値です。この相違が、DDS 出力スペクトルに位相切り捨てスプリアスを発生させます。
位相切り捨てスプリアスを予測するには、使用するDDS の P の値を知ることが不可欠です。このアプリケーション・ノートでは、特定の位相切り捨てスプリアス、特に、与えられたFTW に対する1 次位相切り捨て(PPT)スプリアスの周波数と振幅を計算する方法を説明します。
位相切り捨て
アキュムレータとFTWは DDS の周波数制御要素を形成します。しかし周波数制御要素に加えて、DDS には、N ビットのアキュムレータ出力を位相値から振幅値に変換する角度/振幅変換ブロックも含まれています。この角度/振幅変換ブロックは、DDS 内のデジタル回路のかなりの部分を占めます。したがって、N を大きくすることによってDDS のチューニング分解能を改善すると、角度/振幅変換ブロックに必要な回路の数が大幅に増えます。このため、位相情報を示すN 個のビットすべてを振幅に変換することは実用的ではありません。その代わり、図1 に示すように、実際のDDS では位相から振幅への変換にアキュムレータ・ビットの一部を使用します。具体的には最上位側のP 個のビット(MSB)です。このようなビットの切り捨てを行うことにより、位相/振幅変換に必要な回路の数が大幅に減ります。しかし、これには、DDS 出力にスペクトル・アーチファクト(具体的には位相切り捨てによるスプリアス)が生じる恐れがあるという代償が伴います。
位相切り捨てスプリアス
定義からすると、P = N で設計されたDDS では位相切り捨ては行われません。したがって、その出力スペクトルに位相切り捨てスプリアスは生じません。しかし実際のDDS では P < N であり、位相切り捨てが行われることを示しています。
位相切り捨てスプリアスには、1 次、2 次、3 次という 3 つのカテゴリがあります。これらのカテゴリは、DDS 内の位相/振幅コンバータとD/A コンバータ(DAC)をカスケード型に組み合わせた場合のスペクトル特性によって生じるものです。図2は、角度/振幅変換ブロック(P ビットの位相入力)と高調波歪みを伴う非理想DAC に対し、フーリエ変換を行うことによって生じるスペクトル線をグラフで表した図です。一般に、スペクトルは0 から 2P − 1 にインデックスされる2P 個の周波数で構成され、表1 に示すようにカテゴリ分類されます。
Index | Color | Frequency Category |
0 | Black | DC。 |
1 | Red | 基本周波数またはフーリエ周波数。 |
2P − 1 | Green | 1 次位相切り捨てスプリアス(基本周波数のナイキスト・イメージ)。 |
2 to H, 2P – H to 2P − 2 | Blue | 2 次位相切り捨てスプリアス。インデックスの最初のグループがDAC 高調波スプリアスを構成し、インデックスの2 つめのグループがそのイメージを構成。 |
H + 1 to 2P – H − 1 | Gray | 3 次位相切り捨てスプリアス。これらのスプリアスは、角度/振幅コンバータとDAC に関係する量子化スプリアス(およびそのイメージ)を構成。 |
1 次位相切り捨て(PPT)スプリアス
FTW の特定の値に応じて、DDS の出力スペクトルには、各次数(1 次、2 次、3 次)の位相切り捨てスプリアスが数多く発生する可能性があります。このアプリケーション・ノートでは、最大の1 次スプリアスであるPPT スプリアスに焦点を当てます。
DDS 出力は位相サンプルから波形を生成した結果得られるものなので(つまりアキュムレータ出力)、DDS の出力スプリアスはナイキスト・サンプリング理論に従います。出力スペクトルは2 つの同じスペクトルとして現われ、それぞれが、サンプリング周波数(fS)の1/2 の周波数範囲に及びます。これら2 つのスペクトルは、ナイキスト周波数(fS/2)に対して互いに対称です。つまり、PPT スプリアスは2 つのスプリアスとして現われます。1 つの PPT スプリアスは0 Hz と fS/2 の間に、もう1 つは fS/2と fS の間に現われます。
これら 2 つの PPT スプリアスが最大の1 次位相切り捨てスプリアスですが、これらのスプリアスが必ずしも全体で最も大きい位相切り捨てスプリアスというわけではありません。位相切り捨てスプリアスがDDS 出力スペクトル内に分布するというメカニズムのために、2 次位相切り捨てスプリアスの方がPPT スプリアスより振幅が大きくなることがあります。
2 次または3 次の位相切り捨てスプリアスの振幅を予測することはできません。2 次位相切り捨てスプリアスの振幅はDAC の高調波歪み特性に依存し、デバイスごとに異なります。3 次位相切り捨てスプリアスの振幅は量子化誤差に関係し、その特性は基本的にランダムです。
右端の非ゼロ・ビット
PPT スプリアスの振幅と周波数位置を計算するには、以下を知る必要があります。
- DDS のサンプル・レート(fS)
- 2 つの DDS パラメータ、N と P
- FTW の特定値
アプリケーションによってはN と P が固定されており、一般にfS は一定の値です。逆にFTW はあらゆる値を取ることができ、式1 に詳細を示すようにfOの値を制御します。FTW の値はDDS 出力スペクトル内におけるfOの位置だけでなく、位相切り捨てスプリアスの位置も制御します。実際、所定のFTW のDDS 出力スペクトルに関わる最も重要な特性は、2 進数で表す際の末尾側に付くゼロの個数です。末尾側ゼロの個数は、FTWの右端の非ゼロビットの位置を表す重要パラメータL を決定します。
FTW におけるビットL の位置は、FTW の特定値によって異なります(FTWの値は、式1 に示すように必要なDDS 出力周波数によって変わる点に注意してください)。所定のFTWにおけるビットL の位置は DDS 出力スペクトル内における位相切り捨てスプリアスの分布状態を決定するので、この依存関係は重要です。
所定の FTW についてL の値を求める方法を図3 に示します。まず、FTW を 2 進数に変換します。次に、MSB の開始インデックス値を1 にして、FTW ビットにインデックス値を割り当てます。図3 は 32 ビットFTW の例です。したがって、インデックスの範囲は1 ~ 32 です。L の値は、値が1 の最終ビットのインデックスです(MSB から LSB の方向へ読み出した値)。図3におけるFTWの値は0x0036e580(16 進数)なので、このプロトコルを使用すると、このFTW における L の値は 25 です。
どのFTW においてもL の値が最も重要です。第1 に、L は、DDS 出力スペクトルに位相切り捨てスプリアスが生じるかどうかを決定します。L ≤ P の場合は、位相切り捨てスプリアスは生じません。しかしL > P の場合は、PPT スプリアスを含む位相切り捨てスプリアスがDDS 出力スペクトルに生じます。第2に、L と P の値は、PPT スプリアスの振幅と周波数を決定します(L > P と仮定)。
PPT 振幅
2 つの PPT スプリアスの振幅は同じです(式2 参照)。特定のFTW の値と所定のDDS 設計に対するP の値が与えられれば、2つの PPT スプリアスの振幅は次式で得られます。

ここで、PPT 振幅の値の単位はdBc、つまり周波数fO におけるメインDDS 出力信号の振幅を基準としたデシベル値です。
式 2 における2 つの正弦関数の引数の単位はラジアンです。例えば、P = 19 の DDS と図3 の FTW が与えられた場合、式2 を使用したPPT スプリアスの振幅は−114.38789 dBc になります。
PPT 周波数
2 つの PPT 周波数を決定するには、複数のステップで構成されるプロセスが必要です。まず、K、つまり、L ビットに切り詰められたFTW の 10 進値を求めます。2 進数でFTW が与えられている時にK の値を求めるには、末尾部分の0 をすべて削除して、得られたL ビットの FTW をこれに相当する10 進数に変換します。例えば図3 の FTW では、K = 28,107 です(2 進数0000000000110110111001011 を 10 進数に変換した値)。
K を使い、式3 と式 4 によって2 つの PPT スプリアスのスペクトル・インデックスの位置(R1 と R2)を計算します。

例えば DDS が P = 19 で FTW が図3 のとおりだとすると、式3のカッコ内の値は14,736,134,709 で、式4 のカッコ内の値は928,378,285,515 です。これらの値に225 のモジュロ演算を行うと次の値が得られます。
R1 = 5,739,061
R2 = 27,815,371
R1 と R2 を使い、式5 と式 6 に従ってDDS 出力スペクトル内の2 つの PPT 周波数位置(fPPT1 と fPPT2)を決定します。

例えば、fS = 250 MHz、FTW が図3 に示すとおりで、R1 と R2が前の例で計算した値だとすると、2 つの PPT スプリアス周波数は以下のようになります。
fPPT1 = 42.759336531162261962890625 MHz
fPPT2 = 207.240663468837738037109375 MHz
結論
このアプリケーション・ノートでは、2 つの PPT スプリアス周波数とその振幅を予測するための比較的簡単な方法を説明していますが、式3 と式 4 では計算時に問題が生じる可能性があります。特に、カッコ内の数値は整数として定義されますが、非常に大きな値になり得ます。
これらの計算において大きな整数値がもたらす問題を示すために、N = 48、P = 19 であるAD9912 の場合を考えてみます。FTW を 0x400000000001(16 進数)とすると、これは70,368,744,177,665(10 進数)に相当します。この場合L = 48 なので、K は FTWと同じ値になります。
ここで、式4 のカッコ内の数値を考えます。2L – 2P + 1 の項の値は次のようになります。
248 – 219 + 1 = 281,474,976,186,369
したがって、式4 のカッコ内の値は次のようになります。
K × (2L – 2P + 1) =
70,368,744,177,665 × 281,474,976,186,369 =
19,807,040,591,672,948,094,687,248,385
この整数を 2 進数で表すには94 ビット必要です。このようなサイズの整数を正確に表すことのできる計算ソフトウェア・ツールはほとんどありません。例えば、64 ビット・マシン上で実行されるMATLAB は、K × (2L – 2P + 1) を浮動小数1.980704059167295 × 1028 として表します。これに相当する整数は19,807,040,591,672,950,000,000,000,000 です。この値は真の値と大きく異なるものであり、R2 として得られる結果は不正確な値となります。
実際、ほとんどのソフトウェア・ツールはこのように大きな整数を扱うことができませんが、それはコンピュータ内のプロセッサ・チップも同様です。例えば、64 ビットのプロセッサを使用するコンピュータで94 ビットの整数を扱うことはできません。R1 と R2 の値を計算するには、ほとんどのコンピュータの能力を超える非常に大きな整数計算が必要とされるので、この問題は非常に大きな懸念材料となります。
式 3 と式 4 のカッコ内の数値を正確に表すことに加えて、カッコ内の数値の2L のモジュラスを計算する必要もあります。上の例ではL = 48 で、これは48 ビットのモジュラスを意味します。ほとんどのコンピュータは、32 ビットを超えるモジュラス計算を行うことができません。
要するに、式3 と式 4 に伴う困難さは、ソフトウェア・ツールを使ってPPT スプリアス計算を行うにあたって細心の注意を払う必要があるという点です。カッコ内の数値は(切り捨てや丸め込みを行うことなく)整数として正しく計算しなければならず、また、モジュラス計算も精度を損なうことなく正しく行う必要があります。
ほとんどのソフトウェア・ツールやプロセッサは非常に大きな整数を直接扱うことができませんが、例外があります。例えば、Python というソフトウェア・ツールは、非常に大きな整数の計算をネイティブでサポートしています。MATLAB® は非常に大きな整数をネイティブで扱うことができませんが、これらの整数の計算をサポートする可変精度整数(Variable Precision Integer: VPI)ツールボックスを使用することができます。このツールボックスは、MathWorks のウェブサイトのMATLAB Centralというページから無料でダウンロードできます。