AN-953: プログラマブルなモジュラスを採用した ダイレクト・デジタル・シンセシス(DDS)
概要
プログラマブルなモジュラスの採用は、一般的なアキュムレータ採用のDDS アーキテクチャを変更したもので、DDS の使用を正確な理論周波数シンセシスを必要とするアプリケーション(例えば任意レートのアプリケーション)にまで拡大します。AD9913 は、アナログ・デバイセズによる最初のアキュムレータ採用DDS 製品であり、プログラマブル・モジュラス・アーキテクチャを採用しています。
一般的なアキュムレータ採用のDDS
一般的なアキュムレータ採用のDDS では、アキュムレータを用いて、デジタル入力チューニング・ワードをサンプル・クロックのレートで繰り返し加算しています(図1 参照)。この動作により、アキュムレータが最大値2C でロールオーバするまで直線的に増加するデジタル・ワードの時系列が、アキュムレータから出力されます。そのため、アキュムレータ出力は2C の固定モジュラスとなります。
図1. 一般的なアキュムレータ採用のDDS アーキテクチャ
一般に、アキュムレータ出力は、アキュムレータの直後に接続される角度/振幅変換ブロックのサイズと複雑さを軽減するために、(上位ビットのみを用いて)P ビットまで切り捨てられます。このため、角度/振幅コンバータ入力では、アキュムレータで発生されるデジタル・ワードの時系列が0~2P − 1 の範囲の値を持つP ビット・ワードになります。
角度/振幅コンバータは、P ビット・ワードを単位円の一周に対応させます。すなわち、0~2P のバイナリ値を、0~2π のラジアン角に直線的に対応させます。この対応(マッピング)を使うと、角度/振幅コンバータはP ビット・ワードをD ビットの振幅値(A)に効率良く変換することができます。
変換プロセスでは次の三角関数を使います。
x = sin(2πk/2P)
ここで、
P はアキュムレータから出力されるビット数。
k は与えられた任意の時間におけるこれらのビットのバイナリ値。
各k に対するA の値は、0~2D − 1 の範囲の整数値となるように、x の値をスケール処理、オフセット処理、丸め処理した値です。
この角度/振幅変換機能は、サイン変換とコサイン変換を同時処理するように容易に拡張できます。このため、両変換機能を提供するDDS は広範囲に採用されています。
角度/振幅コンバータの後段にはDビットDACが続きます。このDACは、角度/振幅コンバータから出力されるDビットのデジタル振幅値をアナログ・レベルに変換します。変換結果はDAC 出力で正弦波波形になり、その周波数はアキュムレータの平均ロールオーバ・レートにより決定されます。
次式は、一般的なアキュムレータ採用のDDS のDAC から出力される正弦波の周波数を表します。
ここで、
fOは合成された周波数。
fS はサンプリング周波数。
M/2C は、非整数のスケール・ファクタ(MとC は正の整数)。
通常、Mは2C − 1 より小さい値に制限されます。そうでない場合、DDS はナイキスト・イメージ周波数を合成します。値2C はアキュムレータのモジュラスであり、C はビット数で表したアキュムレータ幅です。整数M は、多くの場合、周波数チューニング・ワードと呼ばれます。定義によりM は整数であるため、fOは周波数の次の集合に制限されます。
したがって、DC からほぼ½fS までの周波数の集合は、fS/2C の等間隔で並びます。この間隔fS/2C は、DDS の周波数分解能と呼ばれます。fO の周波数の集合を調べると、DDS アキュムレータのモジュラス(2C)が、DDS の周波数分解能と発生可能な出力周波数の個数を決定することが分かります。例えば、32 ビットのアキュムレータを使うDDS の出力周波数の集合には、与えられたサンプル・レート(fS)に対して2,147,483,648(= 231)個の出力可能な周波数が含まれます。
一般的なアキュムレータ採用のDDS は、このように出力可能な周波数の大きな集合を持っていても、アキュムレータ・モジュラスが固定で、かつチューニング・ワード(M)が整数である必要があるため、いくつかの有用な周波数(例えば、正確なfS/10 など)を発生することができません。式1 を変形すると、出力周波数のサンプリング周波数に対する比は次の式を満たす必要があることが分かります。
ここで、出力周波数はサンプル・レートの整数分の1(例えば、fS/10)なので、fOはfO = fS/Q(Q は整数)と表せます。式3 のfOにfS/Q を代入すると、
Mについて解くと、M = 2C/Q となります。MとQ は整数である必要があるため、式4 を満たすQ の値は2K(K は整数)の形式で表される値だけになります。すなわち、M = 2C/2K = 2C − K(CとK は整数)となります。例を示すため、fO = fS/8、かつC = 32とすると、Q = 8 = 23 となり、M = 232 − 3 = 229 = 536,870,912(整数)となります。これに対して、fO = fS/10 の場合は、Q = 10 かつM = 232/10 = 429,496,729.6(非整数)となります。これは、一般的なDDS は正確には周波数fS/10 を発生できないことを意味します。一般的なDDS はfS/10 に非常に近い出力周波数を合成できますが(周波数分解能に基づきます)、fS/10 に正確に一致することはできません。大部分のケースでは非常に近い値を許容できますが、アプリケーションによっては(例えばネットワーク・クロック)、正確な周波数比が必要になります。
式4 の右辺の比はアキュムレータのモジュラス(2C)により決定されることが分かります。この値はアキュムレータ・サイズにより決定される固定の値です。アキュムレータの固定モジュラスが、利用可能な出力周波数の集合を制限しています。ただし、アキュムレータのモジュラスを調整可能にすると、2K の形式以外のQ の値も可能にすることができます。これが、プログラマブルなモジュラスDDS アーキテクチャの原理になります。
プログラマブルなモジュラスを採用したDDS
プログラマブルなモジュラスは、一般的なアキュムレータ採用のDDS アーキテクチャを変更したものです(図2 参照)。プログラマブルなモジュラス技術の根底をなす機能はアキュムレータのモジュラスを変更することですが、実際にこれを実現するときは複雑になります。この複雑さは以下の2 つが重なったものです。
図2. プログラマブル・モジュラスDDS アーキテクチャ
1 つ目の複雑さは、角度/振幅コンバータが、P ビットの全入力範囲(0~2P)をラジアン角0~2π に対応させることです。角度/振幅コンバータが効率良く動作できるのは、このようにして2 の累乗値を対応させることによります。アキュムレータ・モジュラスを2 の累乗値以外の値に任意に変更すると、角度/振幅コンバータから必要とされる対応条件を満たしません。この問題点を克服するため、プログラマブル・モジュラス・アーキテクチャでは2 次アキュムレータを用いて、1 次アキュムレータが変更されたモジュラスを持っているようにすると同時に、角度/振幅コンバータから必要とされる2 の累乗値の対応も維持させます。
2 つ目の複雑さは、スプリアス性能に関係するものです。アキュムレータのモジュラスの変更が正しく行われないと、スペクトル・アーティファクトを持ち込むことがあります。プログラマブルなモジュラスを実現するときは、スプリアス性能に対して悪影響を与えないように細心の注意が必要です。AD9913 のアーキテクチャは、そうした注意を払うことの重要性を示しており、その優れたスプリアス性能によって実証されています。
プログラマブル・モジュラスDDS アーキテクチャでは、式3 を次のように変形することができます。
ここで、M とN は整数であり、M < N です。実際には、ナイキスト・サンプリング要件に適合するために、M はN/2 より小さくなるよう制約する必要があります。
プログラマブル・モジュラスDDS の周波数比(式5)は、一般的なアキュムレータ採用のDDS の周波数比(式3)によく似ていることに注意してください。唯一の違いは、プログラマブル・モジュラスとするためにN を2 の累乗とする必要がなく、任意の整数にできる点です。実際には、ハードウェアの制約により、N の値の範囲に制限が設けられます。
AD9913 のプログラマブル・モジュラス機能を実行すると、分数M/Nが式6 によって表せるようになります。式6 の形式は、Xが整数部分を表しA/B が分数部分を表す、複合周波数チューニング・ワードであることに留意してください。X、A、B は、図2のモジュラス制御ロジックへの入力です。
ここで、X、A、B は、0~232 − 1 の任意の整数でプログラム可能な32 ビットの整数です。
この範囲でプログラム可能ですが、アーキテクチャにより、AとB に以下の制約が課されます。
B > 0
A < B
X、A、B が32 ビットの整数であることにより、N に制約が課されます。具体的には、N ≤ 232 の場合、N は0~232 の任意の整数になりえますが、N > 232 の場合、N の選択は表1 に従って制約されます。
N | 制約 | 備考 |
N ≤ 232 | 3 ≤ N ≤ 232 | N = 0 は無意味であり、N = 1 またはN = 2 は自明であることに留意してください。 |
N > 232 | N = K × 232 | K は整数で、2 ≤ K ≤ 232 – 1 です。これにより、N は232 の整数倍に制約され、上限は(232 − 1) × 232 です。 |
モジュラス・パラメータの計算:A、B、X
fO とfS の既知の値が与えられた後、fO/fS を用いて分数M/N を生成します。ただし、M とN は両方とも整数で表されます。次に、分数を既約にして、Nが表1 の2 つの制約を満たすことを確認します。N が表1 の制約を満たすことができない場合、所定のサンプル・レート(fS)から正確な出力周波数(fO)を合成することは不可能です。
M とN を整数で表し、式7 にまとめられているように、長除算を用いてX を求めます。つまり、M とN が与えられると、Y に正の値(または0)を与える最大の整数となるXを選択します。
ここで、
X は除算での商(整数)。
Y は余り(整数)。
式7 は、N を除数とし、M を被除数の一部とする長除算を構成しています。MとN は、分数M/N が既約にされた整数であり、分数fO/fS と等価であることに留意してください。長除算の最初のステップは、XN ≤ M232を満たす最大の整数としてXを選択することです。次に、X とN の積を被除数の下に置き、それを被除数から引くと、余りY が残ります。したがって、Y の値はM232 からXN を引くと得られます。
式7 は、分数Y/N が式6 のA/B と同じ数値を有するように、Yを整数として生成します。分数Y/N を既約にすると、整数A およびB が得られます。
興味深いことに、M がアキュムレータ出力シーケンスの周期を決定しています。すなわち、アキュムレータは、出力の1 シーケンスを完成させて最初の開始点に戻るまでに、M 回のオーバーフローを繰り返す必要があります。この出力シーケンスが無限に繰り返されます。
Yが0 の場合、Aは0 であり、プログラマブル・モジュラス機能は不要であることは注目に値します。すなわち、fO は、一般的なアキュムレータ採用のDDS を用いて、fS から直接合成できます。実際、Y = 0 の場合、AD9913 のプログラマブル・モジュラス機能を無効にするのが最善であり、それによって消費電力が低減されます。
プログラマブルなモジュラスの例
fS = 250MHz で、必要とされるfO の値が25MHz の場合について考えます。このシナリオにより、サンプル・レートの2 の累乗の約数ではない出力周波数、すなわちfO = (1/10)fS が合成されますが、これは一般的なアキュムレータ採用のDDS では不可能です。周波数比fO/fS から直接MとNが得られ、これらの値は分数(25,000,000/250,000,000)を既約にすることにより求められます。すなわち、
M/N = 25,000,000/250,000,000 = 1/10
したがって、M = 1 かつN = 10 であり、式7 を用いると、X とYは、X = 429,496,729、Y = 6 と計算されます。分数Y/N は6/10 であり、3/5 に約分されます。したがって、A = 3、B = 5 です。
これらの値をAD9913に設定すると、250MHzのサンプリング・クロックに対して正確に25MHz の出力周波数が生成されます。
一般的なアキュムレータ採用のDDS は、そのアキュムレータの容量に関係なく、fS = 250MHz の場合、正確に25MHz となる合成はできません。例えば、32 ビットのアキュムレータ採用のDDS がfS = 250MHz で実現できる25MHz に最も近い値は、25.000000023283064365386962890625MHz です。これは0.931ppbの誤差に相当します。例えば、ネットワーク・クロッキング・アプリケーションでは、分数周波数誤差に非常に敏感なため、上記の近い値は許容できない場合があります。
注意事項
大半の計算プログラム(例えば、Excel®、Mathcad®、MATLAB®)では、X、Y、A、およびB を計算する場合に数値誤差が発生することがあります。これらの誤差は、内部の丸め処理または切り捨て処理によって発生し、大きな整数で乗算または除算するときに生じます。しかし、Windows® XP オペレーティング・システムにデバイスとして付属している電卓は、これらの計算に十分な精度を提供し、前述の誤差は発生しません(少なくとも、AD9913 の設定に関する32 ビット値の計算の場合)。実際、AD9913 評価用ボードのソフトウェアの開発者は、数値精度の問題を事前に承知していたため、丸め誤差や切り捨て誤差を軽減することができました。
丸め処理と切り捨て処理の影響を明らかにするため、fO の目的の値を25MHz とし、fS を250MHz の代わりに249,999,999.5MHzとする場合をもう一度考えてみます。この周波数比fO/fS から、分数(25,000,000/249,999,999.5)を既約にすることにより、MとN が直接得られます。これにはまず、次のようにM とN に2 を掛けて、N の小数点をなくす必要があります。
M/N = 25,000,000/249,999,999.5 = 50,000,000/499,999,999
分数50,000,000/499,999,999 は約分できないため、M とN にはこれらの値を使用します。これにより、X = 429,496,730、Y =229,496,730 となります。したがって、Y/N =229,496,730/499,999,999 であり、これは約分できないため、A =229,496,730、B = 499,999,999 となります。これらの値から、fO =25MHz ちょうどになります。
Excel を使うと、X に対しては同じ値が得られますが、Y は229,496,736 と計算されます。最下位桁が正しい値の0 ではなく、6 になることに注意してください。したがって、Y/N =229,496,736/499,999,999 であり、これは約分できないため、A =229,496,736、B = 499,999,999 となります。これらの値から、fO =25.000000000000000698491930961609MHz が得られます。正確なfO/fS 比が必要となるアプリケーションでは、この小さな誤差を許容できない場合があります。
N が最大許容値(232 − 1) × 232 となる、更に極端な場合を考えてみます。この整数を表すには64 ビットが必要です。大半の計算プログラムでは、48 ビットを超える整数を表現できません。
X、Y、A、およびB の計算に用いられる計算エンジンに、非常に大きな整数を完全に表すのに十分な数値精度があることを確認してください。そうでない場合、計算に丸め誤差や切り捨て誤差が発生する可能性があり、結果は不正確なものになります。