SAR型A/D変換器とは
SAR (Successive Approximation Register)型A/D変換器は、アナログ信号をデジタル信号に変換する回路の一種です。この方式は、高速な動作が可能でありながら、回路規模が比較的小さいため、特に低消費電力が求められる携帯機器やIoTデバイスで広く利用されています。
SAR型A/D変換器は、以下の3つの主要なブロックで構成されます。
- コンパレータ: 入力されたアナログ電圧と、D/A変換器から出力された基準電圧を比較し、どちらが大きいかを判断します。
- D/A変換器: デジタル信号をアナログ電圧に変換します。
- SARレジスタ: コンパレータの比較結果に基づいて、最適なデジタル値を探索します。これは、最上位ビット(MSB)から順に、1ビットずつデジタル値を決定していく方式です。
ノイズシェイピングとは
ノイズシェイピングは、信号の量子化によって生じる量子化ノイズを、目的の信号帯域から除去する技術です。具体的には、ノイズを聴覚や信号処理において重要でない高い周波数帯域へ意図的に移動させます。
これにより、必要な信号帯域のノイズレベルが大幅に低減し、**信号対雑音比(SNR)**が向上します。これは、音質が重要なオーディオ機器や、高分解能が求められる計測機器などで特に有効な技術です。
SAR型A/D変換器へのノイズシェイピングの応用
この技術解説の核心は、SAR型A/D変換器にノイズシェイピング機能を統合することで、高分解能と低消費電力を両立させる点にあります。
仕組み
従来のSAR型A/D変換器は、高分解能化(ビット数を増やす)すると、回路の複雑さが増し、消費電力も増加する傾向がありました。この課題を解決するため、ノイズシェイピングの考え方が取り入れられました。
- 量子化誤差のフィードバック: この回路では、前のサンプリングで発生した量子化誤差を、オペアンプと容量(コンデンサ)を用いて保持します。
- 誤差の差分処理: 保持された量子化誤差は、次のサンプリングの際に、新しい入力信号にフィードバックされます。これにより、出力信号は、入力信号と、一つ前の量子化誤差の「差分」として生成されます。
- ノイズの整形: この「差分処理」が、数学的には**$(1-z^{-1})$**という1次ノイズシェイピング特性を生み出します。$z^{-1}$は1クロック遅延を表し、1つ前の時点の値を参照することを意味します。結果として、量子化ノイズは低周波数帯から高周波数帯へと押しやられ、必要な信号帯域のノイズが低減されます。
利点と課題
- 利点: この技術により、ビット数を大幅に増やさなくても、実効的な分解能を高めることができます。これにより、SAR型A/D変換器の低消費電力という利点を活かしたまま、高い性能を実現できます。
- 課題: ノイズシェイピング機能を導入するためには、通常、オペアンプが必要となり、その分消費電力が増加する可能性があります。しかし、この解説では、バイパス構成などの回路工夫により、低消費電力化が図られていることも報告されています。
この技術は、高機能でありながらバッテリー駆動が前提となるモバイル機器やセンサーネットワークにおいて、非常に重要な役割を果たしています。
# Program Name: sar_ns_adc_fft.py
# Creation Date: 20250919
# Overview: FFT analysis of SAR ADC with 1st-order noise shaping
# Usage: Run in Python. It will plot time-domain signals and FFT spectrum.
!pip install numpy matplotlib scipy
import numpy as np
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq
# ======================== Parameters / パラメータ ========================
fs = 1000 # Sampling frequency [Hz]
Ts = 1/fs
f_in = 10 # Input sine frequency [Hz]
N = 1024 # Number of samples (FFT用に大きく)
A = 0.9 # Input amplitude
n_bits = 3 # SAR resolution
Vref = 1.0 # Reference voltage
# ======================== Input Signal ========================
t = np.arange(N) * Ts
x = A * np.sin(2*np.pi*f_in*t)
# ======================== SAR + Noise Shaping ========================
q_step = 2*Vref / (2**n_bits) # Quantization step
e_prev = 0.0
y_out = []
errors = []
for n in range(N):
x_eff = x[n] - e_prev
d = np.round(x_eff / q_step) * q_step
d = np.clip(d, -Vref, Vref - q_step)
e = x_eff - d
y_out.append(d)
errors.append(e)
e_prev = e
y_out = np.array(y_out)
errors = np.array(errors)
# ======================== FFT ========================
def compute_fft(signal, fs):
N = len(signal)
yf = fft(signal * np.hanning(N)) # 窓関数あり
xf = fftfreq(N, 1/fs)[:N//2]
spectrum = 20*np.log10(np.abs(yf[:N//2]) / (N/2))
return xf, spectrum
xf_in, sp_in = compute_fft(x, fs)
xf_out, sp_out = compute_fft(y_out, fs)
xf_err, sp_err = compute_fft(errors, fs)
# ======================== Plot ========================
plt.figure(figsize=(12,8))
# 時間領域
plt.subplot(2,1,1)
plt.plot(t[:200], x[:200], label="Input sine")
plt.step(t[:200], y_out[:200], where="post", label="Output (NS SAR)")
plt.plot(t[:200], errors[:200], label="Error (shaped)")
plt.xlabel("Time [s]")
plt.ylabel("Amplitude")
plt.title("Time-domain signals (first 200 samples)")
plt.legend()
plt.grid(True)
# 周波数領域
plt.subplot(2,1,2)
plt.plot(xf_in, sp_in, label="Input sine")
plt.plot(xf_out, sp_out, label="Output spectrum")
plt.plot(xf_err, sp_err, label="Error spectrum")
plt.xlim(0, fs/2)
plt.ylim(-100, 0)
plt.xlabel("Frequency [Hz]")
plt.ylabel("Magnitude [dB]")
plt.title("FFT Spectrum (Noise Shaping Effect)")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
解説
-
サンプリング周波数 fs = 1000 Hz、入力サイン波は 10 Hz。
-
SAR ADC は 3ビット量子化を想定。
-
量子化誤差 $e(n)$ をフィードバックして次のサイクルの入力に加えることで、
出力は$$
D_{out}(n) = V_{in}(n) + e(n) - e(n-1)
$$の関係を再現。
-
誤差が「差分」として扱われるため、**低周波成分では誤差が抑圧される(ノイズシェーピング)**ことがわかる。