ΔΣ変調の原理 — オーバーサンプリングとノイズシェーピング

手元のオーディオDACや、ひずみゲージ用の計装アンプに付いているADCのデータシートを開くと、「24ビット分解能」「ダイナミックレンジ120 dB」といった数字が並んでいます。一方でその中身を覗くと、比較器(コンパレータ)はたった1個、出力は $+1$ と $-1$ の2値しかありません。1ビットしか区別できない粗いスイッチを使って、どうして24ビット相当の細かさが出てくるのでしょうか。

この一見矛盾した芸当を可能にしているのがΔΣ変調(デルタシグマ変調、$\Delta\Sigma$ modulation)です。アイデアは驚くほど単純で、「粗く量子化して出た誤差を捨てずに覚えておき、次のサンプルで返す」というだけ。この帳簿づけを高速に繰り返すと、誤差は時間方向に均され、しかも周波数軸の上で信号帯域の外へ押し出されます。この「押し出し」がノイズシェーピングです。

ΔΣ変調を理解すると、身の回りの2つの世界が同時に見えるようになります。ひとつは高分解能計測です。ロードセル、熱電対、ひずみゲージ、pHメータのような低周波・高精度センサのフロントエンドは、ほぼ例外なくΔΣ ADCです。もうひとつはオーディオとクラス-Dアンプです。SACDのDSD信号は1ビットΔΣのビットストリームそのものですし、クラス-Dアンプの出力段はΔΣ変調器が吐いた2値パルスをそのままパワーMOSFETで再生しています。さらに最近では、無線受信機のRF帯ADCや、Σ-Δ型の位相同期回路(フラクショナルN PLL)の分周比制御にも同じ理屈が使われています。

本記事の内容

  • 量子化雑音とオーバーサンプリングの復習 — なぜ「速く取る」だけでは足りないのか
  • 積分器・量子化器・帰還からなるループを $z$ 領域で解き、$\mathrm{STF}=z^{-1}$、$\mathrm{NTF}=(1-z^{-1})^L$ を導出する
  • $|\mathrm{NTF}(e^{j\omega})| = |2\sin(\omega/2)|^L$ の導出と、帯域内雑音の積分によるSNR式
  • 1次で9 dB/oct、2次で15 dB/octという有名な結論をPythonシミュレーションで確認する
  • オーバーロード・不安定性・アイドルトーンという実務上の落とし穴と、その緩和策
  • $\mathrm{sinc}^K$ デシメーションフィルタで最終的な分解能を取り出す

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

$z$ 変換と伝達関数の考え方、それに「量子化するとステップ幅 $\Delta$ の誤差が出る」という事実を知っていれば、あとは本記事の中で組み立てていきます。

ΔΣ変調とは — 「誤差の帳簿」という直感

まず数式を離れて、ΔΣ変調が何をしているのかを言葉でつかんでおきましょう。全体像を1枚の絵にすると次のようになります。

ΔΣ変調器の概念模式図。差分器・積分器・1ビット量子化器・帰還DACの4要素からなるループと、信号がSTFで素通りし雑音だけNTFで高域へ追い出される様子

登場人物は4つしかありません。入力と出力のをとる引き算器($\Delta$)、その差を足し込む積分器($\Sigma$)、符号だけを見る粗い量子化器、そして出力を入口へ戻す帰還路です。図の下側にある帰還のループが「出しすぎた分を次のサンプルで清算する」帳簿の役割を担っており、これがあるおかげで2値の出力でも平均としては入力を正確に再現できます。図の副題にある $\mathrm{STF}$ と $\mathrm{NTF}$ が本記事の主役で、この4要素だけの回路が信号と雑音をまったく別の経路に振り分けることを、以降で式として導きます。

あなたが白い壁に、灰色(白と黒のちょうど中間)を塗りたいとします。ところが手元には白のペンキと黒のペンキしかありません。それでも遠目に灰色に見せる方法があります。白と黒を細かい市松模様に塗り分ければいいのです。もっと言えば、「白 25%・黒 75%」に塗り分ければ、遠目には濃い灰色に見えます。2値しか出せなくても、密度を変えれば中間の値を表現できる — これがΔΣ変調の第一の原理です。

ではその「密度」をどうやって決めるか。ここで帳簿の出番です。目標が $0.25$ なのに $+1$ を出してしまったら、$+0.75$ だけ払い過ぎたことになります。この払い過ぎを積分器に借金として貯めておき、次の判断のときにその借金を差し引いてから比べる。すると借金が溜まっている間は $-1$ を出し続け、借金が返済されるとまた $+1$ を出す。結果として出力の平均は自動的に $0.25$ に収束します。誤差を捨てずに次へ持ち越すフィードバックが、ΔΣ変調の第二の原理です。

名前の由来もここにあります。$\Delta$(デルタ)は入力と帰還出力のをとる引き算器、$\Sigma$(シグマ)はその差を足し込む積分器を指しています。つまり「差をとって、積分して、粗く判定して、出力を引き算器に戻す」というループ構造そのものが名前になっているわけです。

この2つの原理を実際に動かした結果が次の図です。

上段は白と黒の2値パターンで中間の灰色を表す様子、下段は積分器(帳簿)の残高が目標値のまわりで振動しながら出力を選ぶ様子

上段では、目標値を $-0.50, 0.00, +0.25, +0.75$ と変えたときの出力パターンを白黒の帯として描いています。白($+1$)の割合はそれぞれ 25.0%、50.0%、62.5%、87.5% となり、いずれも理論値 $(1+u)/2$ とぴったり一致します。右端の「遠目に見た濃さ」の四角がまさにその平均値で、2値しか出せない出力でも密度を変えるだけで連続的な灰色を作れていることが目で確認できます。下段は帳簿の中身で、$+1$ を出すたびに残高が下がり、下がりすぎると $-1$ が選ばれて残高が戻る、という往復運動が見えます。この振動の中心が目標の $0.25$ に張り付いているのが、平均が入力に一致する理由です。

大事なのは、この帳簿づけが単に「平均を合わせる」だけで終わらない点です。積分器が誤差を溜め込むという構造のせいで、残る誤差は周波数軸の上で高い方に偏ります。ゆっくり変化する成分(低周波の誤差)は積分器が敏感に検出して即座に打ち消してしまい、打ち消し損ねた分は素早くバタバタ暴れる高周波成分として残るからです。信号が低周波にあるなら、あとは高周波側をディジタルフィルタで削り落とせば、驚くほどきれいな信号が残ります。

ここまでが直感です。次は、この「高周波に押し出される」という現象を、$z$ 領域の伝達関数として正確に書き下していきます。その前に、比較対象となる「単なるオーバーサンプリング」がどこまで効くのかを確認しておきましょう。

準備1:量子化雑音とSQNR

ΔΣの効果を測るには物差しが要ります。その物差しが、量子化雑音で決まる信号対量子化雑音比(SQNR)です。

分解能 $N$ ビット、フルスケール幅 $V_{\mathrm{FS}}$ の一様量子化器を考えます。量子化ステップは

$$ \Delta = \frac{V_{\mathrm{FS}}}{2^N} $$

です。入力が十分に賑やかであれば、量子化誤差 $e$ は区間 $[-\Delta/2,\ \Delta/2]$ 上の一様分布で近似できます。この近似は「量子化雑音の白色近似」と呼ばれ、ΔΣの解析全体を支える土台になります。一様分布の分散は区間幅の2乗の12分の1なので、

$$ \sigma_e^2 = \frac{1}{\Delta}\int_{-\Delta/2}^{\Delta/2} e^2\, de = \frac{\Delta^2}{12} \tag{1} $$

となります。

一方、フルスケールいっぱいの正弦波 $A_{\mathrm{FS}}\sin(2\pi f_0 t)$ を入れたときの信号電力は、振幅が $A_{\mathrm{FS}} = V_{\mathrm{FS}}/2 = 2^N\Delta/2$ なので

$$ P_s = \frac{A_{\mathrm{FS}}^2}{2} = \frac{2^{2N}\Delta^2}{8} $$

です。両者の比をとります。$\Delta^2$ が約分で消えるところが気持ちのよいポイントです。

$$ \mathrm{SQNR} = \frac{P_s}{\sigma_e^2} = \frac{2^{2N}\Delta^2/8}{\Delta^2/12} = \frac{3}{2}\,2^{2N} $$

デシベルに直すと、$10\log_{10}(2^{2N}) = 20N\log_{10}2 = 6.02N$、$10\log_{10}(3/2) = 1.76$ なので、教科書でおなじみの式が出ます。

$$ \mathrm{SQNR}\ [\mathrm{dB}] = 6.02N + 1.76 \tag{2} $$

1ビット増やすごとに約6 dBという関係です。逆にこの式を分解能について解いた

$$ \mathrm{ENOB} = \frac{\mathrm{SNDR}\ [\mathrm{dB}] – 1.76}{6.02} \tag{3} $$

有効ビット数(ENOB, Effective Number Of Bits)で、これから何度も使います。実測したSNDR(信号対雑音歪み比)を「何ビット相当か」に翻訳する換算式だと思ってください。

式(1)〜(3)の土台になっている「量子化誤差=一様分布の白色雑音」という仮定を、3ビット量子化器の実例で確かめておきましょう。

左は3ビット量子化器の階段特性、中央は入力に対する量子化誤差のノコギリ波、右は誤差のヒストグラムが一様分布に一致する様子

左の階段は理想の直線から最大 $\pm\Delta/2$ だけずれており、そのずれを入力の関数として描いたのが中央のノコギリ波です。誤差は $\pm\Delta/2$ の帯にきれいに収まり、しかも各値をまんべんなく取っています。右のヒストグラムがちょうど高さ $1/\Delta$ の平らな箱になっているのがその証拠で、実測の分散 0.00521 は理論値 $\Delta^2/12 = 0.00521$ と一致しました。「誤差は $[-\Delta/2, \Delta/2]$ の一様分布」という仮定が数値で裏づけられたので、以降はこれを土台に議論を進められます。

