DACには、必ずある程度の高調波歪みが発生します。この歪みは、数値計算した理想的なサイン波のサンプリング・データによりDAC入力を駆動したときに、DAC出力でどれだけ完全なサイン波が生成されるかで測定されます。出力スペクトルには、DACの理想的な動作を妨げる過渡的/静的挙動に起因する高調波成分が含まれます。DACの過渡出力特性には、スルーレートの限界、非対称的な立ち上がり時間と立ち下がり時間、ゼロではないセトリング時間などがあります。静的特性は、伝達関数が理想直線に対してどれだけ偏差しているかに関わっています。この記事は、静的挙動を取り上げ、出力スペクトルで観察された高調波成分からDAC伝達関数を導出する方法を紹介します。この解析では、観察対象となる高調波歪みの主な原因は過渡出力特性ではなく伝達関数であることを前提としています。この前提は多くの場合、低周波数において成立します。
DACの伝達関数
図1は、理想的なDAC伝達関数を対角線y=mx+bとして示しています。x軸はデジタル入力、y軸はアナログ出力です。

x軸上の対象範囲は、左側の最小コード(A)から右側の最大コード(B)までです。y軸上の対象範囲は、一番下の最小出力値(C)からほぼ一番上の最大出力値(D)までです。理想伝達関数の傾き(m)とy切片(b)を定義する式は、境界値A、B、C、Dを使って表されています。図中の信号g(t)は、AからBの範囲内のデジタル・データで表現される歪みのないサイン波入力信号で、下に向かって進む時間軸に沿って表されています。信号u(t)は、CからDの範囲の値をとるアナログ出力で、右に向かって進む時間軸に沿って表されています。
出力信号は、DACの伝達関数を介して入力信号を反映しています。ここで、出力信号はg(t)上の各点を対応するu(t)上の各点に関連させたものになっています。図1は、ある瞬間t=tkの入力、点g(tk)で表された信号の変換の一例です。伝達関数によって、このg(tk)は出力信号上の対応する点u(tk)に対応します。理想的なリニア伝達関数では、u(t)はg(t)のスケールを変更したものになります。g(tk)はx軸上の点xkに対応していますが、これは伝達関数を介してy軸上の点ykに対応します。いくつかの既知の点の集合(g(tn), u(tn))があれば、伝達関数上の対応する点(xn, yn)を特定することができます。このように、入力信号g(t)上の点と出力信号u(t)上の点の関係から伝達関数が完全に規定されます。
NビットDACの場合、入力の境界値AとBは特定の値、すなわちA=0、B=2N–1になります。一方、出力の境界値CとDは、便宜上C=A、D=Bと定義します。この定義は実際のDAC出力信号のオフセットとスケールを意味し、ピークtoピーク範囲は0~2N–1になります。A、B、C、Dをこのような値にすると、傾きがm=1、切片がb=0となるため、理想伝達関数をy=xという単純な式にすることができます。
以上は理想的なDAC伝達関数に関する話でしたが、ここまで来れば、図2に示す歪みのあるDAC伝達関数f(x)を処理する道具がそろっています。重要なことは、伝達関数がここでは直線(y=x)ではなく変形した関数f(x)になっているという点です。図では、これを特に滑らかな曲線として描いています。また、もう1つ重要なことは、出力関数u(t)に対するf(x)の影響です。理想的な入力g(t)は、伝達関数f(x)を介して歪みのある出力u(t)になります。図中の伝達関数は、市販のDACの伝達関数に比べるとかなり誇張されています。また単一の素直な曲線になっているのは、図をわかりやすくするためです。今日の新しいDACの伝達関数は理想的な直線からほとんどずれていませんが、ほんのわずかなずれでも出力スペクトルに高調波スプリアスを出現させます。

