디지털 필터링 — ADC 뒤에서

한 줄 요약 — ADC 뒤에서는 필터가 공짜에 가깝고 정확합니다. 그런데 안티에일리어싱만은 여기서 절대 못 합니다 — 접힌 신호는 되돌릴 수 없습니다.


어디까지가 아날로그의 몫인가

이 자료는 지금까지 필터를 전부 아날로그로 다뤘습니다. ADC 뒤에서는 사정이 다릅니다.

아날로그 필터디지털 필터
부품 오차±1~10 %0
온도 드리프트있음0
급준함차수만큼 부품이 늘어남계수만 늘면 됨
위상 선형어려움FIR 이면 정확히
바꾸기납땜숫자만
값부품값계산 시간
에일리어싱✅ 막을 수 있음❌ 절대 못 함

마지막 줄이 전부입니다.

왜 에일리어싱만은 아날로그라야 하나

샘플링은 fsf_s 위의 성분을 fsf_s 아래로 접어 넣습니다 (13-06).

falias=∣fin−nfs∣f_{alias} = |f_{in} - n f_s|
기호
f_alias주파수 (alias)frequency (alias)Hz
f_in입력 주파수input frequencyHz
f_s샘플링 주파수sampling frequencyHz
n비트 수 또는 개수number of bits or count

접힌 뒤에는 원래 신호와 구분이 안 됩니다. 1 kHz 로 샘플링하는데 999 Hz 잡음이 들어오면 1 Hz 로 나타나고, 그것이 진짜 1 Hz 신호인지 접힌 999 Hz 인지 알 방법이 없습니다.

⚠️ 디지털 필터는 이미 접힌 것을 못 풉니다. 정보가 사라진 것이지 가려진 것이 아닙니다. 아날로그 안티에일리어싱 필터는 필수이고 생략할 수 없습니다.

★ 그런데 오버샘플링이 그 부담을 크게 덜어 줍니다 — 아래에서 봅니다.


이동평균 — 가장 단순하고 가장 많이 쓰입니다

y[n]=1N∑k=0N−1x[n−k]y[n] = \frac{1}{N}\sum_{k=0}^{N-1} x[n-k]
기호
k결합 계수 또는 상수coupling coefficient or constant
n비트 수 또는 개수number of bits or count
N개수count

장점: 곱셈이 없습니다. 나눗셈도 NN 을 2의 거듭제곱으로 하면 시프트입니다.

잡음이 얼마나 주나

무작위 잡음은 N\sqrt N 로 줍니다.

NN잡음 감소dB
42배6
164배12
648배18
25616배24

★ 4배마다 6 dB 입니다. 이 자료가 잡음 예산에서 계속 쓰는 \sqrt{} 관계 그대로입니다.

주파수 응답 — 싱크 함수

∣H(f)∣=∣sin⁡(πfNT)Nsin⁡(πfT)∣|H(f)| = \left|\frac{\sin(\pi f N T)}{N\sin(\pi f T)}\right|
기호
f주파수frequencyHz
N개수count
T온도 또는 주기temperature or period

모양이 좋지 않습니다.

특징값
−3 dB 주파수0.443 fs/N0.443\,f_s/N
첫 사이드로브−13 dB 뿐
완전 감쇠(널)fs/Nf_s/N 의 정수배

사이드로브가 −13 dB 밖에 안 됩니다. 저지대역의 잡음이 22 % 나 그대로 통과합니다. 급준한 차단이 필요하면 이동평균으로는 안 됩니다.

★ 널을 이용하는 법

첫 널이 정확히 fs/Nf_s/N 에 있습니다. 이걸 60 Hz 에 맞추면 전원 잡음이 완전히 사라집니다.

fsN=60 Hz\frac{f_s}{N} = 60\ \text{Hz}
기호
f_s샘플링 주파수sampling frequencyHz
N개수count

fsf_s = 960 Hz 이면 N=16N=16. 60 Hz 와 그 정수배(120, 180, …)가 모두 널에 걸립니다.

💡 이것이 정밀 ADC 가 50/60 Hz 제거 기능을 광고하는 원리입니다. ΔΣ ADC 의 데이터 레이트를 16.67 ms(=1/60)의 정수배로 맞추면 전원 주파수가 통째로 지워집니다. 12-08 의 60 Hz 픽업을 하드웨어 없이 없앨 수 있습니다.


CIC — 곱셈 없는 데시메이션

이동평균을 여러 번 겹치되, 누산기와 미분기로 구현하면 곱셈이 아예 없습니다.