ここで1ビット量子化器($N=1$)を式(2)に入れると $\mathrm{SQNR} = 7.78$ dB、ENOBはもちろん1ビットです。24ビットには程遠い。この絶望的な出発点から、どうやって120 dBまで持っていくのかを次から見ていきます。

準備2:オーバーサンプリングだけでどこまで行けるか

最初の一手は「速く取る」ことです。ここには、初学者がよく引っかかる、しかし本質的なポイントが隠れています。

式(1)の $\sigma_e^2 = \Delta^2/12$ はサンプリング周波数によらない、という点に注目してください。量子化誤差の大きさはステップ幅 $\Delta$ だけで決まるので、$f_s$ を10倍にしても総雑音電力は変わりません。ところがその雑音が広がる周波数の幅は10倍になります。同じ量のインクを10倍の面積に塗り広げるようなものです。

白色近似のもとで、量子化雑音の片側パワースペクトル密度は $[0,\ f_s/2]$ に一様に広がるので

$$ S_e(f) = \frac{\sigma_e^2}{f_s/2} = \frac{2\sigma_e^2}{f_s} $$

です。信号帯域が $[0,\ f_B]$ に限られているなら、後段のディジタルフィルタで $f_B$ 以上を全部捨てられます。生き残る帯域内雑音は

$$ P_{n,\mathrm{in}} = \int_0^{f_B} S_e(f)\, df = \sigma_e^2 \cdot \frac{2f_B}{f_s} = \frac{\sigma_e^2}{\mathrm{OSR}} \tag{4} $$

ここで

$$ \mathrm{OSR} = \frac{f_s}{2 f_B} $$

オーバーサンプリング比(OverSampling Ratio)と定義しました。ナイキストレートぎりぎりで取れば $\mathrm{OSR}=1$、その64倍で回せば $\mathrm{OSR}=64$ です。

式(4)より、SQNRは

$$ \mathrm{SQNR}\ [\mathrm{dB}] = 6.02N + 1.76 + 10\log_{10}\mathrm{OSR} \tag{5} $$

だけ改善します。OSRを2倍にすると $10\log_{10}2 = 3.01$ dBの利得。式(2)と見比べれば、6 dBで1ビットですから、オーバーサンプリングだけでは1ビット稼ぐのに4倍のサンプリング速度が必要という計算になります。

これは絶望的です。1ビット量子化器から16ビット相当(約98 dB)を得ようとすると、$(98-7.78)/3.01 = 30$ オクターブ、つまり $2^{30}\approx 10^9$ 倍のオーバーサンプリングが要ります。音声帯域 $f_B = 20$ kHz に対して $f_s$ が数十THzという、物理的にあり得ない話になってしまいます。

この事情を絵にすると、なぜオーバーサンプリングだけでは足りないのかが一目でわかります。

左は同じ総量の雑音がサンプリング周波数を上げるほど薄く広がる様子、右はオーバーサンプリングのみと1次・2次ノイズシェーピングのSNR成長率の比較

左のグラフでは、$f_s$ を4倍にするとスペクトル密度が $1/4$ に下がる一方で、雑音が広がる横幅は4倍になっています。長方形の総面積(=総雑音電力)は変わらず、塗りつぶした帯域内の面積だけが $1/4$ に減る、というのが式(4)の絵解きです。右のグラフはその成長率を対数軸で比べたもので、オーバーサンプリングのみの傾き 3.01 dB/oct では16ビット相当の98 dBに届くのに $10^9$ 倍という非現実的な速度が必要になります。一方でノイズシェーピングを入れると傾きそのものが3倍・5倍に立つため、現実的なOSRで目標に届くようになります。この傾きの差がどこから来るのかを、以降で導出します。

つまり、オーバーサンプリング「だけ」では話にならない。しかし諦めるのは早い。式(4)の積分をもう一度見てください。私たちは「$[0, f_B]$ の中にある雑音」だけを気にしています。だとすれば、雑音の総量は変えられなくても、その分布を $[0,f_B]$ の外に偏らせられれば勝ちなのです。この偏らせる操作こそがノイズシェーピングであり、ΔΣループの正体です。

ΔΣループの構造と線形化モデル

いよいよループの中身に入ります。1次ΔΣ変調器のブロック図は、次の4要素だけでできています。

  1. 入力 $u[n]$ から帰還出力 $y[n]$ を引く差分器($\Delta$)
  2. その差を足し込む積分器($\Sigma$)
  3. 積分器出力の符号を見る量子化器(1ビットなら単なる比較器)
  4. 量子化器出力を差分器に戻す帰還路(1ビットDAC)

時間領域で書けば、遅延型積分器を使ったときの漸化式は

$$ v[n] = v[n-1] + \bigl(u[n-1] – y[n-1]\bigr), \qquad y[n] = Q\bigl(v[n]\bigr) $$

です。ここで $Q(\cdot)$ は量子化器で、1ビットなら $Q(v) = \mathrm{sgn}(v)$、つまり $v \ge 0$ なら $+1$、そうでなければ $-1$ を返します。

さて、この $Q(\cdot)$ が厄介です。強い非線形要素なので、そのままでは伝達関数の言葉で扱えません。そこで使うのが線形化モデル(加法性白色雑音モデル)です。量子化器を「入力をそのまま通し、そこに独立な白色雑音 $e[n]$ を足す加算器」で置き換えてしまいます。

$$ y[n] = v[n] + e[n] $$

この置き換えは厳密には正しくありません。$e[n]$ は実際には $v[n]$ の決定論的な関数であり、独立でも白色でもないからです。特に1ビット量子化器では誤差が入力と強く相関します。それでも、入力が十分に賑やかで、ループが高速に切り替わっている限り、この近似は驚くほどよく実測と合います。本記事の後半で、実測とこのモデルの予測を突き合わせて、どのくらい合うのか(どこでズレるのか)を確かめます。

線形化さえしてしまえば、あとは $z$ 領域の代数です。遅延型積分器の伝達関数は

$$ I(z) = \frac{z^{-1}}{1 – z^{-1}} \tag{6} $$

です。分母の $1-z^{-1}$ が「1サンプル前の値に足し込む」という累積を、分子の $z^{-1}$ が「1サンプルの遅れ」を表しています。この積分器が、ΔΣの魔法のほぼ全部を担っています。

次のセクションで、この $I(z)$ をループに入れて解き、信号と雑音がまったく違う経路をたどることを示します。

1次ΔΣ変調器:STFとNTFの導出

ゴールをはっきりさせておきます。示したいのは、出力 $Y(z)$ が「入力の伝達関数 $\mathrm{STF}$」と「量子化雑音の伝達関数 $\mathrm{NTF}$」に分離して書けること、そして $\mathrm{NTF}$ が低域で0になることです。

線形化モデルのもとでループを立式します。積分器の入力は $U – Y$、出力が $V$ なので

$$ V(z) = I(z)\bigl(U(z) – Y(z)\bigr) $$

量子化器を加算器で置き換えて

$$ Y(z) = V(z) + E(z) = I(z)\bigl(U(z) – Y(z)\bigr) + E(z) $$

$Y$ を含む項を左辺に集めます。

$$ Y(z)\bigl(1 + I(z)\bigr) = I(z)\,U(z) + E(z) $$

したがって

$$ Y(z) = \underbrace{\frac{I(z)}{1+I(z)}}_{\mathrm{STF}(z)} U(z) + \underbrace{\frac{1}{1+I(z)}}_{\mathrm{NTF}(z)} E(z) \tag{7} $$

ここまでは一般の負帰還ループと同じ形です。面白くなるのは式(6)を代入してからです。まず分母を計算します。通分すると $z^{-1}$ が打ち消し合って、非常にきれいな形になります。

$$ 1 + I(z) = 1 + \frac{z^{-1}}{1-z^{-1}} = \frac{(1-z^{-1}) + z^{-1}}{1-z^{-1}} = \frac{1}{1-z^{-1}} $$

つまり $1+I(z)$ は $(1-z^{-1})$ の逆数そのものです。これを式(7)に入れると、$\mathrm{NTF}$ は逆数の逆数なので

$$ \mathrm{NTF}(z) = \frac{1}{1+I(z)} = 1 – z^{-1} \tag{8} $$

$\mathrm{STF}$ の方は、$I(z)$ に $1/(1+I(z)) = 1-z^{-1}$ を掛けるだけです。分母の $(1-z^{-1})$ が約分で消えます。

$$ \mathrm{STF}(z) = I(z)\cdot\bigl(1-z^{-1}\bigr) = \frac{z^{-1}}{1-z^{-1}}\cdot(1-z^{-1}) = z^{-1} \tag{9} $$

まとめると、1次ΔΣ変調器の出力は

$$ Y(z) = z^{-1} U(z) + (1-z^{-1}) E(z) $$

この式は、ΔΣ変調のすべてを1行で語っています。読み方は次の通りです。

  • 信号は1サンプル遅れるだけで、まったく歪まない。 $\mathrm{STF}=z^{-1}$ は振幅特性が全周波数で1、位相は線形。信号にとってループは「ただの遅延線」です。
  • 雑音には $1-z^{-1}$ という差分器が掛かる。 差分は「変化率」を取り出す操作なので、ゆっくり変化する成分(低周波)にはほとんど反応せず、速く変化する成分(高周波)を強調します。$z=1$($\omega=0$、直流)で $\mathrm{NTF}=0$ になる点が決定的です。

つまり同じループの中で、信号は素通りし、雑音だけがハイパスフィルタを通される。信号と雑音を周波数軸の上で仕分けする装置、それがΔΣ変調器です。この置き換えと分離のからくりを図にすると次のようになります。

上段は量子化器を「そのまま通してEを足す加算器」に置き換えた線形化ループ、下段は解いた結果がSTFの経路とNTFの経路に分離される様子

