FFT의 계산량
표본 N개의 DFT를 계산하려면 곱셈이 몇 번 필요하고, FFT는 그것을 어떻게 줄일까?
정의대로 계산하면 X[k] 하나에 곱 N개, X[k]가 N개이므로 복소 곱셈이 N2번이다. FFT(fast Fourier transform)는 DFT 행렬의 대칭을 써서 같은 값을 더 적은 계산으로 구한다.
N이 짝수이면 표본을 짝수 번째 x[2m]과 홀수 번째 x[2m+1]로 나눈다. 두 수열의 N/2점 DFT를 E[k], O[k]라 하고 wN=e−j2π/N이라 두면, k=0,1,…,N/2−1에서
X[k]X[k+N/2]=E[k]+wNkO[k]=E[k]−wNkO[k]
이다. 짝수 번째 표본에서는 e−j2πk(2m)/N=e−j2πkm/(N/2)라 N/2점 DFT가 그대로 나오고, 홀수 번째 표본에는 wNk가 한 번 더 곱해진다. wNk+N/2=−wNk이므로 아래 식은 위 식의 부호만 바꾼 것이다. 곱 wNkO[k] 하나를 두 번 쓰므로, 한 단계에서 복소 곱셈은 N/2번이다.
N이 2의 거듭제곱이면 이 나눔을 log2N단계 되풀이해 길이 1까지 내려간다. 복소 곱셈은 (N/2)log2N번이다. 계산량이 O(N2)에서 O(NlogN)으로 준다.
실습에서 한 번에 받는 216개 표본의 스펙트럼을 바로 그릴 수 있는 것은 이 차이 덕분이다. np.fft.fft는 어떤 N에서도 동작하고, N이 2의 거듭제곱처럼 작은 수들의 곱일 때 특히 빠르다.