디지털 필터링 — ADC 뒤에서
한 줄 요약 — ADC 뒤에서는 필터가 공짜에 가깝고 정확합니다. 그런데 안티에일리어싱만은 여기서 절대 못 합니다 — 접힌 신호는 되돌릴 수 없습니다.
어디까지가 아날로그의 몫인가
이 자료는 지금까지 필터를 전부 아날로그로 다뤘습니다. ADC 뒤에서는 사정이 다릅니다.
| 아날로그 필터 | 디지털 필터 | |
|---|---|---|
| 부품 오차 | ±1~10 % | 0 |
| 온도 드리프트 | 있음 | 0 |
| 급준함 | 차수만큼 부품이 늘어남 | 계수만 늘면 됨 |
| 위상 선형 | 어려움 | FIR 이면 정확히 |
| 바꾸기 | 납땜 | 숫자만 |
| 값 | 부품값 | 계산 시간 |
| 에일리어싱 | ✅ 막을 수 있음 | ❌ 절대 못 함 |
마지막 줄이 전부입니다.
왜 에일리어싱만은 아날로그라야 하나
샘플링은 위의 성분을 아래로 접어 넣습니다 (13-06).
f_alias주파수 (alias)frequency (alias)Hzf_in입력 주파수input frequencyHzf_s샘플링 주파수sampling frequencyHzn비트 수 또는 개수number of bits or count접힌 뒤에는 원래 신호와 구분이 안 됩니다. 1 kHz 로 샘플링하는데 999 Hz 잡음이 들어오면 1 Hz 로 나타나고, 그것이 진짜 1 Hz 신호인지 접힌 999 Hz 인지 알 방법이 없습니다.
⚠️ 디지털 필터는 이미 접힌 것을 못 풉니다. 정보가 사라진 것이지 가려진 것이 아닙니다. 아날로그 안티에일리어싱 필터는 필수이고 생략할 수 없습니다.
★ 그런데 오버샘플링이 그 부담을 크게 덜어 줍니다 — 아래에서 봅니다.
이동평균 — 가장 단순하고 가장 많이 쓰입니다
k결합 계수 또는 상수coupling coefficient or constantn비트 수 또는 개수number of bits or countN개수count장점: 곱셈이 없습니다. 나눗셈도 을 2의 거듭제곱으로 하면 시프트입니다.
잡음이 얼마나 주나
무작위 잡음은 로 줍니다.
| 잡음 감소 | dB | |
|---|---|---|
| 4 | 2배 | 6 |
| 16 | 4배 | 12 |
| 64 | 8배 | 18 |
| 256 | 16배 | 24 |
★ 4배마다 6 dB 입니다. 이 자료가 잡음 예산에서 계속 쓰는 관계 그대로입니다.
주파수 응답 — 싱크 함수
f주파수frequencyHzN개수countT온도 또는 주기temperature or period모양이 좋지 않습니다.
| 특징 | 값 |
|---|---|
| −3 dB 주파수 | |
| 첫 사이드로브 | −13 dB 뿐 |
| 완전 감쇠(널) | 의 정수배 |
사이드로브가 −13 dB 밖에 안 됩니다. 저지대역의 잡음이 22 % 나 그대로 통과합니다. 급준한 차단이 필요하면 이동평균으로는 안 됩니다.
★ 널을 이용하는 법
첫 널이 정확히 에 있습니다. 이걸 60 Hz 에 맞추면 전원 잡음이 완전히 사라집니다.
f_s샘플링 주파수sampling frequencyHzN개수count= 960 Hz 이면 . 60 Hz 와 그 정수배(120, 180, …)가 모두 널에 걸립니다.
💡 이것이 정밀 ADC 가 50/60 Hz 제거 기능을 광고하는 원리입니다. ΔΣ ADC 의 데이터 레이트를 16.67 ms(=1/60)의 정수배로 맞추면 전원 주파수가 통째로 지워집니다. 12-08 의 60 Hz 픽업을 하드웨어 없이 없앨 수 있습니다.
CIC — 곱셈 없는 데시메이션
이동평균을 여러 번 겹치되, 누산기와 미분기로 구현하면 곱셈이 아예 없습니다.
- 장점: 곱셈 0, 계수 저장 0. FPGA·ΔΣ ADC 안에서 씁니다
- 단점: 통과대역이 처집니다(싱크의 롤오프). 그래서 뒤에 보상 FIR 을 답니다
ΔΣ ADC 안에 이것이 들어 있습니다. 1비트를 MHz 로 뽑아 CIC 로 데시메이션하면 24비트가 나옵니다.
IIR — 적은 계산으로 급준하게
n비트 수 또는 개수number of bits or count이 한 줄이 1차 RC 저역통과와 정확히 같습니다.
tau시정수time constantse잡음 전압 밀도noise voltage densityV/√HzT온도 또는 주기temperature or periodMCU 에서 가장 많이 쓰는 필터입니다 — 곱셈 두 번, 메모리 한 칸.
| FIR | IIR | |
|---|---|---|
| 계산량 | 많음 (탭 수만큼) | 적음 |
| 메모리 | 탭 수 | 차수만큼 |
| 위상 | 정확히 선형 | 비선형 |
| 안정성 | 항상 안정 | 계수에 따라 발산 |
| 아날로그와 대응 | 없음 | 버터워스 등을 그대로 |
위상이 중요하면 FIR, 계산이 아까우면 IIR. 파형의 모양을 봐야 하는 측정(심전도의 QRS, 과도 응답)에서는 위상 왜곡이 파형을 일그러뜨리므로 FIR 을 씁니다 (4-08).
⚠️ 고정소수점 IIR 은 조용히 망가집니다. 계수를 반올림하면 극점이 옮겨져 응답이 달라지고, 심하면 발산합니다. 차수가 높을수록 심해서, 2차 구간(biquad)으로 쪼개어 직렬로 잇습니다.
★ 오버샘플링 — 아날로그 필터를 싸게 만드는 법
이것이 이 문서에서 가장 값어치 있는 부분입니다.
필요한 신호 대역이 일 때, 아날로그 안티에일리어싱 필터는 까지 감쇠해야 합니다.
나이퀴스트 바로 위로 샘플링하면 (2 kHz 로 1 kHz 신호):
전이대역이 없습니다. 8차 이상의 필터가 필요하고, 그런 필터는 부품 오차에 민감하고 위상이 심하게 휩니다.
16배 오버샘플링하면 (32 kHz):
전이대역이 31배 넓어집니다. 2차 필터로 충분합니다.
| 2배 샘플링 | 16배 오버샘플링 | |
|---|---|---|
| 아날로그 필터 차수 | 8차 이상 | 2차 |
| 부품 수 | 많음 | 적음 |
| 위상 왜곡 | 심함 | 적음 |
| 데이터 양 | 적음 | 16배 (디지털에서 줄임) |
| 추가 분해능 | — | 2비트 |
남는 대역은 디지털 필터가 잘라 냅니다. 그리고 데시메이션으로 원래 데이터 레이트로 되돌립니다.
오버샘플링이 주는 덤 — 분해능
| 배수 | 추가 비트 |
|---|---|
| 4 | 1 |
| 16 | 2 |
| 64 | 3 |
| 256 | 4 |
12비트 ADC 를 256배 오버샘플링하면 16비트가 됩니다 — 조건이 있습니다.
⚠️ 잡음이 최소 1 LSB 는 있어야 합니다. 입력이 완벽하게 조용하면 매번 같은 코드가 나와 평균해도 그대로입니다. 역설적이지만 디더(dither) 가 필요합니다. 실제 회로에는 대개 충분한 잡음이 이미 있습니다.
⚖️ 트레이드오프
1. 하드웨어와 디지털의 분담
원칙:
| 무엇 | 어디서 | 왜 |
|---|---|---|
| 에일리어싱 방지 | 아날로그 | 접히면 못 되돌림 |
| 큰 간섭 제거 (60 Hz 픽업이 입력을 포화시킬 때) | 아날로그 | ADC 범위를 지켜야 함 |
| 급준한 차단 | 디지털 | 부품 오차가 0 |
| 위상 선형 | 디지털 | FIR |
| 미세 조정 | 디지털 | 숫자만 바꿈 |
⚠️ 아날로그로 못 미루는 것 하나 더 — 간섭이 커서 ADC 입력 범위를 넘으면 디지털에서 손쓸 수 없습니다. 이미 잘린 신호이니까요. 60 Hz 픽업이 신호보다 크면 아날로그 단에서 줄여야 합니다.
2. 지연
디지털 필터는 지연을 만듭니다.
| 필터 | 지연 |
|---|---|
| 이동평균 | 샘플 |
| FIR 탭 | 샘플 |
| 1차 IIR |
제어 루프 안에 있으면 이 지연이 위상 여유를 깎습니다 (7-07). 필터를 강하게 걸수록 루프가 불안정해집니다 — 측정용과 제어용의 요구가 다릅니다.
3. 계산량 vs 전력
MCU 에서 필터는 전력을 씁니다. 배터리 기기에서는
- 이동평균 → 덧셈 하나
- 1차 IIR → 곱셈 둘
- 64탭 FIR → 곱셈 64번
64배 차이입니다. 저전력 설계에서는 이동평균이나 CIC 로 데시메이션한 뒤 낮은 레이트에서 FIR 을 거는 식으로 나눕니다.
🔌 실제 쓰임새
60 Hz 를 지우는 세 가지
| 방법 | 어디서 | 특징 |
|---|---|---|
| 노치 필터 (아날로그) | 아날로그 | 부품 오차로 중심이 어긋남 |
| 싱크 널 | 디지털 | 정확 — 레이트만 맞추면 됨 |
| 60 Hz 주기 평균 | 디지털 | 정확, 지연이 16.7 ms |
디지털이 압도적으로 유리합니다. 아날로그 노치는 Q 가 높아야 하는데, 부품이 1 % 만 틀려도 중심이 어긋나 감쇠가 확 줄어듭니다.
고정소수점에서
- 누산기를 넓게 — 이동평균 에 16비트 입력이면 24비트 누산기가 필요합니다
- 반올림 방향 — 늘 내림하면 DC 옵셋이 생깁니다
- IIR 은 biquad 로 쪼갭니다
무엇을 안 하는 게 나은가
신호보다 느린 필터는 신호를 지웁니다. 이동평균 의 −3 dB 가 이므로, 신호의 가장 빠른 성분이 그보다 위에 있으면 잘려 나갑니다.
“잡음이 많으니 평균을 더 하자” 는 흔한 실수입니다. 신호도 같이 지워집니다.
⚠️ 이상과 실제의 차이
| 이상 | 실제 | 왜 |
|---|---|---|
| 디지털 필터는 완벽 | 계수 반올림으로 응답이 달라짐 | 고정소수점 |
| 평균하면 잡음이 준다 | 상관된 잡음은 안 줌 | 평균은 무작위에만 |
| 이동평균은 저역통과 | 사이드로브 −13 dB | 싱크 함수 |
| 오버샘플링하면 비트가 는다 | 잡음이 1 LSB 이상이라야 | 디더 필요 |
| 디지털이니 지연 없음 | 샘플 | 인과적 필터 |
| AAF 는 대충 해도 됨 | 접히면 못 되돌림 | 정보가 사라짐 |
| IIR 은 항상 안정 | 계수에 따라 발산 | 극점 위치 |
⚠️ 상관된 잡음에는 평균이 안 듣습니다. 60 Hz 픽업은 무작위가 아니라 주기적이라, 그냥 평균하면 이 아니라 훨씬 덜 줍니다. 주기의 정수배로 평균하거나 널을 맞춰야 합니다.
시뮬레이션으로 확인
디지털 필터는 회로가 아니라 코드입니다. 그런데 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%}돌려 보면 에서 63.2 %, 에서 86.5 % — 손계산 그대로입니다. 이 로부터 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 을 밀어 보면 를 바꾸는 것과 같습니다. 저항이 클수록 가 작고, 더 느리고 더 조용해집니다.
연습문제
문제 1. 1 kHz 로 샘플링하는 시스템에서 60 Hz 를 완전히 지우려 합니다. 이동평균 을 얼마로 하겠습니까?
exercises/13-11-moving-average-60hz.yaml풀이
싱크의 첫 널이 입니다.
N개수count정수가 아닙니다. 은 정수여야 하므로 이대로는 안 됩니다.
두 가지 길:
① 샘플링 레이트를 바꿉니다.
f_s샘플링 주파수sampling frequencyHzN개수count960 Hz 로 샘플링하고 16개를 평균하면 60·120·180·… Hz 가 모두 널에 걸립니다.
② 로 하고 어긋남을 감수합니다.
60 Hz 에서의 감쇠를 계산하면
−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비트 분해능을 얻으려 합니다. 몇 배 오버샘플링해야 하고, 데이터 레이트는 어떻게 되나요?
풀이
M상호 인덕턴스mutual inductanceH1 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 | 수십~수백 |
| 지연 | 작음 | 샘플 |
| 위상 | 비선형 | 선형 |
500 Hz 에서 60 Hz 를 좁게 지우는 FIR 은 수백 탭이 필요하고, 지연이 100 ms 를 넘을 수 있습니다. 실시간 감시에서는 그것도 문제입니다.
★ 더 나은 답 — 애초에 60 Hz 를 안 들이는 것:
- 차동 입력과 우측 다리 구동(RLD) — 공통모드로 들어오는 60 Hz 를 CMRR 로 줄입니다 (12-07)
- 샘플링 레이트를 60 의 배수로 — 위 문제 1처럼 싱크 널을 씁니다. 위상 왜곡이 없습니다
- 케이블을 꼬고 짧게
필터로 지우는 것은 마지막 수단입니다. 12장 전체가 그 이야기입니다 — 들어온 잡음을 빼는 것보다 안 들어오게 하는 것이 늘 낫습니다.
이전 ← 10 브리지·RTD·열전대 | 다음 → 14장. 측정과 디버깅