上段が線形化モデルで、非線形な比較器を「入力をそのまま通し、独立な白色雑音 $E$ を足すだけの加算器」に差し替えています。この置き換えのおかげでループが線形になり、ふつうの負帰還の公式で解けるようになりました。下段が解いた結果で、同じ1つの回路が、信号にとっては純遅延 $z^{-1}$、雑音にとっては差分器 $1-z^{-1}$ という、まったく別の顔を見せることがはっきりします。この2本の経路が独立に描けることこそ、ΔΣの設計論が「NTFをどう設計するか」に集約される理由です。

では、この仕分けをもっと強くできないでしょうか。差分を2回かければ、$z=1$ での零点が2重になり、低域の抑圧がさらに深くなるはずです。次はその高次化を見ていきます。

2次以上への拡張と二項係数

素朴に考えると、「積分器を2段直列にすればNTFは $(1-z^{-1})^2$ になる」と思いたくなります。ところが、そのまま繋いでもうまくいきません。実際に確かめてみましょう。

積分器2段、帰還は各段の入力に同じ係数1で入れるとします。

$$ V_1 = I(U – Y), \qquad V_2 = I(V_1 – Y), \qquad Y = V_2 + E $$

$V_1$ を $V_2$ の式に代入し、さらに $Y$ の式に代入して整理すると

$$ Y = I\bigl(I(U-Y) – Y\bigr) + E = I^2 U – I^2 Y – I Y + E $$

$Y$ を集めて

$$ Y\bigl(1 + I + I^2\bigr) = I^2 U + E $$

ここで $d = 1-z^{-1}$、$I = z^{-1}/d$ とおいて特性多項式を計算します。分母を $d^2$ に揃えると

$$ 1 + I + I^2 = \frac{d^2 + z^{-1}d + z^{-2}}{d^2} $$

分子を展開します。$d^2 = 1 – 2z^{-1} + z^{-2}$、$z^{-1}d = z^{-1} – z^{-2}$ なので、足し合わせると

$$ (1 – 2z^{-1} + z^{-2}) + (z^{-1} – z^{-2}) + z^{-2} = 1 – z^{-1} + z^{-2} $$

したがって $\mathrm{NTF} = d^2/(1 – z^{-1} + z^{-2})$ となり、$d^2 = (1-z^{-1})^2$ という狙いの零点は出るものの、余計な極が付いてしまいました。この極は単位円上($|z|=1$)にあるため、雑音伝達関数が特定周波数で共振してしまいます。

では、どうすれば極を全部原点に持っていける(=NTFを純粋なFIRにできる)でしょうか。答えは2段目の帰還係数を2にすることです。

$$ V_1 = I(U – Y), \qquad V_2 = I(V_1 – 2Y), \qquad Y = V_2 + E $$

同じ手順で整理すると、$Y$ の係数は $-I^2 – 2I$ になるので

$$ Y\bigl(1 + 2I + I^2\bigr) = I^2 U + E \quad\Longrightarrow\quad Y\,(1+I)^2 = I^2 U + E $$

左辺が完全平方 $(1+I)^2$ になりました。すでに $1+I = 1/(1-z^{-1})$ とわかっているので、$(1+I)^2 = 1/(1-z^{-1})^2$ です。よって

$$ \mathrm{NTF}(z) = \frac{1}{(1+I)^2} = \bigl(1 – z^{-1}\bigr)^2, \qquad \mathrm{STF}(z) = \frac{I^2}{(1+I)^2} = \left(\frac{z^{-1}}{1-z^{-1}}\right)^{\!2}\!\bigl(1-z^{-1}\bigr)^2 = z^{-2} \tag{10} $$

狙い通り、雑音には差分が2回、信号には2サンプルの遅延だけが掛かります。

同じ議論を $L$ 段に一般化しましょう。$k$ 段目の積分器への帰還係数を $a_k$ とすると、特性多項式は

$$ 1 + a_L I + a_{L-1} I^2 + \cdots + a_1 I^L $$

となります。これが $(1+I)^L$ に一致してほしいので、二項定理 $(1+I)^L = \sum_{m=0}^{L}\binom{L}{m}I^m$ と係数比較して

$$ a_k = \binom{L}{\,L-k+1\,} $$

を得ます。$L=2$ なら $(a_1,a_2) = (1,2)$、$L=3$ なら $(1,3,3)$、$L=4$ なら $(1,4,6,4)$。パスカルの三角形がそのまま帰還係数になるわけです。このとき

$$ \mathrm{STF}(z) = z^{-L}, \qquad \mathrm{NTF}(z) = \bigl(1-z^{-1}\bigr)^L \tag{11} $$

が成り立ちます。$z=1$ に $L$ 重の零点を置いた、という言い方をすることもあります。

帰還係数を変えると何が起きるのかを、$z$ 平面の零点・極配置で見比べてみましょう。

1次NTF、素朴な2段(帰還係数1,1)、正しい2次(帰還係数1,2)のz平面上の零点と極の配置の比較

3つとも $z=1$ に狙い通りの零点(青い丸)を持っています。違いは極(赤い×)の位置です。左の1次と右の2次は極が全て原点にあり、NTFが有限インパルス応答(FIR)になっています。ところが中央の素朴な2段では、極が単位円「上」の $z = e^{\pm j\pi/3}$ に居座ってしまっています。単位円上の極は減衰しない共振を意味するので、$f_s/6$ 付近で雑音伝達関数が暴れ、変調器としては使い物になりません。帰還係数を $1$ から $2$ に変えるという一見些細な操作が、極を単位円上から原点へ引きずり下ろしている、というのがこの図の要点です。

ここまでで構造の話は終わりです。次は、この $\mathrm{NTF}$ が周波数軸の上でどんな形をしているかを調べ、それを積分して具体的なSNRの式に落とし込みます。

NTFの周波数特性:|2 sin(ω/2)|^L

伝達関数の周波数特性は、$z = e^{j\omega}$($\omega = 2\pi f/f_s$ は正規化角周波数)を代入すれば得られます。式(11)の中身 $1-e^{-j\omega}$ を、オイラーの公式が使える形に変形するのがコツです。指数の半分 $e^{-j\omega/2}$ を括り出します。

$$ 1 – e^{-j\omega} = e^{-j\omega/2}\bigl(e^{j\omega/2} – e^{-j\omega/2}\bigr) $$

括弧の中は $2j\sin(\omega/2)$ そのものです($\sin\theta = (e^{j\theta}-e^{-j\theta})/2j$)。したがって

$$ 1 – e^{-j\omega} = 2j\,\sin\!\left(\frac{\omega}{2}\right) e^{-j\omega/2} $$

$|e^{-j\omega/2}| = 1$、$|2j| = 2$ なので絶対値をとると

$$ \bigl|\mathrm{NTF}(e^{j\omega})\bigr| = \left|2\sin\!\left(\frac{\omega}{2}\right)\right|^{L} \tag{12} $$

この式を $L=1,2,3$ について描いたのが次の図です。

左は対数軸で見たNTFの周波数特性(1次20 dB/dec、2次40 dB/dec、3次60 dB/decで落ちる)、右は線形軸で見た雑音が減る領域と増える領域の境目fs/6

左の対数軸では、低域での傾きが $L=1$ で 20 dB/dec、$L=2$ で 40 dB/dec、$L=3$ で 60 dB/dec と、次数に比例して急峻になっているのがわかります。信号帯域端 $f_B = f_s/128$ の縦線の位置で比べると、3次は1次より80 dB近く低い。右の線形軸は同じ曲線を別の角度から見たもので、$f/f_s = 1/6$ で3本すべてが利得1を横切り、そこを境に左では雑音が減り、右では増えるという構図がはっきり出ています。次数を上げるほど左側の谷は深くなりますが、同時に右側の山も $2^L$ 倍まで高くなる、という取引の全体像がこの1枚に収まっています。

この式は、覚えておく価値のある性質を3つ持っています。

性質1:直流で完全に0。 $\omega=0$ で $\sin 0 = 0$ なので $|\mathrm{NTF}|=0$。しかも $L$ 次の零点なので、$\omega \to 0$ での減衰は $\omega^L$、デシベルで言えば $20L$ dB/decade の急峻さで落ちます。低周波の量子化雑音は徹底的に潰されます。

性質2:ナイキストで最大 $2^L$。 $\omega = \pi$($f = f_s/2$)で $\sin(\pi/2)=1$ なので $|\mathrm{NTF}| = 2^L$。1次で2倍(+6 dB)、2次で4倍(+12 dB)、3次で8倍(+18 dB)。押し出した雑音は消えたわけではなく、高域で増幅されているのです。ここが後で安定性の問題として跳ね返ってきます。

性質3:利得1の境目は $f_s/6$。 $|2\sin(\omega/2)| = 1$ を解くと $\sin(\omega/2) = 1/2$、すなわち $\omega/2 = \pi/6$、$\omega = \pi/3$。周波数に直せば $f = f_s/6 \approx 0.167 f_s$ です。この周波数より低いところでは雑音が減り、高いところでは増える。次数 $L$ によらずこの境目は動きません($1^L=1$ だから)。したがってΔΣが得をするには、信号帯域が $f_s/6$ より十分低い、つまりOSRが3より十分大きいことが必須条件です。

性質2と3を合わせると、ΔΣ変調が「無から有を生む」わけではないことがはっきりします。雑音の総量はむしろ増えます($\int|\mathrm{NTF}|^2$ は1より大きい)。それでも、信号がいる狭い帯域から雑音を追い出し、誰も見ていない高域に山積みにするという取引が成立している。この取引レートを定量化するのが次の積分計算です。

帯域内雑音の積分とSNR式の導出

いよいよ本丸です。ゴールは、$L$ 次ノイズシェーピング+$N$ ビット量子化器+OSRのときのSNRを閉じた式で書くことです。

分散 $\sigma_e^2$ の離散時間白色雑音の両側パワースペクトル密度は、$\omega\in[-\pi,\pi]$ にわたって $\sigma_e^2/(2\pi)$ で一定です。これに $|\mathrm{NTF}|^2$ が掛かるので、帯域 $|\omega| < \omega_B$ に残る雑音電力は