입력 (높은 f_s)적분기 ×N그냥 더하기만데시메이션 RR 개마다 하나만 남깁니다미분기 ×N그냥 빼기만출력 (낮은 f_s)
  • 장점: 곱셈 0, 계수 저장 0. FPGA·ΔΣ ADC 안에서 씁니다
  • 단점: 통과대역이 처집니다(싱크의 롤오프). 그래서 뒤에 보상 FIR 을 답니다

ΔΣ ADC 안에 이것이 들어 있습니다. 1비트를 MHz 로 뽑아 CIC 로 데시메이션하면 24비트가 나옵니다.


IIR — 적은 계산으로 급준하게

y[n]=a x[n]+(1−a) y[n−1]y[n] = a\,x[n] + (1-a)\,y[n-1]
기호
n비트 수 또는 개수number of bits or count

이 한 줄이 1차 RC 저역통과와 정확히 같습니다.

a=Tτ+T=1−e−T/τa = \frac{T}{\tau + T} = 1 - e^{-T/\tau}
기호
tau시정수time constants
e잡음 전압 밀도noise voltage densityV/√Hz
T온도 또는 주기temperature or period

MCU 에서 가장 많이 쓰는 필터입니다 — 곱셈 두 번, 메모리 한 칸.

FIRIIR
계산량많음 (탭 수만큼)적음
메모리탭 수차수만큼
위상정확히 선형비선형
안정성항상 안정계수에 따라 발산
아날로그와 대응없음버터워스 등을 그대로

위상이 중요하면 FIR, 계산이 아까우면 IIR. 파형의 모양을 봐야 하는 측정(심전도의 QRS, 과도 응답)에서는 위상 왜곡이 파형을 일그러뜨리므로 FIR 을 씁니다 (4-08).

⚠️ 고정소수점 IIR 은 조용히 망가집니다. 계수를 반올림하면 극점이 옮겨져 응답이 달라지고, 심하면 발산합니다. 차수가 높을수록 심해서, 2차 구간(biquad)으로 쪼개어 직렬로 잇습니다.


★ 오버샘플링 — 아날로그 필터를 싸게 만드는 법

이것이 이 문서에서 가장 값어치 있는 부분입니다.

필요한 신호 대역이 fmaxf_{max} 일 때, 아날로그 안티에일리어싱 필터는 fs−fmaxf_s - f_{max} 까지 감쇠해야 합니다.

나이퀴스트 바로 위로 샘플링하면 (2 kHz 로 1 kHz 신호):

1 kHz→1 kHz 에서 이미 충분히 감쇠1\ \text{kHz} \rightarrow 1\ \text{kHz}\ \text{에서 이미 충분히 감쇠}

전이대역이 없습니다. 8차 이상의 필터가 필요하고, 그런 필터는 부품 오차에 민감하고 위상이 심하게 휩니다.

16배 오버샘플링하면 (32 kHz):

1 kHz→31 kHz 까지 감쇠하면 됨1\ \text{kHz} \rightarrow 31\ \text{kHz}\ \text{까지 감쇠하면 됨}

전이대역이 31배 넓어집니다. 2차 필터로 충분합니다.

2배 샘플링16배 오버샘플링
아날로그 필터 차수8차 이상2차
부품 수많음적음
위상 왜곡심함적음
데이터 양적음16배 (디지털에서 줄임)
추가 분해능—2비트

남는 대역은 디지털 필터가 잘라 냅니다. 그리고 데시메이션으로 원래 데이터 레이트로 되돌립니다.

오버샘플링이 주는 덤 — 분해능

추가 비트=12log⁡2(오버샘플링 배수)\text{추가 비트} = \frac{1}{2}\log_2 (\text{오버샘플링 배수})
배수추가 비트
41
162
643
2564

12비트 ADC 를 256배 오버샘플링하면 16비트가 됩니다 — 조건이 있습니다.

⚠️ 잡음이 최소 1 LSB 는 있어야 합니다. 입력이 완벽하게 조용하면 매번 같은 코드가 나와 평균해도 그대로입니다. 역설적이지만 디더(dither) 가 필요합니다. 실제 회로에는 대개 충분한 잡음이 이미 있습니다.


⚖️ 트레이드오프

1. 하드웨어와 디지털의 분담

센서아날로그 AAF★ 2차면 충분 (오버샘플링 덕에)ADC오버샘플링디지털 필터여기서 급준하게데시메이션원하는 레이트로출력

원칙:

