이산 푸리에 변환과 고속 푸리에 변환(Discrete and fast Fourier transforms)
표본(sample) N개를 진동수(frequency) 성분 N개로 바꾸는 계산이 이산 푸리에 변환(discrete Fourier transform)이다. 정의대로 하면 곱셈이 N²번쯤 들지만, 고속 푸리에 변환(fast Fourier transform)은 반씩 쪼개기를 되풀이해 N log N에 비례하는 계산으로 끝낸다.
소리를 녹음하면 컴퓨터에는 수의 목록이 남습니다. 1초에 수만 번, 그 순간의 공기 압력을 잰 값(표본)들입니다. 이 목록에 어떤 높이의 소리가 얼마나 섞였는지, 곧 어떤 진동수의 파동이 얼마나 들어 있는지 알고 싶다고 합시다. 푸리에 급수(Fourier series)는 주기함수(periodic function)를 진동수가 1, 2, 3, …배인 사인(sine)·코사인파의 합으로 나누지만, 계수를 얻으려면 곡선 전체를 알고 적분(integral)해야 합니다. 띄엄띄엄 잰 표본 N개만 가진 컴퓨터를 위한 판이 이산 푸리에 변환(DFT)입니다. '이산'은 값이 연속으로 이어지지 않고 떨어져 있다는 뜻입니다.
N = 4인 예로 시작합시다. 한 주기(period)를 넷으로 나누어 잰 표본이
한 줄씩 확인할 수 있습니다. 첫 줄은 모두 1이라 표본의 합 5 + 3 + 1 + 3 = 12입니다. 둘째 줄은 5 − 3i − 1 + 3i = 4, 셋째 줄은 5 − 3 + 1 − 3 = 0, 넷째 줄은 5 + 3i − 1 − 3i = 4입니다. 읽는 법은 이렇습니다.
일반적으로 표본
Σ(시그마)는 j = 0부터 N − 1까지 더하라는 기호이고, ω는 단위원을 N등분해 시계 방향으로 한 칸 간 점입니다(1의 거듭제곱근(roots of unity), 오일러 공식(Euler's formula)).
흔히 결과 N개가 서로 다른 N가지 진동수라고 생각하지만, 소리처럼 표본이 실수(real number)이면
정의대로 계산하면 결과 N개마다 표본 N개를 곱해 더하니 곱셈이 약
둘째 식의 빼기는 반 바퀴 돌면 −1이라는 것(
길이 N의 문제가 길이 N/2의 문제 둘과 마무리 한 단계로 바뀌었습니다. 마무리에는 곱셈 N/2번과 덧셈 N번이 듭니다. N이 2의 거듭제곱이면 이 쪼개기를 길이 1까지
이 쪼개기는 두 번 발견되었습니다. 1805년 무렵 가우스는 소행성 팔라스와 주노의 관측값을 사인과 코사인(sine and cosine)의 합으로 보간(interpolation)하는 계산을 줄이려고 같은 방법을 원고에 적었지만 출판하지 않았고, 원고는 그가 죽은 뒤 1866년 전집에 실렸습니다. 널리 퍼진 것은 1965년 IBM의 제임스 쿨리와 프린스턴의 존 튜키가 발표한 뒤입니다. 튜키가 이 생각을 한 것은 대통령 과학 자문 위원회에서 소련의 핵실험을 나라 밖의 지진계로 잡아낼 방법을 논의하던 자리였다고 전합니다. 가우스의 원고에 같은 방법이 있었다는 것은 그 뒤에야 알려졌습니다.
오늘날 FFT는 신호를 진동수로 나누는 거의 모든 곳에 있습니다. 소리의 스펙트럼, 곧 진동수별 세기를 그리는 일이 그렇고, JPEG와 MP3가 쓰는 코사인판 변환(이산 코사인 변환, discrete cosine transform)도 같은 쪼개기로 빠르게 계산합니다. 두 수열의 한쪽을 뒤집어 밀어 가며 겹치는 칸끼리 곱해 더하는 합성곱(convolution)도 진동수 쪽에서는 성분끼리의 곱셈이 되므로, 큰 다항식(polynomial)이나 자릿수가 아주 많은 수의 곱셈이 FFT로 빨라집니다.
이어지는 곳. 곡선 전체를 쓰는 원래의 판은 푸리에 급수이고, 성분이 섞이지 않는 까닭인 '정다각형의 합은 0'은 1의 거듭제곱근에, 코사인만 쓰는 사촌은 이산 코사인 변환에, 표본을 얼마나 촘촘히 잡아야 하는지는 표본화 정리에 있습니다. 반씩 쪼개는 계산의 일반론은 분할 정복이고, FFT를 세상에 알린 사람의 이야기는 존 튜키에 있습니다. 푸리에의 사인과 코사인에서 FFT까지의 흐름은 「원에서 파동으로」가, JPEG와 튜키의 이야기는 「짧게 보내기」 6절이, 가우스의 소행성 계산은 「잃어버린 소행성」 7절이, FFT가 분배법칙(distributive law)으로 공통 인수를 묶어 내는 계산이라는 것은 「같은 계산, 다른 덧셈」 7절이 보여 줍니다.
이 개념이 나오는 긴 글
이 개념을 언급하는 페이지
- 푸리에 급수
… 예를 만들어, 연속성만으로는 부족하다는 것을 보였습니다. 컴퓨터에서는 표본값 n개의 푸리에 계수를 구할 때고속 푸리에 변환(FFT)을 씁니다. 그냥 계산하면 곱셈이 약 n^2 번 필요하지만, 1의 거듭제곱근의 성질을 이용해 …
- 1의 거듭제곱근
… 한 칸씩 돌 뿐이라 \omega S = S 이고 \omega \ne 1 이니 S = 0 입니다. 이 성질이이산 푸리에 변환의 바탕입니다. 이산 푸리에 변환은 소리 표본 같은 수 n개를, 한 바퀴를 0번, 1번, 2번, … 도는 …
- 분할 정복
… = 7, d = 2) 전체는 n^{\log_2 7} \approx n^{2.81} 입니다. 이어지는 곳.고속 푸리에 변환: 신호를 여러 주파수의 파동의 합으로 나누는 계산(이산 푸리에 변환)을 n^2 이 아닌 n \log n …
- 이산 코사인 변환
… 고르면 에너지가 모든 진동수에 흩어져 있어 거의 줄일 수 없습니다. 왜 사인과 코사인을 다 쓰는이산 푸리에 변환(DFT)이 아니라 코사인일까요? DFT는 16개 값이 끝없이 되풀이된다고 봅니다. 그래서 '경사'처럼 …
- 표본화 정리
… 뜻이고, 여기에 잡음을 더하면 섀넌–하틀리 정리가 됩니다. 뽑은 표본들은 이산 코사인 변환이나고속 푸리에 변환(1965년 제임스 쿨리와 존 튜키가 널리 알린 빠른 계산법)으로 다시 진동수별로 나눠 분석하고 …
- 상태 공간 모형과 선형 순환
… 곱셈이 되므로, 고속 푸리에 변환을 쓰면 길이 n에 대해 n\log n 에 비례하는 계산으로 끝납니다(이산 푸리에 변환). 글을 한 토큰씩 만들 때는 되풀이로 계산합니다. 되풀이는 걸음마다 고정된 크기의 상태만 들고 갑니다. …