ADC のノイズが占める下位ビットの幅を求める方法

はじめに

ADC のノイズにより、下位の数ビットはノイズが占めているときがある。先日、ADCの有効ビット数を求める必要に迫られたので、自分なりに理解したことをメモしておく。本書では、Noise Spectral Density (NSD) が dBFS の単位でデータ・シート等から入手できる場合に、指定した帯域に含まれるノイズの総量が占める下位のビット数を計算する方法を示す。

\[ % 汎用 \newcommand{\ctext}[1]{\raise0.2ex\hbox{\textcircled{\scriptsize{#1}}}} % 数学 % 汎用 \DeclarePairedDelimiterX{\parens}[1]{\lparen}{\rparen}{#1} \DeclarePairedDelimiterX{\braces}[1]{\lbrace}{\rbrace}{#1} \DeclarePairedDelimiterX{\bracks}[1]{\lbrack}{\rbrack}{#1} \DeclarePairedDelimiterX{\verts}[1]{|}{|}{#1} \DeclarePairedDelimiterX{\Verts}[1]{\|}{\|}{#1} \newcommand{\as}{{\quad\textrm{as}\quad}} \newcommand{\st}{{\textrm{ s.t. }}} \DeclarePairedDelimiterX{\setComprehension}[2]{\lbrace}{\rbrace}{#1\,\delimsize\vert\,#2} \newcommand{\naturalNumbers}{\mathbb{N}} \newcommand{\integers}{\mathbb{Z}} \newcommand{\rationalNumbers}{\mathbb{Q}} \newcommand{\realNumbers}{\mathbb{R}} \newcommand{\complexNumbers}{\mathbb{C}} \newcommand{\field}{\mathbb{F}} \newcommand{\func}[2]{{#1}\parens*{#2}} \newcommand{\argmax}{\mathop{\textrm{arg~max}}} \newcommand{\argmin}{\mathop{\textrm{arg~min}}} % 集合論 \newcommand{\range}[2]{\braces*{#1,\dotsc,#2}} \providecommand{\complement}{}\renewcommand{\complement}{\mathrm{c}} \newcommand{\ind}[2]{\mathbbm{1}_{#1}\parens*{#2}} \newcommand{\indII}[1]{\mathbbm{1}\braces*{#1}} % 数論 \newcommand{\abs}[1]{\verts*{#1}} \newcommand{\combi}[2]{{_{#1}\mathrm{C}_{#2}}} \newcommand{\perm}[2]{{_{#1}\mathrm{P}_{#2}}} \newcommand{\GaloisField}[1]{\mathrm{GF}\parens*{#1}} % 解析学 \newcommand{\NapierE}{\mathrm{e}} \newcommand{\sgn}[1]{\operatorname{sgn}\parens*{#1}} \newcommand{\cl}[1]{\operatorname{cl}#1} \newcommand{\Img}[1]{\operatorname{Img}\parens*{#1}} \newcommand{\dom}[1]{\operatorname{dom}\parens*{#1}} \newcommand{\norm}[1]{\Verts*{#1}} \newcommand{\floor}[1]{\left\lfloor#1\right\rfloor} \newcommand{\ceil}[1]{\left\lceil#1\right\rceil} \newcommand{\expo}[1]{\exp\parens*{#1}} \newcommand{\sinc}{\mathop{\textrm{sinc}}} \newcommand{\GammaFunc}[1]{\Gamma\parens*{#1}} \newcommand{\erf}{\mathop{\mathrm{erf}}} % 逆三角関数 \newcommand{\asin}[1]{\operatorname{Sin}^{-1}{#1}} \newcommand{\acos}[1]{\operatorname{Cos}^{-1}{#1}} \newcommand{\atan}[1]{\operatorname{{Tan}^{-1}}{#1}} \newcommand{\atanEx}[2]{\atan{\parens*{#1,#2}}} % 畳み込み \newcommand{\cycConv}[2]{{#1}\underset{\text{cyc}}{*}{#2}} % 微分 \newcommand{\deriv}[3]{\frac{\operatorname{d}^{#3}#1}{\operatorname{d}{#2}^{#3}}} \newcommand{\derivLong}[3]{\frac{\operatorname{d}^{#3}}{\operatorname{d}{#2}^{#3}}#1} \newcommand{\partDeriv}[3]{\frac{\operatorname{\partial}^{#3}#1}{\operatorname{\partial}{#2}^{#3}}} \newcommand{\partDerivLong}[3]{\frac{\operatorname{\partial}^{#3}}{\operatorname{\partial}{#2}^{#3}}#1} \newcommand{\partDerivIIHetero}[3]{\frac{\operatorname{\partial}^2#1}{\partial#2\operatorname{\partial}#3}} \newcommand{\partDerivIIHeteroLong}[3]{{\frac{\operatorname{\partial}^2}{\partial#2\operatorname{\partial}#3}#1}} % 積分 \newcommand{\integrate}[5]{\int_{#1}^{#2}{#3}{\mathrm{d}^{#4}}#5} \newcommand{\LebInteg}[4]{\int_{#1} {#2} {#3}\parens*{\mathrm{d}#4}} % 複素解析 \newcommand{\conj}[1]{\overline{#1}} \providecommand{\Re}{}\renewcommand{\Re}[1]{{\operatorname{Re}{\parens*{#1}}}} \providecommand{\Im}{}\renewcommand{\Im}[1]{{\operatorname{Im}{\parens*{#1}}}} \newcommand{\Arg}[1]{\operatorname{Arg}{\parens*{#1}}} \newcommand{\Log}[1]{\operatorname{Log}{#1}} % ラプラス変換 \newcommand{\LPLC}[1]{\operatorname{\mathcal{L}}\parens*{#1}} \newcommand{\ILPLC}[1]{\operatorname{\mathcal{L}}^{-1}\parens*{#1}} % 離散Fourier変換 \newcommand{\DFT}[1]{\mathrm{DFT}\parens*{#1}} % Z変換 \newcommand{\ZTrans}[1]{\operatorname{\mathcal{Z}}\parens*{#1}} \newcommand{\IZTrans}[1]{\operatorname{\mathcal{Z}}^{-1}\parens*{#1}} % 線形代数 \newcommand{\bm}[1]{{\boldsymbol{#1}}} \newcommand{\matEntry}[3]{#1\bracks*{#2}\bracks*{#3}} \newcommand{\matPart}[5]{\matEntry{#1}{#2:#3}{#4:#5}} \newcommand{\diag}[1]{\operatorname{diag}\parens*{#1}} \newcommand{\tr}[1]{\operatorname{tr}{\parens*{#1}}} \newcommand{\inprod}[2]{\left\langle#1,#2\right\rangle} \newcommand{\HadamardProd}{\odot} \newcommand{\HadamardDiv}{\oslash} \newcommand{\Span}[1]{\operatorname{span}\bracks*{#1}} \newcommand{\Ker}[1]{\operatorname{Ker}\parens*{#1}} \newcommand{\rank}[1]{\operatorname{rank}\parens*{#1}} % ベクトル % 単位ベクトル \newcommand{\vix}{\bm{i}_x} \newcommand{\viy}{\bm{i}_y} \newcommand{\viz}{\bm{i}_z} % 確率論 \newcommand{\PDF}[2]{\operatorname{PDF}\bracks*{#1,\;#2}} \newcommand{\Ber}[1]{\operatorname{Ber}\parens*{#1}} \newcommand{\Beta}[2]{\operatorname{Beta}\parens*{#1,#2}} \newcommand{\ExpDist}[1]{\operatorname{ExpDist}\parens*{#1}} \newcommand{\ErlangDist}[2]{\operatorname{ErlangDist}\parens*{#1,#2}} \newcommand{\PoissonDist}[1]{\operatorname{PoissonDist}\parens*{#1}} \newcommand{\GammaDist}[2]{\operatorname{Gamma}\parens*{#1,#2}} \newcommand{\cind}[2]{\ind{#1\left| #2\right.}} %条件付き指示関数 \providecommand{\Pr}{}\renewcommand{\Pr}[1]{\operatorname{Pr}\parens*{#1}} \newcommand{\cPr}[2]{\operatorname{Pr}\cPrParens{#1}{#2}} \newcommand{\E}[2]{\operatorname{E}_{#1}\bracks*{#2}} \newcommand{\cE}[3]{\E{#1}{\left.#2\right|#3}} \newcommand{\Var}[2]{\operatorname{Var}_{#1}\bracks*{#2}} \newcommand{\Cov}[2]{\operatorname{Cov}\bracks*{#1,#2}} \newcommand{\CovMat}[1]{\operatorname{Cov}\bracks*{#1}} % グラフ理論 \newcommand{\neighborhood}{\mathcal{N}} % プログラミング \newcommand{\plpl}{\mathrel{++}} \newcommand{\pleq}{\mathrel{+}=} \newcommand{\asteq}{\mathrel{*}=} \]

関連文書

  1. dBFS

dBFS/Hz 表記された NSD の意味

ある周波数を代表点として、それを含む十分に小さい区間 B をとり、その区間に於けるノイズの時間軸方向の2乗平均を周波数軸方向に総和したもの $P_\mathrm{n}(B)$ を B の幅で除した値が、B の幅を 0 に近付けてゆく極限で収束するとき、その値がその代表点に於ける NSD である。

関連文書 [1] で述べられているように、フル・スケール $A>0$ の正弦波の2乗平均(周波数に関係なく $A^2/2$ である)の dBFS が 0 であると定義されている。例えば ADC の出力が $n_\mathrm{b}$ bit の符号付き整数であるとき $A=2^{n_\mathrm{b}-1}-1$ である。NSD を dBFS 単位で扱うときは次式がノイズの dBFS/Hz である。

\[ \lim_{|B|\to +0} 10\log_{10}\frac{P_\mathrm{n}(B)/|B|}{A^2/2} \]

dBFS/Hz は無次元量である。/Hz の次元をもつ量ではない。このことは ADC のデータ・シート等で dBFS/Hz 表記された NSD が例えば -150 dB 等と記されていることから判る。
/Hz の次元をもつ量だとして解釈すると、例えば 10 Hz の幅をもつ区間のノイズを求めようとして x 10 すると -1500 dB となるが、ノイズが却って減少しており、明らかに正しくない。

dBFS/Hz 表記された定数の NSD を基に帯域内のノイズの総量を求める方法

ある周波数区間 B に於いて NSD がほぼ一定の値 $p_\mathrm{n}$ をとるとき、B 内のノイズの総量 $S_\mathrm{noise}$ は NSD に B を掛けた値で近似される。

NSD が対数表記(例えば dBFS/Hz)されている場合は取り扱いに注意を要する。結論から言えば $p_\mathrm{n}$ の対数表記を $\tilde{p}_\mathrm{n}$ [dBFS/Hz] とすると $\tilde{p}_\mathrm{n} + 10\log_{10} \parens{B/\mathrm{Hz}}$ で近似される。計算過程は次式である。

\[ \begin{align*} S_\mathrm{noise} [\mathrm{dBFS}] &= 10\log_{10}\frac{p_\mathrm{n}\times B}{A^2/2} = 10\log_{10}\frac{p_\mathrm{n}\mathrm{Hz}\times B/\mathrm{Hz}}{A^2/2} \\ &= 10\log_{10}\frac{p_\mathrm{n}\mathrm{Hz}}{A^2/2} + 10\log_{10}\parens{B/\mathrm{Hz}} \\ &= \tilde{p}_\mathrm{n} + 10\log_{10} \parens{B/\mathrm{Hz}} \tag{1} \end{align*} \]

この式は両辺ともに無次元量である。

ノイズが占めるビットの数

\[ \newcommand{\fsamp}{f_\textrm{s}} \newcommand{\Tsamp}{T_\textrm{s}} \]

ADC のサンプリング周波数を $\fsamp>0$ とする。

信号が実数値であるから、周波数スペクトラムは Hermite 対称である。

以下ではサンプリングしたデータをディジタル低域通過フィルタ (LPF) に通し、ADC の帯域 $B_\text{ADC} \coloneqq [-\fsamp/2,\fsamp/2]$ から2乗和の意味で左右対称な通過域 $B_\text{LPF} \coloneqq [-B/2,B/2]\;(0<B<\fsamp/2)$ で信号を取り出す場合を考える。

LPF を通過するノイズの総量は NSD から計算できる。

ADC のデータ・シートでは $[-\fsamp/2,\fsamp/2]$ が数個の区間に分割され、それぞれの区間での平均 NSD [dBFS] が記載されていることが多い。

前記「dBFS/Hz 表記された定数の NSD を基に帯域内のノイズの総量を求める方法」で述べた方法で $B_\text{LPF}$ に於けるノイズ総量を小区間 $B_0,\dots,B_{N-1}\;(N\in\naturalNumbers)$ 毎に計算し、さらにそれらを合算すればノイズ総量 $S_\mathrm{noise}$ が dBFS 表記で得られる。合算に際しては次式を用いる(対数の中の分母の値は前記の $A^2/2$ であるが、計算を進めると途中で相殺して消える)。

\[ S_\mathrm{noise}\text{ [dBFS]} = 10\log_{10}\sum_{n=0}^{N-1} 10^{\tilde{p}_n/10} \tag{2} \]

ここに $\tilde{p}_n$ は区間 $B_n$ に於けるノイズ総量の dBFS 表記である。

$B_\text{LPF}$ に帯域制限されたノイズの信号 $s_\mathrm{noise}$ の標準偏差を $\sigma_\mathrm{noise}$ とすると次式が成り立つ。

\[ \begin{align*} 10\log_{10}\frac{\sigma^2_\mathrm{noise}}{A^2/2} &= S_\mathrm{noise} \text{ [dBFS]} \\ \sigma_\mathrm{noise} &= \frac{A}{\sqrt{2}}\times 10^{S_\mathrm{noise}/20} \tag{3} \end{align*} \]

ADC から得たデータのうち、ノイズに占有されている下位ビットの数は非整数を許せば $\log_2 (1+\sigma_\mathrm{noise})$ である($\log_2 \sigma_\mathrm{noise} + 1$ ではない。これでは負の値をとり得る)。

複素数値信号の場合

2個の ADC と Numerical Controlled Oscillator Multiplier (NCOM) を用いて複素数値信号を生成する機能が備わったデバイスでは、取得したデータの周波数スペクトラムが $[-\fsamp/2,\fsamp/2]$ の区間であらゆる形状を取り得る。データ・シートに於いては NSD が 0 Hz から $\fsamp\text{ [Hz]}$ の範囲で記載される。

複素数値信号に於いては、フル・スケールの正弦波 $A\exp(i2\pi f n\Tsamp)$ ($\Tsamp = 1/\fsamp$ はサンプリング周期, $f$ は正弦波の周波数)の自己相関の時間平均は周波数に関係なく $A^2$ である。

また、ノイズの信号は無相関で統計的な性質が等しい実部と虚部がある。そこで実数値信号の場合の議論で $A^2/2$ であった部分を全て $A^2$ に置き換え、$\sigma^2_\mathrm{noise}$ とあった部分を全て $2\sigma^2_\mathrm{noise,re} = 2\sigma^2_\mathrm{noise,im}$ に置き換えれば、複素数値信号の場合の結果が得られ、式(1), (2), (3)が引き続き成り立つ。

取り込んだ離散時間信号を帯域制限した場合

ここでは次を仮定する:

  1. 信号は複素数値であり、実数,虚数成分のノイズの総量は等しい。
  2. 上述の方法により、実部,虚部成分それぞれに於いてノイズが占める下位ビットの幅 $B_{\text{noise},0}$ が解っている。
  3. 取り込んだ信号のノイズの周波数スペクトラムは平坦とみなせる。

このとき、取り込んだ信号を LPF に通して帯域を $r_\text{pass}\in [0,1]$ 倍したときのノイズが占める下位ビットの幅 $B_{\text{noise},1}$ は以下のようにして求められる。

帯域が制限されたことにより、仮定 3 からノイズ総量が $r_\text{pass}$ となる。これと仮定 1 より、実数,虚数成分のノイズの総量がともに $r_\text{pass}$ 倍となる。ノイズの振幅で見れば $\sqrt{r_\text{pass}}$ 倍となる。よって $B_{\text{noise},1} = B_{\text{noise},0} + \log_2 \sqrt{r_\text{pass}}$ である。

投稿者: motchy

An embedded software and FPGA engineer for measuring instrument.

コメントを残す