DAC伝達関数の再構築がうまくできるかどうかは、既知のg(t)とu(t)から各点(xk,f(xk))を決められるかどうかにかかっています。この手順には2つのステップがあります。まず、理想的なサンプリングをされたサイン波を表す数値データでDAC入力を駆動し、スペクトル・アナライザでDAC出力を測定し、基本波信号と可能な限り多くの高調波の振幅を記録します。次に、測定した高調波の振幅を特定の形状をもった伝達関数に変換します。正しく処理すれば、g(t)にf(x)を適用して作ったu(t)のシミュレーションから測定どおりの高調波歪み値が得られます。
ステップI: DAC高調波の測定
最初のステップでは、等間隔の時間でサンプリングした完全なサイン波の1サイクルを表す入力データのシーケンスが必要です。目標はDAC伝達関数を再構築することであるため、入力信号は0~2N–1の範囲内にある全DACコードを最低一回以上を含んでいなければなりません。等間隔のサンプルで全てのDACコードを実行するには、入力シーケンスには2Nを上回るサンプルが必要ですが、実際には、少なくとも2N+3のサンプルがあれば全コードが必ずヒットします。次の式で、2KのDACコードの完全なサイン波シーケンスを得ることができます(K≧N+3)。関数round{x}は、xの四捨五入を意味します。
![]() |
ここで、 n=0,1,2,3, ... 2K–1 |
この式は、DACがデジタル入力ワードを0から2N–1までの符号なしの整数としてストレート・バイナリ形式でデコードするものと仮定しています。オフセット・バイナリDACまたは2の補数DACの場合、gnが負の値になるように調整する必要があります。
数値データのシーケンス(gn)はサンプル・レート(fS)で繰り返しDACに送信されるため、DAC出力スペクトルには周波数fO=fs/2Kの基本信号が含まれます。高調波は2fO、3fO、4fOなど、fOの整数倍で発生します。これらの高調波の振幅は、DAC出力スペクトルのサンプリングの性質上、sin(x)/x応答の影響を受けます。しかし、fOはfsの数分の1と小さい値であるため、この周波数ではsin(x)/x応答はほぼ平坦と考えることができ、その影響を無視することができます。8ビットDACで、たとえばK ≥ 11とすると、f0 ≤ fs/2048になり、sin(x)/xによる減衰は、100次高調波まで0.39%(0.034dB)程度になります。
伝達関数f(x)を正確に再構築するには、高調波次数(h)の集合に基づいて可能な限り多くの高調波の振幅を反映する必要があります。これらの整数値はh=1(基本周波数)で始まり、h=Hで終わります。この場合のHは、測定振幅の最大高調波次数を示しています。たとえば、測定が10次高調波まで行われる場合は、H=10であり、高調波次数の集合はh={1, 2, 3, .. 10}になります。
次に、測定された各高調波の振幅(M)を高調波次数に対応させます。たとえば、M1は1次高調波(基本周波数)の振幅、M2は2次高調波の振幅であり、以下同様にMHまで対応させることができます。高調波の振幅は、一般に基本周波数の振幅を基準にデシベル単位(dBc)で測定されます。次式によりdBcをリニアの単位に変換します。

ここで、Dは高調波振幅のdBc単位の測定値です。たとえば3次高調波の振幅が-40dBcの場合、リニアな振幅ではM3=10–40/20、すなわち0.01になります。定義により基本周波数は0dBcであるため、M1はつねに1になります。
ステップII: DAC伝達関数の再構築
手順の2番目のステップでは、測定した高調波を伝達関数に織り込みます。f(x)上の点は対応するg(t)上の点とu(t)上の点の関係に依存するため、周波数領域の高調波振幅をまず時間領域の値に変換する必要があります。ちなみに、g(t)のサイン波形状に関連する時間領域の点と1対1で対応するDACコードでg(t)は構成されています。このように、g(t)を構成するDACコードは時間領域と関連しています。また、u(t)はf(x)を介してg(t)に関連するとともに、そのg(t)は時間領域関数であるため、u(t)も時間領域関数として表さなければなりません。こうすることで、g(t)の各時間点がそれに対応するu(t)の時間点に関連付けられますが、さもないとg(t)とu(t)からf(x)を求めることはできません。
f(x)は、g(t)の可能な各DACコード(0~2N–1)に対して一意に関連付ける必要があることから、高調波の振幅を時間領域の表現に変換するのはかなり厄介です。g(t)は完全なサイン波であるため、一意性を保証するには、図3に色で示した部分にあるようにサイン波が単調に増加する部分に範囲を制限するしかありません。このように範囲を制限しないと、f(x)上の1点をg(t)上の2つの点にマッピングンすることになり、一意性が失われてしまいます。
このような多義性をはっきりさせるために、領域Tを下に向かってスライドするとどうなるか考えてみましょう。この場合、f(x)上の点(xk, f(xk))がg(t)上の2点に関連付けられますが、これではいけません。Tの範囲を図のように制限することで、多義性がなくなります。g(t)はサイン波であるため、Tの所望の範囲は、3π/2ラジアンの初期位相オフセットを加えて½サイクルに対応します。

g(t)にTの範囲があるということは、u(t)にも同じような範囲があることを意味します。したがって、記録された高調波の振幅を時間領域に変換する場合は、図4に示すように、u(t)の制限範囲をg(t)と同じT領域に限定する必要があります。