무엇어디서왜
에일리어싱 방지아날로그접히면 못 되돌림
큰 간섭 제거 (60 Hz 픽업이 입력을 포화시킬 때)아날로그ADC 범위를 지켜야 함
급준한 차단디지털부품 오차가 0
위상 선형디지털FIR
미세 조정디지털숫자만 바꿈

⚠️ 아날로그로 못 미루는 것 하나 더 — 간섭이 커서 ADC 입력 범위를 넘으면 디지털에서 손쓸 수 없습니다. 이미 잘린 신호이니까요. 60 Hz 픽업이 신호보다 크면 아날로그 단에서 줄여야 합니다.

2. 지연

디지털 필터는 지연을 만듭니다.

필터지연
이동평균 NN(N−1)/2(N-1)/2 샘플
FIR NN 탭(N−1)/2(N-1)/2 샘플
1차 IIR≈τ\approx \tau

제어 루프 안에 있으면 이 지연이 위상 여유를 깎습니다 (7-07). 필터를 강하게 걸수록 루프가 불안정해집니다 — 측정용과 제어용의 요구가 다릅니다.

3. 계산량 vs 전력

MCU 에서 필터는 전력을 씁니다. 배터리 기기에서는

  • 이동평균 → 덧셈 하나
  • 1차 IIR → 곱셈 둘
  • 64탭 FIR → 곱셈 64번

64배 차이입니다. 저전력 설계에서는 이동평균이나 CIC 로 데시메이션한 뒤 낮은 레이트에서 FIR 을 거는 식으로 나눕니다.


🔌 실제 쓰임새

60 Hz 를 지우는 세 가지

방법어디서특징
노치 필터 (아날로그)아날로그부품 오차로 중심이 어긋남
싱크 널디지털정확 — 레이트만 맞추면 됨
60 Hz 주기 평균디지털정확, 지연이 16.7 ms

디지털이 압도적으로 유리합니다. 아날로그 노치는 Q 가 높아야 하는데, 부품이 1 % 만 틀려도 중심이 어긋나 감쇠가 확 줄어듭니다.

고정소수점에서

  • 누산기를 넓게 — 이동평균 N=256N=256 에 16비트 입력이면 24비트 누산기가 필요합니다
  • 반올림 방향 — 늘 내림하면 DC 옵셋이 생깁니다
  • IIR 은 biquad 로 쪼갭니다

무엇을 안 하는 게 나은가

신호보다 느린 필터는 신호를 지웁니다. 이동평균 NN 의 −3 dB 가 0.443fs/N0.443 f_s/N 이므로, 신호의 가장 빠른 성분이 그보다 위에 있으면 잘려 나갑니다.

“잡음이 많으니 평균을 더 하자” 는 흔한 실수입니다. 신호도 같이 지워집니다.


⚠️ 이상과 실제의 차이

이상실제왜
디지털 필터는 완벽계수 반올림으로 응답이 달라짐고정소수점
평균하면 잡음이 준다상관된 잡음은 안 줌평균은 무작위에만
이동평균은 저역통과사이드로브 −13 dB싱크 함수
오버샘플링하면 비트가 는다잡음이 1 LSB 이상이라야디더 필요
디지털이니 지연 없음(N−1)/2(N-1)/2 샘플인과적 필터
AAF 는 대충 해도 됨접히면 못 되돌림정보가 사라짐
IIR 은 항상 안정계수에 따라 발산극점 위치

⚠️ 상관된 잡음에는 평균이 안 듣습니다. 60 Hz 픽업은 무작위가 아니라 주기적이라, 그냥 평균하면 N\sqrt N 이 아니라 훨씬 덜 줍니다. 주기의 정수배로 평균하거나 널을 맞춰야 합니다.


시뮬레이션으로 확인

디지털 필터는 회로가 아니라 코드입니다. 그런데 1차 IIR 은 RC 필터와 정확히 같으므로, 아날로그로 만들어 견주면 대응이 보입니다.

1차 IIR 과 RC 필터는 같은 것 회로도R19.49kΩτ = RC (a = 0.1 에 해당)V1C11µFINOUTGND
1차 IIR 과 RC 필터는 같은 것워크벤치에서 열기 →
# examples/13-signal-chain/iir-equivalent.yaml
meta:
  name: 1차 IIR 과 RC 필터는 같은 것
  lesson: docs/13-signal-chain/11-digital-filtering.md
  note: |
    y[n] = a·x[n] + (1-a)·y[n-1]  는 1차 RC 저역통과와 같습니다.

        a = 1 - exp(-T/τ),   τ = RC

    샘플 주기 T = 1 ms, a = 0.1 이면
        τ = -T/ln(1-a) = -1ms/ln(0.9) = 9.49 ms
        f_c = 1/(2πτ) = 16.8 Hz

    이 회로가 그 τ 입니다. R1×C1 = 9.49 kΩ × 1 µF = 9.49 ms.
    스텝 응답을 보면 코드로 돌린 IIR 과 같은 곡선이 나옵니다.

    R1 을 밀어 보면 a 를 바꾸는 것과 같습니다 — a 가 작을수록
    (R 이 클수록) 더 느리고 더 조용해집니다.
