REMI Lab강의 노트

Wireless Embedded Systems E02

2장 복습: 복소수와 이산 신호

FFT의 계산량

표본 NN개의 DFT를 계산하려면 곱셈이 몇 번 필요하고, FFT는 그것을 어떻게 줄일까?

정의대로 계산하면 X[k]X[k] 하나에 곱 NN개, X[k]X[k]가 NN개이므로 복소 곱셈이 N2N^2번이다. FFT(fast Fourier transform)는 DFT 행렬의 대칭을 써서 같은 값을 더 적은 계산으로 구한다.

NN이 짝수이면 표본을 짝수 번째 x[2m]x[2m]과 홀수 번째 x[2m+1]x[2m+1]로 나눈다. 두 수열의 N/2N/2점 DFT를 E[k]E[k], O[k]O[k]라 하고 wN=e−j2π/Nw_N=e^{-j2\pi/N}이라 두면, k=0,1,…,N/2−1k=0,1,\ldots,N/2-1에서

X[k]=E[k]+wNk O[k]X[k+N/2]=E[k]−wNk O[k]\begin{aligned} X[k]&=E[k]+w_N^k\,O[k]\\ X[k+N/2]&=E[k]-w_N^k\,O[k] \end{aligned}

이다. 짝수 번째 표본에서는 e−j2πk(2m)/N=e−j2πkm/(N/2)e^{-j2\pi k(2m)/N}=e^{-j2\pi km/(N/2)}라 N/2N/2점 DFT가 그대로 나오고, 홀수 번째 표본에는 wNkw_N^k가 한 번 더 곱해진다. wNk+N/2=−wNkw_N^{k+N/2}=-w_N^k이므로 아래 식은 위 식의 부호만 바꾼 것이다. 곱 wNkO[k]w_N^kO[k] 하나를 두 번 쓰므로, 한 단계에서 복소 곱셈은 N/2N/2번이다.

NN이 2의 거듭제곱이면 이 나눔을 log⁡2N\log_2N단계 되풀이해 길이 1까지 내려간다. 복소 곱셈은 (N/2)log⁡2N(N/2)\log_2N번이다. 계산량이 O(N2)O(N^2)에서 O(Nlog⁡N)O(N\log N)으로 준다.

NN DFT: N2N^2 FFT: (N/2)log⁡2N(N/2)\log_2N 비
1,024 1,048,576 5,120 약 205
216=65,5362^{16}=65{,}536 ≈4.29×109\approx4.29\times10^9 524,288 8,192

실습에서 한 번에 받는 2162^{16}개 표본의 스펙트럼을 바로 그릴 수 있는 것은 이 차이 덕분이다. np.fft.fft는 어떤 NN에서도 동작하고, NN이 2의 거듭제곱처럼 작은 수들의 곱일 때 특히 빠르다.