$$ P_{n,\mathrm{in}} = 2\int_0^{\omega_B} \frac{\sigma_e^2}{2\pi}\bigl|\mathrm{NTF}(e^{j\omega})\bigr|^2 d\omega = \frac{\sigma_e^2}{\pi}\int_0^{\omega_B}\left|2\sin\frac{\omega}{2}\right|^{2L} d\omega $$

先頭の2は負の周波数の分です。この積分は閉じた形になりませんが、私たちが興味あるのは $\omega_B$ が小さい(OSRが大きい)領域なので、$\omega \ll 1$ で $2\sin(\omega/2) \approx \omega$ と近似します。すると被積分関数は単なるべき関数になり、積分が実行できます。

$$ P_{n,\mathrm{in}} \approx \frac{\sigma_e^2}{\pi}\int_0^{\omega_B}\omega^{2L}\, d\omega = \frac{\sigma_e^2}{\pi}\cdot\frac{\omega_B^{2L+1}}{2L+1} $$

ここで信号帯域端の正規化角周波数は $\omega_B = 2\pi f_B/f_s$ であり、OSRの定義 $\mathrm{OSR} = f_s/(2f_B)$ を使うと $\omega_B = \pi/\mathrm{OSR}$ です。これを代入すると、$\pi^{2L+1}$ が出て先頭の $1/\pi$ と1つ約分されます。

$$ P_{n,\mathrm{in}} \approx \frac{\sigma_e^2}{\pi}\cdot\frac{1}{2L+1}\cdot\frac{\pi^{2L+1}}{\mathrm{OSR}^{2L+1}} = \sigma_e^2\,\frac{\pi^{2L}}{(2L+1)\,\mathrm{OSR}^{2L+1}} \tag{13} $$

これがノイズシェーピング後の帯域内雑音です。$L=0$(シェーピングなし)を入れると $\sigma_e^2/\mathrm{OSR}$ となり、式(4)にちゃんと戻ることを確認しておきましょう。導出が正しいことの良い検算になっています。

あとはフルスケール正弦波の電力 $P_s = A_{\mathrm{FS}}^2/2 = 2^{2N}\Delta^2/8$ との比を取るだけです。$\sigma_e^2 = \Delta^2/12$ を使うと、準備1と同じく $\Delta^2$ が消えて

$$ \mathrm{SNR} = \frac{P_s}{P_{n,\mathrm{in}}} = \frac{3}{2}2^{2N}\cdot\frac{(2L+1)\,\mathrm{OSR}^{2L+1}}{\pi^{2L}} $$

デシベルに直し、$10\log_{10}\mathrm{OSR}^{2L+1} = (20L+10)\log_{10}\mathrm{OSR}$ に注意すると、目的の式が得られます。

$$ \boxed{\ \mathrm{SNR}\ [\mathrm{dB}] = 6.02N + 1.76 – 10\log_{10}\!\frac{\pi^{2L}}{2L+1} + (20L+10)\log_{10}\mathrm{OSR}\ } \tag{14} $$

4つの項の意味を、ひとつずつ味わっておきましょう。

  • $6.02N + 1.76$:量子化器そのものの素の性能。1ビットなら7.78 dBしかない。
  • $-10\log_{10}\bigl(\pi^{2L}/(2L+1)\bigr)$:ノイズシェーピングの代償。$L=1$ で $-5.17$ dB、$L=2$ で $-12.90$ dB、$L=3$ で $-21.38$ dB。次数を上げるほど、OSRが小さい領域では逆に損をします。高域に押し出した雑音の「跳ね返り」だと思ってください。
  • $(20L+10)\log_{10}\mathrm{OSR}$:ノイズシェーピングの報酬。ここが効いてくると、代償など問題にならなくなります。
  • この2つの綱引きにより、低OSRでは低次が有利、高OSRでは高次が圧勝という交差が生じます。

報酬の項を「OSRを2倍にしたとき」で評価してみます。$\log_{10}2 = 0.301$ なので

$$ \Delta\mathrm{SNR} = (20L+10)\times 0.301 = 6.02L + 3.01\ \ [\mathrm{dB/oct}] $$

具体的に並べると次の表になります。

次数 $L$ OSR 2倍あたりの利得 ビット換算 代償項 $-10\log_{10}(\pi^{2L}/(2L+1))$
0(オーバーサンプリングのみ) 3.01 dB 0.5 bit 0 dB
1 9.03 dB 1.5 bit $-5.17$ dB
2 15.05 dB 2.5 bit $-12.90$ dB
3 21.07 dB 3.5 bit $-21.38$ dB

「1次で9 dB/oct、2次で15 dB/oct、3次で21 dB/oct」という、ΔΣの教科書に必ず出てくる数字がこれです。ビット換算にすると $L+0.5$ ビット/オクターブという、さらに覚えやすい形になります。

この4項の綱引きを可視化すると、次数の選び方が見えてきます。

左は式(14)をOSRの関数として次数別に描いた曲線群(低OSRでは低次が有利、高OSRでは高次が圧勝)、右は1ビット・2次・OSR=64のときのSNR内訳の積み上げ

左のグラフでは4本の直線が $\mathrm{OSR}=2\sim4$ 付近で束になって交差しています。$\mathrm{OSR}=8$ の縦線あたりでは代償項が効いていて次数を上げてもほとんど得がないのに対し、$\mathrm{OSR}=256$ では傾きの差がそのまま数十dBの差になっている、という「高次化は十分なOSRとセットでしか意味を持たない」という教訓がそのまま図になっています。右の積み上げ棒は具体例の内訳で、素の性能 $+7.78$ dB から代償 $-12.90$ dB を引かれて一度マイナスまで沈み、報酬 $+90.31$ dB で一気に $85.19$ dB まで持ち上げられる、という力関係が読み取れます。

具体例を1つ。1ビット量子化器($N=1$)を2次ノイズシェーピング($L=2$)で $\mathrm{OSR}=64$ 回したらどうなるか、式(14)に素直に代入します。

$$ \mathrm{SNR} = 6.02\times 1 + 1.76 – 12.90 + 50\log_{10}64 = 7.78 – 12.90 + 90.31 = 85.2\ \mathrm{dB} $$

ENOBに直せば $(85.2-1.76)/6.02 = 13.9$ ビット。たった1ビットの比較器が、64倍速で回すだけで14ビット相当になりました。これがΔΣの威力です。

ただし式(14)はフルスケール入力を仮定している点に注意が必要です。後で見るように、1ビットΔΣは入力をフルスケールまで振ると不安定になるため、実際には $-3$〜$-6$ dBFS程度に抑えて使います。振幅を $A$ に落とせば、その分 $20\log_{10}(A/A_{\mathrm{FS}})$ だけSNRは下がります。本記事のシミュレーションでは $A = 0.5$($\pm1$ 出力に対して $-12$ dBFS相当)を使うので、上の85.2 dBから12.0 dBを引いた73.2 dBが理論予測値になります。

理論はここまでです。次はコードを書いて、この $9\ \mathrm{dB}$ と $15\ \mathrm{dB}$ が本当に出るのかを自分の目で確かめます。

Pythonでの実装1:変調器とビットストリーム

まず1次・2次のΔΣ変調器を時間領域でそのまま書き下します。式の見た目とコードがほぼ1対1に対応するので、実装は拍子抜けするほど短くなります。

import numpy as np

def dsm1(u, dither=0.0, seed=1):
    """1次ΔΣ変調器: v[n]=v[n-1]+(u[n-1]-y[n-1]), y[n]=sgn(v[n])"""
    rng = np.random.default_rng(seed)
    M = len(u); y = np.zeros(M)
    v = 0.0; u_prev = 0.0; y_prev = 0.0
    # 比較器のしきい値に加えるディザ(既定は無効)
    d = rng.uniform(-dither, dither, M) if dither > 0 else np.zeros(M)
    for i in range(M):
        v += u_prev - y_prev            # 積分器(誤差の帳簿)
        y_prev = 1.0 if v + d[i] >= 0 else -1.0   # 1ビット量子化器
        y[i] = y_prev
        u_prev = u[i]
    return y

def dsm2(u):
    """2次ΔΣ変調器: 2段目の帰還係数は 2(NTF=(1-z^-1)^2 にするため)"""
    M = len(u); y = np.zeros(M)
    v1 = 0.0; v2 = 0.0; v1_prev = 0.0; u_prev = 0.0; y_prev = 0.0
    s1 = np.zeros(M); s2 = np.zeros(M)   # 積分器の内部状態を記録
    for i in range(M):
        v1 += u_prev - y_prev           # 1段目: 係数 a1 = 1
        v2 += v1_prev - 2.0 * y_prev    # 2段目: 係数 a2 = 2
        v1_prev = v1
        y_prev = 1.0 if v2 >= 0 else -1.0
        y[i] = y_prev; u_prev = u[i]; s1[i] = v1; s2[i] = v2
    return y, s1, s2

# 直流入力に対する出力平均が入力に一致することを確認
for dc in [-0.5, 0.0, 0.25, 0.5]:
    y = dsm1(np.full(4096, dc))
    print(f"DC={dc:+.2f}  出力平均={y.mean():+.4f}  +1の割合={np.mean(y > 0)*100:.2f}%  理論={(1+dc)/2*100:.2f}%")

実行すると、DC=+0.25 に対して出力平均 +0.2500+1 の割合は 62.50%(理論値 $(1+0.25)/2 = 62.5\%$)と、ぴったり一致します。$\pm1$ しか出せない出力の平均が入力を正確に再現しているわけで、冒頭の「白と黒のペンキで灰色を作る」という直感がそのまま数値で確認できました。ここで密度と入力の関係が $(1+u)/2$ という線形式になっている点も重要で、これが $\mathrm{STF}$ が歪みのない純遅延であることの時間領域での現れです。

次に、正弦波を入れたときのビットストリームを見てみましょう。

import matplotlib, matplotlib.pyplot as plt
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
    if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
        plt.rcParams["font.family"] = cand
        break
plt.rcParams["axes.unicode_minus"] = False