components:
  - {ref: V1, type: vpulse, params: {v1: 0, v2: 1, td: 0, tr: 1u, tf: 1u, pw: 100m, per: 200m}}
  - {ref: R1, type: r, value: 9.49k, label: τ = RC (a = 0.1 에 해당), sweep: {min: 949, max: 94.9k}}
  - {ref: C1, type: c, value: 1u}
nets:
  IN:  [V1.p, R1.1]
  OUT: [R1.2, C1.1]
  GND: [V1.n, C1.2]
analyses:
  # 주파수 응답은 여기서 안 봅니다 — 교류 해석에는 vac 이 필요한데
  # 이 회로의 구동원은 스텝(vpulse)입니다. τ 를 재면 f_c 는 따라 나옵니다.
  - {type: tran, tstop: 50m, tstep: 100u}
expect:
  # τ = 9.49 ms 이므로 t = τ 에서 63.2 %
  - {measure: v, node: OUT, at: 9.49m, analysis: tran, value: 0.632, tol: 3%}
  # 2τ 에서 86.5 %
  - {measure: v, node: OUT, at: 18.98m, analysis: tran, value: 0.865, tol: 3%}

돌려 보면 t=τt=\tau 에서 63.2 %, 2τ2\tau 에서 86.5 % — 손계산 그대로입니다. 이 τ\tau 로부터 fc=1/2πτ=16.8f_c = 1/2\pi\tau = 16.8 Hz 가 따라 나옵니다.

코드로 옮기면 이렇습니다.

// y[n] = a·x[n] + (1-a)·y[n-1],  a = 0.1
// 고정소수점: a = 1/10 대신 1/8 (= 시프트 3) 로 하면 곱셈도 없어집니다
y += (x - y) >> 3;    // a = 1/8 = 0.125,  τ = 7.5 ms

이 한 줄이 위 회로와 같은 일을 합니다 — 저항도 커패시터도 없이, 부품 오차도 온도 드리프트도 없이.

R1 을 밀어 보면 aa 를 바꾸는 것과 같습니다. 저항이 클수록 aa 가 작고, 더 느리고 더 조용해집니다.


연습문제

문제 1. 1 kHz 로 샘플링하는 시스템에서 60 Hz 를 완전히 지우려 합니다. 이동평균 NN 을 얼마로 하겠습니까?

exercises/13-11-moving-average-60hz.yaml
풀이

싱크의 첫 널이 fs/Nf_s/N 입니다.

1000N=60⇒N=16.67\frac{1000}{N} = 60 \quad\Rightarrow\quad N = 16.67
기호
N개수count

정수가 아닙니다. NN 은 정수여야 하므로 이대로는 안 됩니다.

두 가지 길:

① 샘플링 레이트를 바꿉니다.

fs=60N⇒N=16→fs=960 Hzf_s = 60N \quad\Rightarrow\quad N=16 \rightarrow f_s = 960\ \text{Hz}
기호
f_s샘플링 주파수sampling frequencyHz
N개수count

960 Hz 로 샘플링하고 16개를 평균하면 60·120·180·… Hz 가 모두 널에 걸립니다.

② N=17N=17 로 하고 어긋남을 감수합니다.

널=100017=58.8 Hz\text{널} = \frac{1000}{17} = 58.8\ \text{Hz}

60 Hz 에서의 감쇠를 계산하면

∣H(60)∣=∣sin⁡(π×60×17/1000)17sin⁡(π×60/1000)∣=∣sin⁡(3.204)∣17×sin⁡(0.1885)=0.06253.187=0.0196|H(60)| = \left|\frac{\sin(\pi \times 60 \times 17/1000)}{17\sin(\pi\times60/1000)}\right| = \frac{|\sin(3.204)|}{17\times\sin(0.1885)} = \frac{0.0625}{3.187} = 0.0196

−34 dB. 완전하지는 않지만 쓸 만합니다.

