신호 처리
소리·사진·전파처럼 시간이나 공간에 따라 변하는 값을 숫자로 뽑아 다루는 방법을 정리한다. 샘플링과 앨리어싱, 양자화, 푸리에 변환과 FFT, 컨볼루션과 필터, 창 함수와 z 변환을 작은 예로 직접 계산해 본다.
신호와 시스템
신호는 시간(소리, 심전도, 주가)이나 공간(사진)에 따라 변하는 값이다. 연속인 신호를 일정 간격으로 뽑아 숫자 목록 x[n]으로 만든 것이 디지털 신호이고, 신호를 받아 다른 신호를 내는 것이 시스템이다. 이퀄라이저, 잡음 제거, 방의 울림, 스피커, 카메라 렌즈의 흐림이 모두 시스템이다.
신호 처리의 도구 대부분은 선형·시불변(LTI) 시스템에 대한 것이다. 선형이면 입력을 섞어 넣은 결과가 각각 넣은 결과를 섞은 것과 같고, 시불변이면 입력을 늦게 넣어도 출력이 늦게 나올 뿐 모양은 같다. 이 두 성질이 있으면, 크기 1인 순간 펄스(임펄스)를 넣었을 때의 출력 h[n], 즉 임펄스 응답 하나로 시스템이 완전히 정해진다. 어떤 입력이든 크기와 위치가 다른 임펄스들의 합으로 쪼갤 수 있고, 각 임펄스는 h 모양의 응답을 남기니, 출력은 그 응답들의 합이다. 이 계산이 뒤에 나올 컨볼루션이다.
샘플링과 나이퀴스트
연속 신호를 초당 fs번 뽑으면(샘플링 주파수 fs), fs/2보다 낮은 주파수만 제대로 나타낼 수 있다. 이 한계 fs/2가 나이퀴스트 주파수이고, "신호의 가장 높은 주파수보다 두 배 넘게 빨리 뽑으면 원래 신호를 완벽히 되살릴 수 있다"는 것이 나이퀴스트–섀넌 샘플링 정리다. 사람 귀가 약 20kHz까지 들으므로 CD는 44,100Hz로 뽑아, 나이퀴스트 주파수 22,050Hz와 20kHz 사이에 필터가 기울어질 여유를 두었다. 소리가 디지털이 되는 과정 전체는 오디오 노트에 있다.
나이퀴스트보다 높은 주파수를 그대로 뽑으면 사라지는 것이 아니라 낮은 주파수로 접혀 나타난다. 이것이 앨리어싱이다. 표본만 보고는 진짜 신호와 가짜 신호를 구별할 수 없다. 예를 들어 44,100Hz로 뽑을 때 30,000Hz 초음파는 14,100Hz의 들리는 소리로 둔갑한다. 그래서 ADC 앞에는 나이퀴스트 위를 미리 깎는 안티앨리어싱 필터를 반드시 둔다. 영상에서 바퀴가 거꾸로 도는 것처럼 보이는 마차 바퀴 효과, 사진의 무아레 무늬, 3D 그래픽의 계단 경계도 같은 현상이다(컴퓨터 그래픽스 노트의 안티에일리어싱).
양자화
뽑은 값도 정해진 비트 수로 반올림해 저장해야 한다. 이것이 양자화이고, 반올림으로 생긴 차이는 신호에 섞인 작은 잡음(양자화 잡음)이 된다. 비트가 하나 늘면 단계가 두 배로 촘촘해져 잡음 진폭이 반이 되니, 신호 대 잡음비(SNR)가 20·log₁₀2 ≈ 6.02dB씩 오른다. 꽉 찬 사인파에서는 SNR ≈ 6.02N + 1.76dB다(1.76dB는 사인파의 평균 전력과 고르게 퍼진 잡음 전력의 비에서 나온다).
- CD의 16비트는 약 98dB, 녹음 장비의 24비트는 이론상 약 146dB다. 실제 24비트 ADC는 아날로그 회로의 잡음 때문에 120dB 안팎에서 막힌다.
- 아주 작은 소리를 양자화하면 오차가 신호를 따라 규칙적으로 생겨 귀에 거슬리는 왜곡이 된다. 일부러 아주 작은 무작위 잡음(디더)을 더하면 오차가 고르게 흩어져 부드러운 쉬 소리로 바뀐다. 24비트 녹음을 16비트로 내릴 때 디더를 쓰는 이유다.
DFT와 FFT: 주파수로 보기
푸리에의 생각은 어떤 신호든 여러 주파수의 사인파의 합으로 쓸 수 있다는 것이다. 이산 푸리에 변환(DFT)은 N개 표본 x[n]을 N개의 주파수 성분 X[k]로 바꾼다. X[k] = Σ x[n]·e^(−j2πkn/N)은, 신호에 "N개 표본 동안 k주기 도는 사인·코사인"을 곱해 더해 보는 것이다. 신호에 그 주파수가 들어 있으면 곱이 같은 부호로 쌓여 크고, 없으면 양수와 음수가 상쇄돼 0이 된다. 결과는 복소수라 크기는 그 주파수의 세기, 각도는 위상이다.
- 주파수 해상도: 칸 하나의 폭은 fs/N이다. 44,100Hz 소리를 1024개씩 자르면 칸 폭이 약 43.1Hz라, 이보다 가까운 두 음은 한 칸에 섞인다. 해상도를 높이려면 더 긴 구간을 봐야 하고, 그러면 시간 해상도가 떨어진다. 시간과 주파수를 동시에 정확히 알 수는 없다.
- FFT: DFT를 정의대로 계산하면 곱셈이 N²번 든다. 1965년 쿨리–튜키(Cooley–Tukey)의 고속 푸리에 변환은 짝수 번째와 홀수 번째 표본의 DFT로 쪼개기를 되풀이해(N이 2의 거듭제곱일 때) (N/2)·log₂N번으로 줄인다. 1024점이면 1,048,576번이 5,120번, 약 205배 빠르다. 같은 생각은 가우스가 1805년에 이미 썼다.
- 스펙트로그램: 짧은 구간을 조금씩 밀며 FFT를 거듭해 시간–주파수 그림을 만든다(STFT). 이 사이트의 스펙트럼 분석기가 마이크 소리로 이것을 실시간으로 그린다.
"푸리에 변환"은 사실 네 가족의 이름이다. 시간 쪽이 연속인가 이산인가, 주기인가 아닌가로 갈리고, 한쪽이 이산이면 다른 쪽이 주기적이 된다. 컴퓨터가 실제로 계산하는 것은 넷 중 DFT뿐이고, FFT는 별도의 변환이 아니라 DFT를 빨리 계산하는 알고리즘이다(DTFT 문서).
| 이름 | 시간 쪽 | 주파수 쪽 | 쓰임 |
|---|---|---|---|
| 푸리에 변환 | 연속, 비주기 | 연속, 비주기 | 아날로그 신호와 필터의 이론 |
| 푸리에 급수 | 연속, 주기 | 이산(배음만) | 악기의 배음, 주기파의 분해 |
| DTFT | 이산(표본), 비주기 | 연속, fs마다 되풀이 | 디지털 필터의 주파수 응답(아래 z 변환의 단위원) |
| DFT | 이산, N개(주기로 봄) | 이산, N칸 | 실제 계산. DTFT를 N개 점에서 뽑은 값이다 |
컨볼루션
LTI 시스템의 출력은 입력과 임펄스 응답의 컨볼루션 y[n] = Σ h[k]·x[n − k]다. 입력의 각 표본이 자기 크기만큼 h를 복사해 자기 자리에 남기고, 출력은 그 복사본들을 겹쳐 더한 것이다. 계산으로 보면 h를 뒤집어 입력 위로 한 칸씩 밀며, 겹친 칸끼리 곱해 더한다.
입력 x = [1, 2, 3, 0, 1], 임펄스 응답 h = [0.5, 0.3, 0.2]. h를 뒤집어 놓고 한 칸씩 오른쪽으로 민다. 바깥은 0으로 친다.
컨볼루션은 주파수 영역에서 곱셈이 된다(컨볼루션 정리). 시간 영역에서 길이 M인 h와 컨볼루션하면 출력 하나에 곱셈 M번이 들지만, 둘을 FFT해 칸끼리 곱하고 역FFT하면 긴 필터도 빠르다. 수 초 길이의 실제 홀 울림을 입히는 컨볼루션 리버브가 이 방법을 쓴다. 이미지의 블러와 경계 검출, CNN의 합성곱도 같은 연산을 2차원으로 한 것이다(딥러닝의 "합성곱"은 h를 뒤집지 않는 상호 상관이지만, 필터를 학습하므로 차이가 없다).
필터: FIR과 IIR
필터는 원하는 주파수만 남기는 시스템이다. 낮은 주파수만 통과시키면 저역 통과(잡음·쉿 소리 제거), 높은 것만 남기면 고역 통과(웅웅거리는 저음 제거), 가운데만 남기면 대역 통과다. 디지털 필터는 구조에 따라 두 갈래다.
- FIR(유한 임펄스 응답): 출력이 지금과 과거 입력의 가중합 y[n] = Σ b[k]·x[n − k]이다. 가장 단순한 예가 최근 M개를 평균하는 이동 평균이다. 되먹임이 없어 항상 안정하고, 계수를 좌우 대칭으로 잡으면 모든 주파수가 똑같이 늦어지는 선형 위상이라 파형이 일그러지지 않는다. 대신 날카로운 필터를 만들려면 계수가 수십~수백 개 필요하다.
- IIR(무한 임펄스 응답): 과거 출력까지 되먹인다. 1차 저역 통과 y[n] = α·x[n] + (1 − α)·y[n − 1]은 계수 두 개뿐인데 임펄스 응답이 영원히(점점 작아지며) 이어진다. 적은 계산으로 가파른 필터를 만들 수 있지만, 계수를 잘못 잡으면 출력이 발산하고, 주파수마다 늦어지는 정도가 달라진다. 오디오 이퀄라이저는 2차 IIR 하나(바이쿼드)를 여러 개 이어 붙이는 것이 표준이다.
주파수 축의 fs/2는 나이퀴스트 주파수다. 이동 평균의 주파수 응답이 0이 됐다가 다시 올라오는 것(옆 돌기)에서 보듯, "구간 평균"은 생각보다 나쁜 저역 통과 필터다. 실무에서는 원하는 통과 대역과 차단 대역을 정하고 설계 알고리즘(창 방법, Parks–McClellan, 버터워스·체비쇼프 IIR)으로 계수를 구한다.
창 함수와 스펙트럼 누설
DFT는 잘라 낸 N개 표본이 끝없이 되풀이된다고 가정한다. 신호가 구간 안에 딱 맞게 정수 주기로 들어 있지 않으면, 이어 붙인 경계에서 값이 툭 끊기고, 그 끊김이 모든 주파수에 조금씩 에너지를 뿌린다. 한 칸에 있어야 할 에너지가 이웃 칸으로 새는 이 현상이 스펙트럼 누설이다. 큰 소리 옆의 작은 소리가 누설에 묻혀 안 보이게 된다.
해결은 구간 양 끝을 0으로 부드럽게 줄이는 창 함수를 곱하는 것이다. 한(Hann) 창(코사인 한 주기를 뒤집어 올린 꼴)이 가장 흔하다. 끝이 이어지니 먼 칸으로의 누설이 크게 준다. 대가로 봉우리가 넓어져 가까운 두 주파수를 가르는 힘(해상도)은 떨어진다. 해밍, 블랙먼–해리스, 카이저 같은 창은 이 둘 사이의 다른 절충이다. 스펙트럼 분석기 프로그램에 창 선택 메뉴가 있는 이유다.
z 변환의 직관: 극과 영점
z 변환은 신호 x[n]을 z의 거듭제곱 급수 Σ x[n]·z^(−n)으로 쓰는 것이다. z^(−1)이 "한 칸 늦추기"라, 차분 방정식이 z에 대한 분수식 H(z) = (분자 다항식) ÷ (분모 다항식)이 된다. z를 단위원 위의 e^(jω)로 두면 그 값이 곧 주파수 ω에서의 응답이다. 그래서 필터의 성질을 복소 평면의 점 몇 개로 읽을 수 있다.
- 영점(분자가 0): 단위원 위에 있으면 그 주파수를 완전히 지우고, 가까우면 크게 줄인다.
- 극(분모가 0): 가까운 주파수를 키운다. 단위원 안에 있어야 안정하고, 원 밖에 있으면 출력이 끝없이 커진다. 극이 원에 가까울수록 응답이 날카롭게 솟고 오래 울린다(공진).
연속 시간 회로(아날로그 필터)는 같은 일을 라플라스 변환의 s 평면에서 하고, 디지털 필터를 설계할 때 아날로그 설계를 쌍선형 변환으로 z 평면에 옮기는 일이 많다.
응용
- 오디오: 이퀄라이저는 바이쿼드 IIR 여러 개로 대역마다 소리를 키우고 줄인다. 잡음 제거, 에코 제거(통화), 피치 검출, 음량 측정(LUFS)도 필터와 FFT의 조합이다. 이 사이트의 스펙트럼 분석기와 음량 측정이 실제 예다.
- 이미지는 2차원 신호: 블러는 2D 저역 통과, 날카롭게 하기는 고역을 키우는 것, 경계 검출은 미분 필터다(그래픽 기초 노트의 블러, 컴퓨터 비전 노트의 소벨). 카메라 센서와 화면의 무아레도 2차원 앨리어싱이다.
- 압축: JPEG은 8×8 픽셀 블록을, MP3·AAC는 소리 구간을 DCT 계열 변환으로 주파수 성분으로 바꾼다. 자연스러운 신호는 에너지가 낮은 주파수 몇 개에 몰리므로, 높은 주파수 계수를 거칠게 양자화하거나 버려도 사람이 잘 못 알아챈다. 무손실·손실 압축의 큰 그림은 데이터 노트에 있다.
- 통신과 센서: 와이파이·LTE·5G는 데이터를 수많은 주파수 칸에 나눠 싣는 OFDM을 FFT로 만들고 푼다. 레이더는 반사파와 보낸 파의 상관으로 거리를, 주파수 변화(도플러)로 속도를 잰다. 심전도·뇌파 기기는 전원선의 50/60Hz 잡음을 노치 필터로 지운다.
흔한 오해
- "디지털 소리는 계단 모양이다": 표본을 막대로 그리면 계단처럼 보이지만, 표본은 점일 뿐이고 그 사이를 잇는 방법은 샘플링 정리가 정해 둔다. 이상적인 복원은 표본마다 sinc 함수를 놓고 더하는 것이고, 실제 DAC는 계단(영차 유지)을 낸 뒤 저역 통과 필터로 나이퀴스트 위의 성분을 걸러 매끄러운 곡선을 만든다(샘플링 정리 문서). 대역이 제한된 신호라면 되살린 곡선은 원래 곡선과 같다. Xiph.Org의 Digital Show & Tell이 실제 장비로 이것을 보여 준다.
- "최고 주파수의 정확히 두 배로 뽑으면 된다": 조건은 두 배보다 엄격히 커야 한다. 정확히 fs/2에서는 위상과 진폭이 다른 여러 사인이 똑같은 표본(+, − 번갈아)을 내므로 어느 것이었는지 되살릴 수 없다. 0을 지나는 자리에서 뽑힌 사인은 아예 사라진다. 실제로는 필터가 기울어질 자리도 필요해 위의 CD처럼 여유를 둔다. 반대로 신호가 좁은 대역에만 있다면 그 대역의 최고 주파수의 두 배보다 느리게 뽑아도 되는 대역 통과 샘플링도 있다.
- "샘플레이트가 높을수록 음질이 좋다": 들을 수 있는 대역을 다 담은 뒤에는 더 높여도 들리는 차이가 없다. Xiph.Org의 Monty Montgomery는 24/192 글에서 192kHz 음원은 이득이 없고, 담긴 초음파가 재생 장비에서 상호 변조 왜곡을 일으켜 오히려 조금 나빠질 수 있다고 설명한다. 같은 글은 녹음·제작 단계에서 24비트를 쓰는 데는 이유(헤드룸, 잡음 바닥, 레벨 실수의 여유)가 있다고 함께 적는다. 작업용 형식과 배포 형식은 다른 이야기다.
- "제로 패딩하면 주파수 해상도가 높아진다": 신호 뒤에 0을 붙여 FFT 길이를 늘리면 칸이 촘촘해지지만, 이는 같은 스펙트럼을 사이사이 보간한 것이다(제로 패딩 정리). 새 정보가 들어온 것이 아니라서, 가까운 두 주파수를 가르는 힘은 여전히 실제로 잰 구간의 길이가 정한다. 봉우리 위치를 더 정확히 읽는 데는 쓸모가 있다.
- "FFT를 하면 그 순간의 주파수를 안다": FFT는 잘라 낸 구간 전체의 평균적인 주파수 성분이다. 위 DFT 절처럼 구간이 짧으면 시간은 정확하지만 주파수가 뭉개지고, 길면 그 반대다. 시간에 따라 바뀌는 소리는 스펙트로그램으로 본다.
- Smith — The Scientist and Engineer’s Guide to Digital Signal Processing (무료 공개 교재)
- Julius O. Smith — Mathematics of the DFT (CCRMA, 공개 교재)
- Julius O. Smith — Introduction to Digital Filters (CCRMA, 공개 교재)
- Allen B. Downey — Think DSP (파이썬으로 배우는 무료 교재)
- 3Blue1Brown — But what is the Fourier Transform? A visual introduction (영상)
- Nyquist–Shannon sampling theorem — Wikipedia
- Quantization (signal processing) — Wikipedia
- Cooley–Tukey FFT algorithm — Wikipedia
- Window function — Wikipedia
- Discrete-time Fourier transform — Wikipedia
- Julius O. Smith — Zero Padding Theorem (Spectral Interpolation) (CCRMA)
- Monty Montgomery — 24/192 Music Downloads ...and why they make no sense (Xiph.Org)
- Xiph.Org — Digital Show & Tell (영상)