ADCの分解能計算とサンプリングについて考えてみた

<!-- ----------------------------------------------------------------------------------- -->
# 目次
1. はじめに
2. ADC is 何
3. 分解能について
4. サンプリングについて
    1. 標本化定理(サンプリング定理)
    2. ナイキスト周波数
    3. エイリアシング
    4. オーバーサンプリング
    5. アンダーサンプリング
5. おわりに

<!-- ----------------------------------------------------------------------------------- -->
# はじめに

ADCの使い方全然わからん。。。<br>そもそもサンプリング定理の理解もおぼつかない。。。

となったので、ADCの分解能とサンプリング定理について調べてまとめてみました。

<!-- ----------------------------------------------------------------------------------- -->
# ADC is 何

Analog to Digital Converter 略して、ADC。<br>
アナログの電気信号をデジタルの電気信号に変換してくれる回路のことを指します。

ADCの信号の受けにはオペアンプがいまして、コンパレータとして使用されます。<br>
コンパレータは、反転入力端子と非反転入力端子に入力された信号を見て High か Low を出力するのですが、端子に入力される信号を電圧ごとに区切ってやることで、複数bitの信号出力が可能となります。<br>
この「コンパレータを使ってアナログ信号を特定の電圧ごとに区切って複数bitの信号に変換を行う回路」のことを、一般にADCと呼んでいるわけです。

アナログ信号はデジタル回路に直接入力することができないので、ADCを用いて量子化を行い、デジタル信号に変換してから入力しています。<br>
センサーや無線信号なんかはアナログ信号ですから、ADCを使ってデジタル信号に変換してやることで、データとして解釈が可能となるわけですね。

### 追記_2024/12/21

以下にADCの一例を示します。

![ADCの分解能計算について考えてみた-ADCのブロック図.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774480/6a3ad72b-7868-9b1a-b45e-d4576768c40e.png)

参考図の資料は、以下になります。

[ベーシック・リニア・デザイン_第6章:コンバータ][ベーシック・リニア・デザイン_第6章:コンバータ]

<!-- ----------------------------------------------------------------------------------- -->
# 分解能について

ADCはサンプリング時のbit数によって分解能が決まっています。<br>
例えば、0V～5Vの入力で10bitのサンプリングを行うADCの場合、5Vを $2^{10} = 1024$ 通りに分割して解釈します。<br>
このとき、「00_0000_0001」のことを1LSBなんて言ったりすることがあります。<br>
(1LSBは1bitとは違います。6LSB だとか 114LSB だとか 386LSB などの10bitの中で好きな値を取るときに用いる表現で、bit数とは考え方が異なります。)

:::note warn
ここで問題になるのが、割る数を ***「1024とする」*** のか ***「1023とする」*** のかです。
:::

もちろんADCの構造によるので、どちらの方が正しいと言い切ることはできませんが、**ADCに構造的な制約がないと仮定した場合に「1024とする」のと「1023とする」のはどちらが正しいか**、という話です。

1024とする場合は、0も含めて0～1023まで分割するつもりで計算しています。<br>
対して1023とする場合は、デジタル表現の最大値が「11_1111_1111」(10進数で1023)であることから、「マイナスの0を省いて考えるから1023通りじゃん！！」と解釈する、または「0は0であって幅を持つのはおかしい」と解釈して、1023で割るつもりで計算しています。

```math
\frac{5[V]}{1024} = 4.8828... [mV]
```

```math
\frac{5[V]}{1023} = 4.8875... [mV]
```

どちらが正しいか、ちゃんと考えてやればわかりますが、

:::note info
正解は ***「1024」*** で割るのが正しいです。
:::

10bitADCの「00_0000_0000」と「00_0000_0001」の間は、電圧を持ちます。ADCの0というのは、0Vのみを指す値ではなく、$0V ～ 4.8828... [mV]$ 未満の電圧値を表します。<br>
考え方としては、数学的に言えばガウス記号を使ってグラフ上にプロットしています。工学的に言えばスレッショルド電圧みたいなもので、1bitのON/OFFの問題だと思います。
1023で割ってしまうと0の扱いがおかしいので、間違いに気が付くと思います。<br>
ただインターネットを見ると、1023で割るのか1024で割るのか、解釈が人によって分かれていますね。。。