★ 실무에서는 ① 입니다. ADC 의 데이터 레이트를 60(또는 50) 의 배수로 잡는 것이 정밀 측정의 기본이고, 그래서 정밀 ADC 들이 10 SPS, 16.67 SPS, 50 SPS, 60 SPS 같은 레이트를 제공합니다.

50 Hz 지역도 함께 지우려면 10 Hz 의 배수로 잡습니다 — 50 과 60 의 최대공약수입니다.

문제 2. 12비트 ADC 로 16비트 분해능을 얻으려 합니다. 몇 배 오버샘플링해야 하고, 데이터 레이트는 어떻게 되나요?

연습 13-11-2 — 평균이 잡음을 √N 로 줄인다 회로도RW3.9kΩ8 nV/√Hz 잡음원RN3.9kΩ같은 잡음원VS1VCW40.8nF넓은 대역 1 kHzCN653nF좁은 대역 62.5 HzINWIDENARROWGND
연습 13-11-2 — 평균이 잡음을 √N 로 줄인다워크벤치에서 열기 →
풀이 추가 비트=12log⁡2M=4⇒log⁡2M=8⇒M=256 배\text{추가 비트} = \frac{1}{2}\log_2 M = 4 \quad\Rightarrow\quad \log_2 M = 8 \quad\Rightarrow\quad \boxed{M = 256\ \text{배}}
기호
M상호 인덕턴스mutual inductanceH

1 kHz 출력이 필요하면 ADC 는 256 kHz 로 돌려야 합니다.

확인할 것:

항목왜
ADC 가 그 속도를 내는가12비트 SAR 은 대개 됨
잡음이 1 LSB 이상인가없으면 디더를 넣어야 함
계산 시간256번 더하기 (가벼움)
전력변환 횟수가 256배

★ 잡음 조건이 핵심입니다. 12비트 5 V 시스템에서 1 LSB = 1.22 mV. 입력 잡음이 그보다 작으면 매번 같은 코드가 나와 평균해도 안 늘어납니다.

실제로는 대개 이미 충분합니다 — 저항 열잡음, 증폭기 잡음, 전원 리플이 mV 수준으로 있으니까요. 너무 조용해서 문제가 되는 경우에만 디더를 일부러 넣습니다.

대안: ΔΣ ADC 를 쓰면 이 일을 칩이 알아서 합니다. 12비트 SAR + 오버샘플링보다 24비트 ΔΣ 하나가 대개 더 싸고 좋습니다.

문제 3. 심전도(0.05~150 Hz)를 500 Hz 로 샘플링합니다. 60 Hz 를 지우려는데 IIR 노치와 FIR 중 어느 것을 쓰겠습니까?

exercises/13-11-notch-vs-fir.yaml
풀이

FIR 입니다. 위상 때문입니다.

심전도는 파형의 모양을 봅니다 — QRS 폭, ST 분절의 높이, T 파의 모양. 이것들은 여러 주파수 성분의 상대적 시간 관계로 정해집니다.

IIR 노치의 문제:

노치 근처에서 위상이 급격히 돕니다. 60 Hz 부근의 성분만 시간이 밀리면 QRS 가 일그러집니다. 진단에서 그 모양이 판단 근거인데, 필터가 모양을 바꾸면 안 됩니다.

FIR 은 위상이 정확히 선형이라 모든 성분이 같은 시간만큼 밀립니다 — 파형이 통째로 지연될 뿐 모양이 안 변합니다.

대가:

IIR 노치 (2차)FIR
계수5수십~수백
지연작음(N−1)/2(N-1)/2 샘플
위상비선형선형

500 Hz 에서 60 Hz 를 좁게 지우는 FIR 은 수백 탭이 필요하고, 지연이 100 ms 를 넘을 수 있습니다. 실시간 감시에서는 그것도 문제입니다.

★ 더 나은 답 — 애초에 60 Hz 를 안 들이는 것:

  1. 차동 입력과 우측 다리 구동(RLD) — 공통모드로 들어오는 60 Hz 를 CMRR 로 줄입니다 (12-07)
  2. 샘플링 레이트를 60 의 배수로 — 위 문제 1처럼 싱크 널을 씁니다. 위상 왜곡이 없습니다
  3. 케이블을 꼬고 짧게

필터로 지우는 것은 마지막 수단입니다. 12장 전체가 그 이야기입니다 — 들어온 잡음을 빼는 것보다 안 들어오게 하는 것이 늘 낫습니다.


이전 ← 10 브리지·RTD·열전대 | 다음 → 14장. 측정과 디버깅