f(x)にはg(t)とu(t)の振幅を変換する働きしかないため、実際の時間領域Tは関係ありません。解析を簡素化するために、基本周波数(fO)は1に正規化しましょう。これで2次高調波の周波数は2、3次高調波の周波数は3、などになります。つまり、高調波の周波数は高調波の次数(h)と同じになります(fh=h)。このような便宜的な関係によって、高調波測定値Mhからu(t)を作成するための計算が簡単になります。
サイン波は、一般的な時間領域では次式で表すことができます。
![]() |
ここで、βはピーク振幅、θは位相オフセットです。 |
各高調波を時間領域で表したuh(t)を得るには、fにh、βにMhを代入します。前述したように、g(t)は3π/2ラジアンだけオフセットされます。また、f(x)によってg(t)とu(t)が関連付けられているということは、g(t)とu(t)の位相を一致させることができます。θに3π/2を代入すれば、位相が合います。次の式では、0≦t<1であり、2πの代わりにπとして、時間間隔Tが示すように基本周波数を半サイクルに制限しています。

時間領域の各高調波uh(t)がわかれば、合成出力u(t)を基本周波数と高調波信号の和として再構築することができます。

ところで、目標はg(t)とu(t)を関連付けてDAC伝達関数を再構築することです。また、g(t)は、f(x)上の点と1対1の対応を維持するために2Nのサンプルで構成されていなければなりません。そこで、次のようにg(t)のサンプルを計算します。
![]() |
(n=0,1,2,3 .. 2N–1) |
g(t)は2Nのサンプルで構成されるため、2Nサンプルから成るu(t)サンプル集合からf(x)を再構築するのが妥当であるように思われます。しかし、小さい値のMhも反映した精度を得るには、少なくとも2N+3のサンプルが必要です。この点に留意して、次のようにu(t)の各サンプルを計算します。
![]() |
(n=0,1,2,3 .. 2N+3–1) |
この結果、u(t)に含まれるサンプルはg(t)より多くなります。そのため、f(x)とg(t)上の1つの点にu(t)の複数のサンプル点が対応することになり、f(x)についてu(t)とg(t)を1対1にマッピングするのが難しくなります。f(x)に対し適切なマッピングを行うには、特定のサンプル・グループの平均を求める必要があります。次の疑似コードは、NビットのDAC、2N点のg(t)、2N+3点のu(t)と仮定した場合の必要なマッピングを示しています。配列DacXfrは2Nの要素で構成されており、初期値はゼロです。このコードを実行すると、DacXfrの配列要素に正規化されたDAC伝達関数が入ります。
n = 0
FOR i = 0 TO 2N–1
AvgCnt = 0
WHILE i = g[n]
AvgCnt = AvgCnt + 1
DacXfr[i] = DacXfr[i] + u[n]
n = n + 1
IF n >= 2N+3
EXIT WHILE
END IF
END WHILE
IF AvgCnt = 0
EXIT (fail because array, g[ ], is missing a DAC code)
END IF
DacXfr[i] = (DacXfr[i]/AvgCnt)/2N
END FOR
実証
この記事で紹介した方法を実証するために、スペクトル・アナライザを使って、完全なサイン波を表す入力シーケンスで駆動した14ビットDACの出力を測定しました。最初の14の高調波(次数:2~15、単位:dBc)の振幅を記録し、その振幅値を用いてDACの伝達関数f(x)を再構築しました。次に、理想的なサイン波入力シーケンスg(t)に再構築したDAC伝達関数f(x)を適用して、シミュレーションにより出力シーケンスu(t)を生成しました。また、FFTによりu(t)を対応する周波数領域のU(ω)に変換しました。さらに、高調波の振幅をU(ω)から抽出して、それをスペクトル・アナライザの振幅測定値と比較しました。これを表1に示します。最大誤差は7次高調波に関連していましたが、わずか0.065dBでした。
表 1Harmonic Number | Measured Magnitude (dBc) | Simulated magnitude (dBc) | Deviation (dB) |
1 | 0.00 | 0.00 | 0.000 |
2 | -75.1 | -75.100 | 0.000 |
3 | -74.5 | -74.502 | -0.002 |
4 | -90.5 | -90.501 | -0.001 |
5 | -86.5 | -86.498 | 0.002 |
6 | -92.0 | -91.999 | 0.001 |
7 | -95.5 | -95.565 | -0.065 |
8 | -93.8 | -93.801 | -0.001 |
9 | -97.2 | -97.187 | 0.013 |
10 | -89.6 | -89.599 | 0.001 |
11 | -94.2 | -94.204 | -0.004 |
12 | -98.8 | -98.802 | -0.002 |
13 | -95.6 | -95.649 | -0.049 |
14 | -99.3 | -99.298 | 0.002 |
15 | -91.1 | -91.080 | 0.020 |
縮尺のために、再構築した伝達関数は直線(y=x)のようにみえます。しかし実際には、表1に示すように伝達関数がy=xからずれているため、高調波成分が生じています。図5のように、伝達関数の理想直線からの偏差のみをプロットしておけば、何かと便利です。縦軸の単位はLSBです。