### 追記_2024/12/01

![ADCの分解能計算について考えてみた-分解能について.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774480/d471743a-b585-6403-7505-5d7de34f4804.png)

### 追記_2024/12/29

ここで言いたいのは、**ADCのデータシートをしっかりと読みましょう**、ということです。<br>
ADCの構造としては、$2^N-1$ が正しいですが、エンコーダを挟んでデジタルデータが $2^N$ に調整されているADCがあります。<br>
また、エンコーダーで $2^N$ に調整されていても、MSBが1のときにマイナスを取るADCに関しては、マイナスのゼロを考える必要があるため、「$2^N-1$ を使用しなさい」とデータシートに記載されていることがあります。<br>
このように、ADCの構造によって動作が異なるため、自分がどんなADCを使用しているのか、しっかりとデータシートの確認をするようにしましょう。

<!-- ----------------------------------------------------------------------------------- -->
# サンプリングについて

アナログ信号を一定時間毎に量子化することを「サンプリング」と言います。<br>ADCは、アナログ信号をサンプリングしてデジタル信号の列に変換しています。

とても良い参考↓<br>[やる夫で学ぶディジタル信号処理](http://www.ic.is.tohoku.ac.jp/~swk/lecture/yaruodsp/main.html)

サンプリングした波形を以下に示します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774480/606a48b9-5da5-c161-b7ef-12bee3e9a014.png">

サンプリングする点が少ないほど波形はギザギザになります。

:::note warn
「サンプリング定理を満たせていれば、元の信号を復元できる」とされていますが、実際に波形を見てみると、1周期に4点くらい点があっても、元の波形のHighかLowかくらいしか判別できなさそうです。(追記_2024/12/29)
:::

<!-- ----------------------------------------------------------------------------------- -->
## 標本化定理(サンプリング定理)

:::note warn
「離散的な信号を連続的な信号に変換する」または「連続的な信号を離散的な信号に変換する」ことを考えると、「元の信号の情報が跡形もなくなっているのに、元に戻すことなんて可能なのか？」という疑問が出てきます。
:::

:::note info
その疑問に数学的に答えた定理が **標本化定理(サンプリング定理)** となります。<br>
:::

これのすごいところは、この定理さえ守っていれば、「連続的な変化を離散的な変化に変換すること」、「離散的な変化を連続的な変化に変換すること」を許している、ということです。

概要はこちら↓

https://ja.wikipedia.org/wiki/%E6%A8%99%E6%9C%AC%E5%8C%96%E5%AE%9A%E7%90%86

:::note info
要は、サンプリングで基準としている時間の2倍の時間を超えた信号であれば完全に復元できると言っています。
:::

例えば、1秒ごとにサンプリングしているのであれば、2秒よりちょっと長い時間信号を保持すれば、サンプリング前の信号を復元できるというわけです。

工学的には、基準信号の周波数で考えるので、逆数を取ることになります。1Hzの信号は、2Hzを超える基準信号でサンプリングすることで、復元が可能となります。

これを守らないとどうなるかというと、

:::note alert
「エイリアシング」という現象が発生して、元の波形を復元することができなくなります。
:::

ここで、**サンプリングに使用する基準信号の周波数** に **「サンプリング周波数」** と名前を付けます。

<!-- ----------------------------------------------------------------------------------- -->
## ナイキスト周波数

ナイキスト周波数というのは、**サンプリング周波数の半分の周波数のこと**を言います。<br>
サンプリング定理を満たす周波数というのは、ナイキスト周波数がサンプリングしたい信号の周波数よりも大きくなければいけません。

結構重要な概念ですね。

<!-- ----------------------------------------------------------------------------------- -->
## エイリアシング

サンプリング定理を守らなかった結果発生する信号の歪みです。<br>エイリアシングが発生すると、どうあがいても元に戻せません。

ここに書かれていますね↓<br>[やる夫で学ぶディジタル信号処理_5. 離散時間フーリエ変換](http://www.ic.is.tohoku.ac.jp/~swk/lecture/yaruodsp/dtft.html)<br>[やる夫で学ぶディジタル信号処理_10. サンプリング定理](http://www.ic.is.tohoku.ac.jp/~swk/lecture/yaruodsp/sampling.html)

サンプリングすると、周波数領域に周期的なスペクトルが現れるので、サンプリング定理を守ってやればエイリアシングは原理上発生しない、というわけですね。

つまり、

:::note info
アナログ信号の情報を持つデジタル信号は、周波数領域に周期的なスペクトルを持つ信号
:::

ということになりますね。[^1]

<!-- ----------------------------------------------------------------------------------- -->
## オーバーサンプリング

ナイキスト周波数を信号の周波数よりも大きくすると、エイリアシングしなくなる、という話をしました。<br>
じゃあ、ナイキスト周波数をもっと大きくしていったらどうなるかというと、元の波形を細かくサンプリングしていくことになりますから、量子化で発生する誤差は小さくなっていきます。したがって、元の波形を復元した時に発生するノイズは小さくなっていくことになります。<br>
これを **オーバーサンプリング** と言います。

### 追記_2024/12/01_2024/12/15

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774480/80cb7acd-9c39-6784-2a4b-00a14810652d.png">

上図を見てわかる通り、1周期4点の波形より1周期16点の波形の方が滑らかな波形であることがわかります。
したがって、オーバーサンプリングにより、量子化誤差が小さくなっていることがわかります。(波形の最後の点は、2周期目の最初の点です。)

### 追記_2024/12/29

サンプリング周波数の範囲で発生するノイズは一定であるため、オーバーサンプリングでサンプリング周波数を高くすると、サンプリング周波数の範囲に含まれるノイズの大きさは下がります。

<!-- ----------------------------------------------------------------------------------- -->
## アンダーサンプリング

では、ナイキスト周波数を信号の周波数よりも小さくしていったらどうなるでしょうか？<br>
「サンプリング定理があるのだから、考えるだけ無駄。エイリアシングが発生して元の信号が復元できなくなるだけでは？」<br>
などと考えてしまいますが、違います。

ここ↓ に書かれていますが、周波数領域では繰り返しが発生しています。<br>[やる夫で学ぶディジタル信号処理_10. サンプリング定理](http://www.ic.is.tohoku.ac.jp/~swk/lecture/yaruodsp/sampling.html)

アンダーサンプリングは、まず元の信号の周波数に対してサンプリング定理を満たすようにサンプリング周波数を設定します。<br>
次に、そのサンプリング周波数の半分であるナイキスト周波数の中に元の信号の周波数が収まるようにしながら、ナイキスト周波数の整数倍となるようにサンプリング周波数を変更すればよいわけです。<br>
こうすることによって、ナイキスト周波数と元の信号の周波数がエイリアシングの発生しない関係性を保ったまま、サンプリング周波数を高くしたり低くしたりすることができるってわけです。<br>
この操作により、アナログ回路側に周波数を変換する **ミキサー(乗算器)** という回路を追加せずに、サンプリングした信号の周波数を変更することができます。(修正_2024/12/29)

これはすごいことです。インチキです。<br>
例えば、100MHzの信号をサンプリング周波数50MHzの基準信号でサンプリングしてもエイリアシングが発生せずに復元可能と言っています。

これを聞くと、サンプリング定理の「信号の周波数よりも基準信号の周波数(サンプリング周波数)を高く設定しましょう」という話はなんだったのかと問いただしたくなります。

…まあ、サンプリング定理の理解が雑なんですよね。<br>
「信号の周波数よりも基準信号の周波数(サンプリング周波数)を高く設定しましょう」というのは、**元の信号の周波数がサンプリング周波数まで** の限定的な範囲のお話だったわけです。

復元後の信号の周波数まで、元の信号の情報を残したいと考えるのであれば、「信号の周波数よりも基準信号の周波数(サンプリング周波数)を高く設定しましょう」で良いわけですが、**「復元後の信号の周波数が変わっても相似な波形が取り出せれば良い」** と考える人は、考え方を変える必要があります。<br>
元の信号の周波数がサンプリング周波数よりも高い周波数の場合、サンプリング定理をもう少し丁寧に見ていくと、「***元の信号の帯域*** の 2 倍を超える周波数でサンプリングすれば、元の波形を復元できる」となることがわかります。<br>
要約すれば、**「復元した後の信号の周波数がナイキスト周波数未満となるようにサンプリング周波数を設定する」** ということです。

というわけで、

:::note info
**「復元した後の信号の周波数がナイキスト周波数未満となるようにサンプリング周波数を設定する」ことができれば、サンプリング周波数の整数倍の範囲で元の信号の周波数を高くしたり低くしたりすること**
:::

ができます。[^2][^3]

この原理を使って、サンプリング周波数よりもはるかに高い周波数の元の信号を、ナイキスト周波数以内の信号にダウンコンバージョンしながらサンプリングすることを **「アンダーサンプリング」** と言います。<br>
また、この技術はダイレクトコンバージョン方式の受信機に使われる技術となります。(修正_2024/12/29)

以下に、エイリアシングの影響を無視して信号の周波数を上げていったときの例を示します。(追記_2024/10/31)

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774480/2e3ba32d-9c4c-a3f1-fe79-f215a82ad212.png">

上図は、1周期32回のサンプリングで固定して、信号の周波数を2の累乗倍していった結果です。<br>したがって、ナイキスト周波数は16回となります。

ここで自分が言いたいことは、「元の信号の周波数を高くしていくと、イメージ信号の復元波形がサンプリング周波数を基準に変化するよ」ということです。**図からわかることとしては、サンプリング周波数を基準として周期的に変化していることがわかります。**(追記_2024/12/15)

:::note info
信号の周波数を高くしていくと、復元後の信号の周波数が高くなっていて、サンプリング定理を満たせない周波数を設定するとエイリアシングが発生しています。
:::

以下に、アンダーサンプリングの例を示します。(追記_2024/10/31)

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774480/691f2b4d-9653-07db-06ff-e8ecfd1aa219.png">

上図は、1周期32回のサンプリングで固定して、信号の周波数を2の累乗倍していった結果です。<br>したがって、ナイキスト周波数は16回となります。

ここで自分が言いたいことは、**「エイリアシングの影響で元の波形が復元できない状態にならなければ、どんなに高い周波数の信号であってもサンプリング周波数を基準とした1倍の周波数の波形まで、信号の周波数を落とすことが可能である」** ということです。実際には、ADCの構造上の問題から周波数の上限が決まりますが、決まった範囲の信号であれば、問題なく変換できます。(追記_2024/12/15)

:::note info
信号周波数の1倍～15倍までをひと固まりとして変化。<br>17倍～31倍までで、1倍～15倍を鏡写しにしたように変化する。<br>また、0倍と16倍と32倍は、直流信号となる。(修正_2024/12/15)
:::

:::note warn
グラフを見ると、ナイキスト周波数の半分未満の周波数に抑えたときに、歪みなく変換できそう。
:::

また、周波数がマイナスの例を示します。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774480/f1e6af85-d328-e88d-8ce3-fe8eac537842.png">

復元後の信号の位相が反転していますね。

つまり、

:::note info
サンプリング周波数をマイナスに設定すると、復元後の信号は位相が反転する
:::

わけですね。[^4][^5]

### 追記_2024/10/28

https://kobaweb.ei.st.gunma-u.ac.jp/news/pdf/koba20071011rev.pdf

https://www.laser-sensing.jp/24thLSS/24th_o_papers/D-8ohishi.pdf

https://ja.wikipedia.org/wiki/%E6%8A%98%E3%82%8A%E8%BF%94%E3%81%97%E9%9B%91%E9%9F%B3

このあたりの内容を読むと、積極的に折り返しを発生させることで、アンダーサンプリングが行えると書かれています。

折り返しを発生させるとエイリアシングが発生する場合があるため、帯域制限フィルタを付けることでエイリアシングの影響を取り除きます。

エイリアシングが発生しないように、ADCの入力側にフィルタを付ける場合は、このアナログ側に設置するアナログフィルタを「アンチエイリアシングフィルタ」と呼びます。これに対して、ADCのデジタル側に付けるデジタルフィルタには特に名前がありません。

サンプリングする信号とサンプリングの基準信号によっては、デジタルフィルタを設置して帯域制限を行うことで、エイリアシングの影響を取り除くことができます。しかし、場合によってはデジタルフィルタで実装不可能なレベルの急峻な特性が求められることがあり、この場合はエイリアシングを完全に取り除くことができません。

つまり、「アンチエイリアシングフィルタ」というのは、**「元の信号にノイズが混じった場合、フィルタで取り除けますよ」** ということが言いたいのであって、**元の信号とサンプリング周波数の関係性によって発生するエイリアシングは、アンチエイリアシングフィルタによって取り除くことができません。** デジタルフィルタを用いて無理矢理エイリアシングの影響を除去することも考えられますが、デジタルフィルタの特性を考えると限度があります。

したがってこの場合は、サンプリングする信号とサンプリングの基準信号の関係を変えて、原理上エイリアシングが発生しないように、設定し直してやる必要があるわけです。

この「原理上エイリアシングが発生しない条件」が、**「復元した後の信号の周波数がナイキスト周波数未満となるようにサンプリング周波数を設定する」ことができれば、サンプリング周波数の整数倍の範囲で元の信号の周波数を高くしたり低くしたりすることが可能** となるわけです。

### 追記_2024/12/01

![ADCの分解能計算について考えてみた-エイリアシングについて.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774480/d2f68ecb-de8f-6854-7910-883e516dcc51.png)

上図の赤三角部分はエイリアシングが発生する部分です。
図を見ると、サンプリング定理から、隣の帯域の信号よりもゲインが大きければ、元の信号を復元できるということがわかります。
つまり、ゲインの大きさが切り替わるナイキスト周波数では、第一ナイキストゾーンの信号も第二ナイキストゾーンの信号も復元できないということです。
オーバーサンプリングをすると、エイリアシングの小さい内側に信号が遷移するため、信号が滑らかになるわけですね。

### 追記_2024/12/29

マイナスの周波数が反転した信号となるのは、電気信号が複素数で表現可能なのでオイラーの公式で表現することができるからです。つまり、ネイピア数の右肩に乗る変数にマイナスが付くので、複素平面上を動くグラフが逆回転することになり、信号が反転するわけですね。

<!-- ----------------------------------------------------------------------------------- -->
# おわりに

ここまで調査したのですが、ADCによってはマイナスの値を取ったときにMSBが 1 となるようにロジックが組まれているものもあります。<br>この場合、マイナスの0が生まれるので、10bitADCの場合1023で正しいわけです。<br>なので「ADCに構造的な制約がないと仮定した場合」と注釈が付きました。

また、サンプリング定理の数学的な理解が追い付いていないので、アンダーサンプリングの理論的な説明が雑です。<br>どなたか、助言をいただけますと、助かります。。。

まあ、総評して「ADCよくわからん」！！

## 追記_2024/12/15

申し訳ないのですが、信号の波形の例示で、1点少なく計算を行っていたため、嘘の波形となっていました。
計算をやり直して、正しい波形をアップロードし直したので、確認してください。

<!-- ----------------------------------------------------------------------------------- -->
<!-- 注釈 -->

[^1]: …この **周波数領域に周期的なスペクトルを持つ信号** って時間領域に変換するとアナログ信号的にはどうなるんでしょうね？
サンプリングした点を通るような信号が1周期以内であればどの周波数まで入っても復元可能とか…？
…ん？それって、デジタル信号の1CLKは $0～2π$ の位相変化しか許されていないってことになるのでは…？
そうなると、アナログ信号に変換した際に1周期以上位相をズラしたい場合は、デジタル信号で1CLK Delayする必要がある…？
~~しかもそれってデジタルデータの加算だからフィードバックじゃね？~~
よくよく考えたらそれ以降のデータも1CLK Delayするのだから、フィードバックは成り立たないですね。。。
ただ、「1CLK前の情報を保持して次の周期に加算するとフィードバックとなる」という考え方は大切そうです。→デジタルフィルタ

[^2]: つまり、サンプリング定理というのは、「**サンプリング前の信号の周波数** がサンプリング定理を満たしているか」ではなく、「**復元後の信号の周波数** がサンプリング定理を満たしているか」を見ているわけですね。

[^3]: ちなみに、サンプリング定理を守った状態で、ある信号をサンプリング周波数fsでサンプリングしたときに、復元後の信号の周波数をfcとすると、
第一ナイキストゾーンにあるべき信号の周波数は+fc
第二ナイキストゾーンにあるべき信号の周波数は-(fs-fc)
第三ナイキストゾーンにあるべき信号の周波数は+(fs-fc)
第四ナイキストゾーンにあるべき信号の周波数は-(2fs-fc)
となる。周波数設定の参考(第四ナイキストゾーンの周波数設定間違っていません？これ…)→ [PG269][PG269]
~~つまり、100MHzの信号を低い周波数でサンプリングするのであれば、サンプリング周波数60MHzで20MHzの同相の信号にダウンサンプリングできる、と計算できます。~~
~~第五ナイキストゾーンからのダウンサンプリングとなります。~~
~~→計算やり直し中~~
100MHzの信号を低い周波数でサンプリングするのであれば、サンプリング周波数60MHzで20MHzの逆相の信号にダウンサンプリングできる、と計算できますね。
第四ナイキストゾーンからのダウンサンプリングでした。
また、サンプリング周波数を40MHzに設定すると、サンプリング定理に引っかかって100MHzのサンプリングが出来なさそうですね。

[^4]: サンプリングすると、元の信号に対して、同相の信号のイメージと、逆相の信号のイメージができます。
これは、サンプリング周波数を中心とした変調波のように信号ができるため、サンプリング周波数の整数倍の上と下にイメージがくっついて遷移します。
この遷移してくる帯域を「ナイキストゾーン」と呼び、元の信号に近い周波数の側から、第一ナイキストゾーン、第二ナイキストゾーン・・・と呼びます。
したがって、奇数側は同相、偶数側は逆相の信号となります。
このとき、ナイキストゾーン1つ分の帯域幅が「ナイキスト周波数」となります。アナデバの [MT-002][MT-002] とか読みましょう。

[^5]: 今回はADCのお話を最初にしていたため、サンプリング定理についてもADCに内容を寄せました。
~~ではDACの場合、アンダーサンプリングがどうなるかというと、サンプリング周波数を適切に設定すれば、元の波形を復元できるどころか、元の波形よりも高い周波数の信号を出力することが可能となります。~~
アンダーサンプリングはアナログ信号を低い周波数でサンプリングすることによって、ダウンコンバートすることが肝なので、DACには適用されませんでしたね。。。間違っていました。申し訳ありません。
DACはデジタル側で帯域制限してやれば、高い周波数も低い周波数も再生できます。したがって、高い周波数の信号を出力するには、高いサンプリング周波数で動作可能なDACが必要になりますね。(追記_2024/11/04)

<!-- ----------------------------------------------------------------------------------- -->
<!-- 参考文献 -->
[PG269]: https://docs.amd.com/r/en-US/pg269-rf-data-converter/NCO-Setting-Example
[MT-002]: https://www.analog.com/media/jp/training-seminars/tutorials/mt-002_jp.pdf
[ベーシック・リニア・デザイン_第6章:コンバータ]:https://www.analog.com/media/jp/training-seminars/design-handbooks/basic-linear-design/EDCh_6_Converter_jp.pdf