N = 2**16; OSR = 64
k_band = N // (2 * OSR)              # 信号帯域の最終ビン
ks = (k_band // 3) // 2 * 2 + 1      # 信号ビン(奇数にしてコヒーレントサンプリング)
n = np.arange(N)
u = 0.5 * np.sin(2 * np.pi * ks / N * n)   # 振幅 A=0.5
y1 = dsm1(u); y2, s1, s2 = dsm2(u)

seg = slice(0, 1200)
fig, ax = plt.subplots(2, 1, figsize=(11, 6), sharex=True)
ax[0].step(n[seg], y1[seg], where="post", color="0.7", lw=0.8, label="1ビット出力 $y[n]$")
ax[0].plot(n[seg], u[seg], "r", lw=2, label="入力 $u[n]$")
ax[0].plot(n[seg], np.convolve(y1, np.ones(64)/64, "same")[seg], "b", lw=2, label="出力の64点移動平均")
ax[0].set_title("1次ΔΣ変調器のビットストリーム(±1 の密度が入力を表す)"); ax[0].legend(loc="upper right")
ax[1].plot(n[seg], s1[seg], label="1段目の積分器出力 $v_1$")
ax[1].plot(n[seg], s2[seg], label="2段目の積分器出力 $v_2$")
ax[1].set_xlabel("サンプル番号 $n$"); ax[1].set_title("2次変調器の積分器の振れ幅"); ax[1].legend()
plt.tight_layout(); plt.show()

上段は1次ΔΣのビットストリームと64点移動平均が入力正弦波に重なる様子、中段はその一部を拡大した±1のパルス列、下段は2次変調器の2つの積分器出力の振れ幅

上段のグラフを見ると、灰色の $\pm1$ のパルス列は一見ただのランダムな矩形波ですが、青い移動平均をとると赤い入力正弦波にぴたりと重なります。情報は「どちらの値か」ではなく「どちらがどれだけ密に出るか」に符号化されていることが目で見て確認できます。中段は $n=600\sim660$ を拡大したもので、この区間は入力が負のため $-1$ が連続し、$+1$ は2〜3サンプルに1回だけ挟まる、という密度変調の実態が1サンプル単位で見えます。下段の積分器出力は、入力振幅 $A=0.5$ のとき $|v_1| \lesssim 2.7$、$|v_2| \lesssim 4.1$ の範囲に収まっており、ループが暴走せずに落ち着いていることがわかります。この振れ幅は後のオーバーロードの議論で重要になります。

ビットストリームだけ見ていても「高域に押し出す」様子は見えません。次は周波数領域に移り、ノイズシェーピングの形そのものを描きます。

Pythonでの実装2:出力スペクトルとノイズシェーピング

式(12)で予言した $|2\sin(\omega/2)|^L$ という形が、実際のスペクトルに現れるかを確かめます。理論曲線を重ね描きするのがポイントです。

def logbin(f, P, nb=140):
    """対数等間隔ビンで平均パワーを取る(対数軸で見やすくするため)"""
    edges = np.logspace(np.log10(f[1]), np.log10(f[-1]), nb + 1)
    idx = np.digitize(f, edges) - 1
    fc, Pc = [], []
    for b in range(nb):
        m = idx == b
        if m.sum():
            fc.append(f[m].mean()); Pc.append(P[m].mean())
    return np.array(fc), np.array(Pc)

f = np.arange(N // 2 + 1) / N        # 正規化周波数 f/fs
w = 2 * np.pi * f
fit = (f > 0.02) & (f < 0.3)         # 理論曲線の縦位置を合わせる帯域
plt.figure(figsize=(11, 6))
for y, L, c, cd in [(y1, 1, "tab:blue", "b--"), (y2, 2, "tab:red", "r--")]:
    P = np.abs(np.fft.rfft(y) / N)**2
    shape = np.abs(2 * np.sin(w / 2))**(2 * L)          # |NTF|^2
    off = 10 * np.log10(np.median(P[fit] / shape[fit]))  # 白色雑音レベルの実測値
    fc, Pc = logbin(f, P)
    plt.semilogx(fc, 10 * np.log10(Pc), color=c, lw=1.3, label=f"{L}次ΔΣ 出力スペクトル(実測)")
    plt.semilogx(f[1:], off + 10 * np.log10(shape[1:]), cd, lw=2,
                 label=fr"理論 $|2\sin(\omega/2)|^{L}$({20*L} dB/dec)")
    print(f"{L}次: 白色雑音レベル {off:.1f} dB, "
          f"帯域内雑音 {10*np.log10(P[1:k_band+1].sum() - P[ks]):.1f} dB")
plt.axvline(1 / (2 * OSR), color="k", ls=":", lw=2)
plt.text(1 / (2 * OSR) * 1.15, -157, "信号帯域端 $f_B=f_s/128$", rotation=90, va="bottom")
plt.axvline(1 / 6, color="gray", ls="-.", lw=1.5)
plt.text(1 / 6 * 1.12, -8, "$f_s/6$:利得1の分岐点", rotation=90, va="top")
plt.xlabel("正規化周波数 $f/f_s$"); plt.ylabel("パワー [dB]")
plt.title("ΔΣ変調器の出力スペクトル:雑音が高域へ押し出される"); plt.legend(loc="lower right"); plt.grid(alpha=0.3)
plt.ylim(-160, 0); plt.xlim(1.4e-5, 0.55); plt.tight_layout(); plt.show()

1次と2次ΔΣの出力スペクトルの実測と理論NTF曲線の重ね描き。低域では2次が急峻に落ち、fs/6より右では2次の方が雑音が多い

このグラフが本記事で最も重要な1枚です。読み取れることは3つあります。第一に、実測スペクトルの傾きが理論曲線とぴたりと重なります。低域では1次が 20 dB/dec、2次が 40 dB/dec で落ちており、$(1-z^{-1})^L$ という予測が正しいことを裏づけています。第二に、$f_s/6$ の縦線より右では2次の方が1次より雑音が多い、つまり高次化のツケが高域に山として現れています。第三に、信号帯域端 $f_B = f_s/128$ の左側だけを見れば、2次の雑音床は1次よりはっきり低い。実測で平均パワーを比べると、帯域の下の方($f/f_s \sim 10^{-4}$ 付近)では 37〜40 dB、帯域端に近い $3\times10^{-3}\sim f_B$ の範囲でも 20.2 dB 低く、帯域内の総雑音で見ると 20.2 dB の差がつきました。低域ほど差が大きいのは $|\mathrm{NTF}|$ の傾きが次数ぶんだけ急だからで、逆に帯域端に近づくほど差が縮む点も式(12)の通りです。私たちが払った代償と受け取った報酬が、1枚の図に同居しています。

さて、この「帯域内だけ見る」という操作を数値化して、式(14)の予測と突き合わせましょう。

Pythonでの実装3:OSR掃引とSNDR

理論の核心である「9 dB/oct と 15 dB/oct」を実測で確かめます。比較のため、ノイズシェーピングなしの4ビット量子化器(単純オーバーサンプリング)も並べます。

def band_sndr(y, ks, k_band):
    """信号ビンの電力と、それを除いた帯域内全ビンの電力の比"""
    Y = np.fft.rfft(y) / len(y)
    sig = np.abs(Y[ks])**2
    Pn = np.abs(Y[1:k_band + 1])**2
    Pn[ks - 1] = 0.0                # 信号ビンを除外
    return 10 * np.log10(sig / Pn.sum())

def plain_quantize(u, nbit=4, seed=3):
    """ノイズシェーピングなしの一様量子化器(TPDFディザ付き)"""
    rng = np.random.default_rng(seed)
    D = 2.0 / (2**nbit)
    dth = (rng.random(len(u)) + rng.random(len(u)) - 1.0) * D   # 三角分布ディザ
    return np.round((u + dth) / D) * D

A = 0.5
theory_L = lambda L, OSR: 10*np.log10((A**2/2) / ((1/3) * np.pi**(2*L) / ((2*L+1) * OSR**(2*L+1))))
res = {"平坦(4bit)": [], "1次ΔΣ": [], "2次ΔΣ": []}
osrs = [8, 16, 32, 64, 128, 256]
for OSR in osrs:
    k_band = N // (2 * OSR); ks = (k_band // 3) // 2 * 2 + 1
    u = A * np.sin(2 * np.pi * ks / N * np.arange(N))
    res["平坦(4bit)"].append(band_sndr(plain_quantize(u), ks, k_band))
    res["1次ΔΣ"].append(band_sndr(dsm1(u, dither=0.3), ks, k_band))
    res["2次ΔΣ"].append(band_sndr(dsm2(u)[0], ks, k_band))
    print(f"OSR={OSR:4d}  平坦={res['平坦(4bit)'][-1]:6.1f}  "
          f"1次={res['1次ΔΣ'][-1]:6.1f}(理論{theory_L(1,OSR):5.1f})  "
          f"2次={res['2次ΔΣ'][-1]:6.1f}(理論{theory_L(2,OSR):5.1f}) dB")

# オクターブあたりの傾きを回帰で求める
x = np.log2(osrs)
for key, v in res.items():
    print(f"{key}: 傾き = {np.polyfit(x, v, 1)[0]:.2f} dB/oct,  OSR=64でのENOB = {(v[3]-1.76)/6.02:.2f} bit")

左はOSRを8から256まで振ったときの帯域内SNDRと理論式(14)の比較、右は同じ結果をENOBに換算した棒グラフ

左のグラフでは、実線(実測)と破線(理論式(14))が同じ傾きで平行に走っています。理論からの上下のずれは数dBで、傾きそのものは 2.91 / 8.99 / 14.97 dB/oct と理論値をほぼ完全に再現しました。右のENOB換算を見ると、$\mathrm{OSR}=8$ では3本の棒がほぼ同じ高さなのに、OSRを上げるほど赤(2次)だけが突き放していく様子がわかります。数値で並べると次の表になります($A=0.5$、$N=2^{16}$ 点)。

OSR 平坦4ビット 1次ΔΣ(理論) 2次ΔΣ(理論)
8 24.0 dB 19.7 (17.7) dB 24.8 (28.0) dB
16 27.1 dB 28.3 (26.7) dB 40.3 (43.1) dB
32 30.0 dB 38.0 (35.7) dB 54.4 (58.1) dB
64 33.1 dB 46.6 (44.8) dB 70.0 (73.2) dB
128 36.1 dB 55.9 (53.8) dB 84.0 (88.2) dB
256 38.3 dB 64.3 (62.8) dB 100.3 (103.3) dB

回帰で傾きを取ると、平坦が 2.91 dB/oct、1次が 8.99 dB/oct、2次が 14.97 dB/oct。理論値 3.01 / 9.03 / 15.05 dB/oct と見事に一致しました。式(14)の導出が正しかったことが、実測で裏づけられたことになります。

もう少し細かく眺めると、面白い事実がいくつも読み取れます。OSR=8では2次ΔΣ(24.8 dB)が平坦4ビット(24.0 dB)とほぼ同じで、しかも1次より少し良い程度しかありません。これは式(14)の代償項 $-12.9$ dB がまだ効いている領域だからです。ところがOSRが上がるにつれて $50\log_{10}\mathrm{OSR}$ が支配的になり、OSR=256では2次が平坦の62 dB上をいきます。「高次にすれば常に得」ではなく、十分なOSRとセットで初めて意味を持つというのが実務上の教訓です。

理論との差にも意味があります。2次では実測が理論より一貫して3 dB程度低く出ています。これは線形化モデル(量子化誤差が入力と独立な白色雑音)が、1ビット量子化器では厳密には成り立たないためです。一方1次では逆に実測が理論より1〜2 dB高く出ています。1次変調器の誤差はむしろ強く構造化されており(後述のアイドルトーン)、白色近似から両方向にズレうるのです。数dBの範囲でモデルが当たっている、というのが実際のところで、初期検討には十分すぎる精度と言えます。

ENOBに直しておくと、OSR=64で平坦4ビットが5.2ビット、1次が7.5ビット、2次が11.3ビット。1ビットの比較器が11ビットのADCに化けています。

順調に見えますが、ここまでは「入力振幅は控えめ、次数は2まで」という安全圏の話でした。次は、この安全圏から一歩出たときに何が起きるかを見ます。ΔΣの実務はほとんどこの話に費やされます。

安定性の壁:オーバーロードと高次の発散

ΔΣ変調器には、線形フィルタには存在しない固有の病があります。量子化器が飽和すると、ループが発振してしまうのです。

原因は単純です。1ビット量子化器の出力は $\pm1$ しかありません。積分器出力 $v$ が $+50$ になっていても、量子化器はやはり $+1$ しか返せない。すると帰還で引ける量が足りず、積分器はさらに溜め込み、$v$ はますます大きくなる。この正のフィードバックに入ると、出力は長い $+1$ の連続と長い $-1$ の連続を繰り返すだけの巨大なリミットサイクルに落ち込み、信号は完全に失われます。これをオーバーロードと呼びます。

まず入力振幅を振ってみましょう。

OSR = 64; k_band = N // (2 * OSR); ks = (k_band // 3) // 2 * 2 + 1
amps = [0.1, 0.3, 0.5, 0.7, 0.8, 0.9, 0.95, 1.0]
sndr_a, swing = [], []
for A in amps:
    u = A * np.sin(2 * np.pi * ks / N * np.arange(N))
    y, s1, s2 = dsm2(u)
    sndr_a.append(band_sndr(y, ks, k_band)); swing.append(np.abs(s2).max())
    print(f"A={A:4.2f} ({20*np.log10(A):6.2f} dBFS)  SNDR={sndr_a[-1]:5.1f} dB  max|v2|={swing[-1]:6.1f}")

fig, ax1 = plt.subplots(figsize=(9, 5))
ax1.plot(20*np.log10(amps), sndr_a, "o-", color="tab:blue", label="SNDR")
ax1.set_xlabel("入力振幅 [dBFS]"); ax1.set_ylabel("SNDR [dB]", color="tab:blue"); ax1.grid(alpha=0.3)
ax2 = ax1.twinx()
ax2.semilogy(20*np.log10(amps), swing, "s--", color="tab:red", label="積分器振幅")
ax2.set_ylabel("2段目積分器の最大振幅 $\\max|v_2|$", color="tab:red")
ax1.set_title("2次ΔΣ変調器のオーバーロード特性(OSR=64)")
plt.tight_layout(); plt.show()

左は入力振幅に対するSNDRが-3 dBFSでピークを打ってから崖のように崩壊する様子、中央は積分器の最大振幅の爆発、右は安定時と発散時の積分器波形の比較

左のSNDR曲線は $-3.1$ dBFS で 70.5 dB のピークを打った直後、$-0.5$ dBFS で 57.4 dB、フルスケールで 41.2 dB へと垂直に近い勢いで落ちています。中央の対数目盛りを見ると、同じ振幅域で $\max|v_2|$ が 5.7 → 17.7 → 53.3 と一桁跳ね上がっており、SNDRの崩壊が積分器の発散と同時に起きていることが確認できます。右の時間波形では、$A=1.0$(赤)だけが周期的に大きく振り切れており、これが長い $+1$ や $-1$ の連続、すなわち巨大なリミットサイクルの正体です。実測値を表にすると次のようになります。

入力振幅 $A$ dBFS SNDR 2段目積分器の最大振幅
0.1 $-20.0$ 58.6 dB 2.8
0.3 $-10.5$ 67.2 dB 3.1
0.5 $-6.0$ 70.0 dB 4.1
0.7 $-3.1$ 70.5 dB 5.7
0.8 $-1.9$ 70.3 dB 8.6
0.9 $-0.9$ 69.4 dB 10.3
0.95 $-0.5$ 57.4 dB 17.7
1.0 $0.0$ 41.2 dB 53.3

このグラフは、線形なシステムしか知らないと衝撃的です。振幅を上げていくとSNDRは順調に伸び、$-3$ dBFS付近で 70.5 dB のピークを打ちます。そこまでは常識通りで、雑音が一定なら信号を大きくするほどSNDRは良くなるからです。ところが $-0.5$ dBFSで57.4 dB、フルスケールでは41.2 dBへと崖から落ちるように崩壊します。同時に積分器の振幅が 5.7 → 17.7 → 53.3 と爆発しており、崩壊の原因がループの発散であることが明白です。

この崖のせいで、ΔΣ ADCのダイナミックレンジは「ピークSNDR」ではなく「安定に使える最大入力」で決まります。1ビットΔΣでは経験的にフルスケールの70〜80%程度が実用上限で、データシートの入力レンジが一見中途半端な値になっているのはこのためです。

次数を上げると、この病はさらに深刻になります。式(11)の二項係数で3次を組むと、$|\mathrm{NTF}|$ の最大値は $2^3 = 8$。量子化器から見れば、入力振幅がゼロでも雑音が8倍に増幅されて戻ってくるわけで、これでは持ちません。実際、$(1,3,3)$ の係数で3次CIFB変調器を回すと積分器の状態は $10^{12}$ のオーダーまで発散し、出力は完全に無意味になります。

この経験則を定量化したのがLee の判定条件(Lee criterion)です。

$$ \max_{\omega}\bigl|\mathrm{NTF}(e^{j\omega})\bigr| \lesssim 2 $$

を満たすように NTF を設計せよ、というものです。理論的な証明があるわけではなく、多数の設計例から得られた経験則ですが、実務では驚くほどよく効きます。

$(1-z^{-1})^L$ の最大ゲインは $2^L$ なので、$L=1$ はちょうど2でセーフ、$L=2$ は4で条件違反ですが「条件付き安定」(入力を絞れば動く)として実際に使われています。$L\ge 3$ は問答無用でアウトです。

ではどうするか。NTFに極を入れて、高域のゲインを押さえ込むのが標準的な処方箋です。零点は $z=1$ に $L$ 個置いたまま、分母に極を追加します。

$$ \mathrm{NTF}(z) = \frac{(1-z^{-1})^L}{D(z^{-1})} $$

たとえば $D(z^{-1}) = (1 – r z^{-1})^L$ と実軸上に3重極を置き、$r$ を振って実験してみます(実装は、NTFを直接指定できる誤差帰還形を使うと簡単です)。

def dsm_error_feedback(u, B, Ad):
    """NTF = B(z)/Ad(z)(ともにモニック)を直接実現する誤差帰還形1ビット変調器"""
    M = len(u); y = np.zeros(M)
    C = np.array(Ad) - np.array(B)            # G = 1 - NTF = (Ad-B)/Ad
    L = len(Ad) - 1
    vh = np.zeros(L + 1); uh = np.zeros(L + 1); eh = np.zeros(L + 1)
    for i in range(M):
        acc = u[i]
        for k in range(1, L + 1):
            acc += Ad[k] * uh[k] - Ad[k] * vh[k] - C[k] * eh[k]
        v = acc
        yy = 1.0 if v >= 0 else -1.0
        e = yy - v                             # 量子化誤差を次サンプルへ持ち越す
        y[i] = yy
        vh[1:] = vh[:-1]; vh[1] = v
        uh[1:] = uh[:-1]; uh[1] = u[i]
        eh[1:] = eh[:-1]; eh[1] = e
    return y

pm = lambda a, b: np.convolve(a, b)
B3 = pm(pm([1, -1], [1, -1]), [1, -1])         # (1 - z^-1)^3
A = 0.5; u = A * np.sin(2 * np.pi * ks / N * np.arange(N))
w = np.linspace(0, np.pi, 8192); z = np.exp(-1j * w)
for r in [0.0, 0.4, 0.5, 0.6, 0.7, 0.75, 0.8]:
    Ad = pm(pm([1, -r], [1, -r]), [1, -r])
    gain = np.abs(sum(B3[i]*z**i for i in range(4)) / sum(Ad[i]*z**i for i in range(4))).max()
    s = band_sndr(dsm_error_feedback(u, B3, Ad), ks, k_band)
    print(f"極半径 r={r:.2f}  max|NTF|={gain:4.2f}  SNDR={s:7.1f} dB")

左は極半径rを変えたときの3次NTFの周波数特性、右は各rでの帯域内SNDRとmax|NTF|の対応(2.92から2.37の境界で発散から83 dBへ跳ぶ)

左のグラフでは、$r$ を大きくするほど高域のゲインが押し下げられ、同時に低域の谷も浅くなっていく様子が見えます。$r=0$(極なし)だけが Lee の判定条件の6 dB線を大きく超えて $+18$ dB に達しており、これが発散の原因です。右の棒グラフは劇的で、$\max|\mathrm{NTF}|$ が 2.92(赤)から 2.37(青)に下がるところに崖のような境界があり、そこを越えると SNDR が $-34.9$ dB の発散状態から一気に 83.1 dB へ跳びます。境界の右側では $r$ を上げるほど安全になる代わりにSNDRが 83.1 → 69.3 dB と単調に下がっており、安定性と性能のトレードオフが数字で見えています。結果を表にまとめると次の通りです。

極半径 $r$ NTFの最大ゲイン SNDR
0.00(極なし) 8.00 $-55.0$ dB(発散)
0.40 2.92 $-34.9$ dB(発散)
0.50 2.37 83.1 dB
0.60 1.95 80.6 dB
0.70 1.63 75.3 dB
0.75 1.49 71.9 dB
0.80 1.37 69.3 dB

$\max|\mathrm{NTF}|$ が 2.92 から 2.37 に下がるところで、発散状態から一気に83 dBへと不連続に飛びます。Leeの判定条件が示す「2前後」という境界が、実測でもきれいに現れました。同時に、$r$ を大きくして安定余裕を増やすほどSNDRは下がっていきます($r=0.5$ で83.1 dB、$r=0.8$ で69.3 dB)。極を単位円の内側に引っ張るほど低域の抑圧が浅くなるからで、安定性と性能はトレードオフです。実際の設計では、$\max|\mathrm{NTF}|$ を1.5前後に取って余裕を持たせることが多く、この表の $r=0.75$(71.9 dB、2次CIFBの70.0 dBより少し良い)あたりが現実的な着地点になります。

なお実回路では、これに加えて(a)積分器出力にクランプ回路を入れて振り切りを防ぐ、(b)長時間の飽和を検出したら積分器を強制リセットする、(c)各段の係数をスケーリングして内部振幅を回路のダイナミックレンジに収める、といった保険を併用します。理論通りのNTFを実現するだけでは製品にならない、という点はΔΣ設計の実感として押さえておく価値があります。

安定性の話が終わったところで、もうひとつの厄介な性質に触れます。ΔΣは「安定していても」不快な音を出すことがあるのです。

アイドルトーンとディザ

線形化モデルは量子化誤差を白色雑音と仮定しました。しかし実際の1ビット量子化器は決定論的な回路であり、入力が静かなときには誤差が周期的なパターンにロックしてしまいます。この現象をリミットサイクル、そこから生まれる離散周波数のスペクトル線をアイドルトーン(idle tone)と呼びます。

なぜ問題になるのか。人間の耳も、FFTベースの計測も、広帯域の雑音より単一周波数のトーンにずっと敏感だからです。同じ全電力なら、白色雑音として散らばっている方が圧倒的にましなのです。

1次変調器に微小な直流を入れて、帯域内スペクトルを調べてみます。

OSR = 64; k_band = N // (2 * OSR)
def inband_stats(y, k_band):
    Y = np.fft.rfft(y) / len(y)
    Pn = np.abs(Y[1:k_band + 1])**2
    return 10*np.log10(Pn.sum()/0.5), 10*np.log10(Pn.max()/0.5), 100*Pn.max()/Pn.sum()

for dc in [0.005, 0.020]:
    for dith in [0.0, 0.5]:
        tot, pk, occ = inband_stats(dsm1(np.full(N, dc), dither=dith), k_band)
        print(f"DC={dc:.3f} ディザ{'なし' if dith == 0 else 'あり'}: "
              f"帯域内雑音={tot:6.1f} dBFS  最大トーン={pk:6.1f} dBFS  ピーク占有={occ:5.1f}%")

plt.figure(figsize=(11, 5))
for dc, dith, c in [(0.005, 0.0, "tab:red"), (0.005, 0.5, "tab:blue")]:
    y = dsm1(np.full(N, dc), dither=dith)
    tot, pk, occ = inband_stats(y, k_band)
    lab = f"DC=0.005, {'ディザなし' if dith==0 else 'ディザあり'}: 帯域内雑音{tot:.1f} dBFS, 最大トーン{pk:.1f} dBFS"
    plt.plot(np.arange(1, k_band+1)/N, 10*np.log10(np.abs(np.fft.rfft(y)[1:k_band+1]/N)**2/0.5), c, lw=0.9, label=lab)
    print(f"DC={dc} dither={dith}: 帯域内雑音={tot:.2f} dBFS, 最大トーン={pk:.2f} dBFS, ピーク占有={occ:.1f}%")
plt.xlabel("正規化周波数 $f/f_s$"); plt.ylabel("パワー [dBFS]")
plt.title("1次ΔΣのアイドルトーンとディザによる分散"); plt.legend(fontsize=9); plt.grid(alpha=0.3)
plt.tight_layout(); plt.show()

左は微小直流入力に対する帯域内スペクトル(ディザなしでは鋭いアイドルトーンが立ち、ディザありでは平坦になる)、右は4条件の帯域内総雑音と最大トーンの比較

左のグラフの赤い曲線が「ディザなし」で、$f/f_s = 0.005$ に針のように鋭いスペクトル線が突き出ています。これがアイドルトーンで、周囲の雑音床より40 dB以上高い。一方の青い曲線(ディザあり)は同じ電力がまんべんなく散らばった、いかにも白色雑音らしい姿になっています。同じ「雑音」でも、1本のトーンに集中するか広く散るかで、聴感上も計測上もまったく別物になるというのがこの図の主張です。右の棒グラフでは4条件を並べており、DC=0.020 のディザなし(3組目)だけは総雑音(灰)が $-68.5$ dBFS と低く、ここにディザを足すとかえって悪化することが読み取れます。数値で並べると次のようになります(帯域内雑音はフルスケール正弦波を0 dBFSとした相対値)。

直流入力 ディザ 帯域内雑音 最大トーン ピークが占める割合
0.005 なし $-43.0$ dBFS $-44.5$ dBFS 70.5 %
0.005 あり $-53.7$ dBFS $-70.8$ dBFS 2.0 %
0.020 なし $-68.5$ dBFS $-94.5$ dBFS 0.3 %
0.020 あり $-53.4$ dBFS $-69.7$ dBFS 2.4 %

読み取れることが2つあります。第一に、直流入力 0.005 のとき、帯域内雑音の70.5%がたった1本のスペクトル線に集中しています。これは白色雑音とは似ても似つかない状態で、オーディオなら「無音のはずなのにピーという音が聞こえる」現象として現れます。比較器のしきい値に微小なランダム信号(ディザ)を加えると、このトーンは $-44.5$ dBFS から $-70.8$ dBFS へと26 dB下がり、占有率も2%に落ちます。誤差が周期パターンにロックするのを、ランダム性が壊してくれるわけです。しかも帯域内の総雑音まで10.7 dB下がっており、この条件ではディザは純粋な得です。

第二に、ディザは万能ではありません。直流入力が0.020のときは、ディザなしの帯域内雑音が $-68.5$ dBFS だったものが、ディザを加えると $-53.4$ dBFS へと15 dB悪化しています。もともとトーンが出ていない入力に対しては、ディザは単なる雑音の追加でしかないのです。実務では「ディザ振幅を必要最小限にする」「入力信号自体が十分に賑やかならディザを切る」といった調整が要ります。ちなみに2次以上の変調器はループの非線形性が強くなるためトーンが出にくく、ディザの必要性も下がります。これも高次化の隠れた利点です。

さて、ここまでで変調器の出力ビットストリームは手に入りました。しかしこれは $f_s$ という高いレートの1ビット列であって、私たちが欲しい「$2f_B$ レートの多ビット数値」ではありません。最後のピースがデシメーションフィルタです。

デシメーションフィルタ:sinc^K で分解能を取り出す

デシメーションフィルタの仕事は2つあります。(1)$f_B$ 以上に山積みになった雑音を削り落とす、(2)サンプリングレートを $f_s$ から $2f_B$ へ間引く。順番が大事で、先にフィルタしてから間引かないと、高域の雑音がそっくり折り返してきます

実装として最も広く使われるのがCICフィルタ(Cascaded Integrator-Comb)、周波数特性で言えば $\mathrm{sinc}^K$ 型のフィルタです。長さ $M$ の移動平均を $K$ 回かけるだけで、乗算器が一切要りません。ビットストリームが $\pm1$ の2値であることを考えると、移動平均は単なるアップダウンカウンタで実装でき、ハードウェアが極端に安く済みます。

$M$ 点移動平均の周波数特性は

$$ H_1(f) = \frac{1}{M}\cdot\frac{\sin(\pi f M/f_s)}{\sin(\pi f/f_s)} $$

で、$f = m f_s/M$($m=1,2,\dots$)に零点を持ちます。デシメーション比を $M = \mathrm{OSR}$ に取ると、折り返しの中心 $m f_s/\mathrm{OSR}$ にちょうど零点が来るという、あつらえたような性質が得られます。これがCICが選ばれる最大の理由です。

では何段重ねればよいのでしょうか。よく知られた設計則は

$$ K \ge L + 1 $$

です。$L$ 次のノイズシェーピングに対して、デシメーションフィルタは1段多く重ねる。理由は、折り返し帯域のでは零点からずれていて減衰が有限なため、そこに $|2\sin(\omega/2)|^{2L}$ で持ち上げられた雑音が乗ってくるからです。$K = L$ では減衰が足りず、$K = L+1$ でようやく折り返し分が無視できるレベルまで落ちます。

実際に確かめてみましょう。2次変調器($L=2$)の出力に $\mathrm{sinc}^K$ を掛けてOSR=64で間引き、最終SNDRを測ります。

def sinc_decimate(y, OSR, K):
    """長さOSRの移動平均をK回かけてからOSR分の1に間引く(CICフィルタ相当)"""
    M = len(y)
    h = np.zeros(M); h[:OSR] = 1.0 / OSR
    xf = np.real(np.fft.ifft(np.fft.fft(y) * np.fft.fft(h)**K))   # 巡回畳み込み
    return xf[::OSR]

A = 0.5; u = A * np.sin(2 * np.pi * ks / N * np.arange(N))
y2, _, _ = dsm2(u)
print(f"変調器のまま(帯域内) SNDR = {band_sndr(y2, ks, k_band):.1f} dB")
for K in [1, 2, 3, 4, 5]:
    d = sinc_decimate(y2, OSR, K); Md = len(d)
    D = np.fft.rfft(d) / Md
    sig = np.abs(D[ks])**2
    Pn = np.abs(D[1:Md//2])**2; Pn[ks - 1] = 0.0
    s = 10 * np.log10(sig / Pn.sum())
    droop = 20 * np.log10(2 * np.abs(D[ks]) / A)
    print(f"sinc^{K}: SNDR={s:6.1f} dB  ENOB={(s-1.76)/6.02:5.2f} bit  信号のドループ={droop:6.2f} dB")

左はsinc^KフィルタのK=1から4までの周波数特性と2次NTFの重ね描き(折り返しの中心に零点が来る)、右は段数KごとのデシメーションSNDRと信号のドループ

左のグラフでは、$M = \mathrm{OSR} = 64$ としたときの零点が $f = m/64$ に等間隔に並び、間引きで折り返してくる帯域の中心をぴたりと押さえているのがわかります。黒い破線の2次NTFと見比べると、$K$ が小さいうちは山と山の間(サイドローブの頂点)でNTFの持ち上がりを抑えきれていないことも見て取れます。右の棒グラフはその帰結で、$K=1,2$(赤)では最終SNDRが変調器の70.0 dB(黒い破線)に遠く及ばず、$K=3$ で初めてそれを追い越します。オレンジの折れ線は信号自身のドループで、段数を増やすほど $-0.38 \to -2.01$ dB と減衰が進む、というもう一方のコストを示しています。結果を表にすると次の通りです。変調器のままの帯域内SNDRは 70.0 dB でした。

フィルタ 最終SNDR ENOB 信号のドループ
$\mathrm{sinc}^1$ 27.1 dB 4.20 bit $-0.38$ dB
$\mathrm{sinc}^2$ 58.2 dB 9.38 bit $-0.80$ dB
$\mathrm{sinc}^3$ 73.4 dB 11.91 bit $-1.20$ dB
$\mathrm{sinc}^4$ 77.0 dB 12.50 bit $-1.61$ dB
$\mathrm{sinc}^5$ 78.8 dB 12.79 bit $-2.01$ dB

$K \ge L+1 = 3$ という設計則が、これ以上ないほどはっきり出ています。$\mathrm{sinc}^1$ では 27.1 dB しかなく、変調器が70 dBの性能を持っていてもフィルタが足を引っ張れば台無しです。$\mathrm{sinc}^2$ で58.2 dBまで回復し、$\mathrm{sinc}^3$ で73.4 dBに到達。$K$ をさらに増やしても $K=5$ で78.8 dBと、伸びは鈍化します。折り返し雑音がすでに支配的でなくなったからで、これ以上はハードウェア量の無駄です。

$\mathrm{sinc}^3$ の73.4 dBが変調器の帯域内70.0 dBを上回っている点も、理解しておくと面白いところです。矛盾ではありません。ノイズシェーピングされた雑音は帯域内でも高い方に偏って分布しているため、$\mathrm{sinc}$ フィルタの帯域内ロールオフ(ドループ)が、信号よりも帯域上端の雑音をより強く削っているのです。言い換えれば、$\mathrm{sinc}$ フィルタは意図せずノイズシェーピングと相性の良い形をしています。

一方でドループは信号自体も減衰させます。ここでは信号を $f_B/3$ に置いたので $-1.20$ dB(理論値 $-1.21$ dB と一致)ですが、帯域端 $f_B$ に近づくほど減衰は大きくなり、$K=3$、$M=\mathrm{OSR}$ なら帯域端で $-11.8$ dB にも達します。そのため実際のΔΣ ADCでは、CICの後段にFIRのドループ補償フィルタ(逆特性を持つ通過帯域等化器)を置き、さらに必要なら鋭いローパスで最終的な帯域制限を行う、という多段構成を取ります。「CICで粗く大量に間引き、FIRで仕上げる」というのが定石です。

以上でΔΣ ADCの信号経路が最初から最後まで繋がりました。最後に、実際のICで使われている発展形を簡単に眺めて締めくくります。

実際のΔΣ ADCで使われる発展形

本記事では1ビット・離散時間・単一ループという最もシンプルな構成を扱いましたが、市販のICは目的に応じて次のような改良を積み重ねています。

マルチビット量子化器。 量子化器を3〜5ビットにすると、式(14)の $6.02N$ が直接効いてSNRが上がるだけでなく、$\max|\mathrm{NTF}|$ の制約が大きく緩みます(量子化器のレンジに余裕があるので飽和しにくい)。結果として高次のNTFを安全に使え、低いOSRで高性能が出せます。代償は、帰還DACの素子ばらつきがそのまま入力に加算されて歪みになること。これを避けるためにDEM(Dynamic Element Matching)というランダム化技法が併用されます。

MASH(カスケード)構成。 1次や2次の安定な変調器を縦に積み、前段の量子化誤差を次段で変調して、ディジタル領域で差し引く方式です。各段が低次なので絶対に発散せず、全体としては高次のNTFが得られます。フラクショナルN PLLの分周比制御に使われるΣ-Δ変調器は、ほぼこの MASH 1-1-1 です。弱点は、アナログの伝達関数とディジタルの打ち消し係数が正確に一致しないと誤差が漏れる(雑音リーク)こと。

連続時間ΔΣ(CT-DSM)。 ループの積分器をスイッチトキャパシタではなくRC/gm-Cで作る方式です。入力にサンプラを置かないため、アンチエイリアスフィルタが不要(ループ自体がフィルタとして働く)という大きな利点があり、消費電力も有利です。無線受信機のような広帯域用途ではこちらが主流です。一方でクロックジッタや帰還DACの立ち上がり波形に敏感になります。

バンドパスΔΣ。 NTFの零点を $z=1$(直流)ではなく $z = e^{\pm j\omega_0}$ に置くと、$\omega_0$ の周りだけ雑音が凹んだ変調器になります。IF信号を直接ディジタル化する用途で使われます。

どの発展形も、本記事で導いた「$\mathrm{STF}$ と $\mathrm{NTF}$ に分離し、$\mathrm{NTF}$ の零点配置と最大ゲインを設計する」という枠組みの上に乗っています。土台さえ理解していれば、データシートのブロック図はかなり読めるようになるはずです。

まとめ

本記事では、ΔΣ変調の原理をオーバーサンプリングとノイズシェーピングの2軸から解説しました。

  • 量子化雑音の総量は変えられないが、分布は変えられる。 ΔΣ変調器は信号帯域から雑音を追い出し、高域に山積みにする装置である。
  • 線形化モデルでループを解くと $Y = \mathrm{STF}\cdot U + \mathrm{NTF}\cdot E$ に分離する。 遅延型積分器を $L$ 段、帰還係数を二項係数 $\binom{L}{L-k+1}$ に取ると $\mathrm{STF}=z^{-L}$、$\mathrm{NTF}=(1-z^{-1})^L$ となる。
  • $|\mathrm{NTF}(e^{j\omega})| = |2\sin(\omega/2)|^L$。 直流で $L$ 重の零点、ナイキストで $2^L$ 倍、利得1の分岐点は次数によらず $f_s/6$。
  • 帯域内雑音を積分すると $\mathrm{SNR} = 6.02N + 1.76 – 10\log_{10}\frac{\pi^{2L}}{2L+1} + (20L+10)\log_{10}\mathrm{OSR}$。 OSR2倍あたり1次で9 dB、2次で15 dB、3次で21 dB。実測でも 8.99 / 14.97 dB/oct が確認できた。
  • 代償項があるため、低OSRでは高次が不利。 OSR=8では2次ΔΣは平坦4ビット量子化と同等でしかない。高次化は十分なOSRとセットで意味を持つ。
  • 1ビットΔΣは飽和すると発散する。 2次変調器は $-3$ dBFS でSNDRがピーク(70.5 dB)に達した後、フルスケールでは41.2 dBまで崩壊した。$\max|\mathrm{NTF}| \lesssim 2$(Leeの判定条件)を満たすようNTFに極を入れて設計する。実測でも $\max|\mathrm{NTF}|$ が 2.92 → 2.37 に下がる境界で、発散状態から83 dBへ不連続に飛んだ。
  • アイドルトーンには注意。 微小直流入力では帯域内雑音の70%が1本のスペクトル線に集中した。ディザで26 dB抑えられるが、トーンが出ない条件では逆に雑音を増やす。
  • デシメーションは $\mathrm{sinc}^K$(CIC)で、$K \ge L+1$。 2次変調器に対して $\mathrm{sinc}^1$ では27.1 dB(ENOB 4.2ビット)だったものが、$\mathrm{sinc}^3$ で73.4 dB(ENOB 11.9ビット)に達した。ドループ補償のFIRを後段に置くのが定石。

ΔΣ変調は、「粗い部品でも、速く回して誤差を管理すれば精度が買える」という工学の一般原則の、最も美しい実例のひとつです。同じ発想は、ディジタル画像のディザリング、PWMによるDA変換、フラクショナルN PLL、さらには機械学習の低ビット量子化にまで顔を出します。ひとつ理解しておくと、思わぬところで再会するはずです。

次のステップとして、以下の記事も参考にしてください。