**고속 푸리에 변환**은 이산 푸리에 변환과 그 역변환을 빠르게 수행하는 효율적인 알고리즘이다. FFT는 디지털 신호 처리에서 편미분 방정식의 근을 구하는 알고리즘에 이르기까지 많은 분야에서 사용한다.

신호 이 복소수라고 가정할 때, DFT는 다음과 같이 정의한다.

이 식을 정의에 따라 계산하면 O(''N'')의 연산이 필요하지만, FFT를 이용하면 O(''N'' log ''N'')의 연산만으로 가능하다. ''N''이 합성수일 경우 그 소인수 분해를 이용하여 연산 횟수를 줄일 수는 있지만, FFT를 사용하면 ''N''이 소수일 경우에도 O(''N'' log ''N'')번의 연산 횟수를 보장한다.

 을 **회전자(Twiddle factor)**라고 부른다. 1의 거듭제곱근([https://en.wikipedia.org/wiki/Root%20of%20unity Root of unity]), **단위근**도 회전자의 다른 호칭이다. 이 회전자를 사용해 식(1)을 다시 정리하면,
회전자는 N에 관한 주기성으로 인해 다음과 같은 성질이 있음을 쉽게 알수있다.
(예 1)

## 쿨리-튜키 알고리즘

### 분할(Decimation)
어떤 길이 ''N''인 수열을 다음과 같이 index가 짝수인 것과 홀수인 것들만 각각 모아서 두 개의 수열로 나누는 것이다.

분할 대신 일정 부분을 뽑아낸다는 '솎음'으로 번역한 경우도 있는데 단어 번역으로는 더 정확하지만, FFT에서는 오히려 분할이라는 표현이 이해하는데 더 낫다.

### 다니엘슨-란초스 보조정리(Danielson-Lanczos Lemma)
1942년 위 두사람은 FFT의 기초가 되는 공식을 발견한다. 즉, 길이 ''N''(단 짝수인 경우)의 DFT는 각각 길이가 ''N/2''인 두 개의 DFT의 합으로 다시 쓸 수 있다는 것. 하나는 짝수 index 포인트들로 형성되고, 다른 것은 홀수 index 포인트들로 만들어진다.
이 분할(decimation)을 수식으로 표현해 보자.

식(2)의 DFT를 짝수번째 항, 홀수 번째 항끼리 묶으면 즉, 분할하면
길이가 짝수이므로 각 항의 갯수는 같다. 두번째 괄호 항에서 을 밖으로 빼면
이를 다시 쓰면
그런데,

가 성립하므로,
여기서,  는 위 수식에서 보였듯이 각각 짝수(Even)항과 홀수(Odd)항으로 구성된 ''N/2''-DFT이다.

다음으로 ''f''를 구해보자. 윗식으로부터

''f 임에 주의하자. 정리하면,

식(4)의 중요성은 다음 쿨리-튜키 알고리즘에서 설명하겠다. 이 식을 그림(1)로 나타낼 수 있으며, 마치 나비 모양이라고 해서 이런 분할 과정을 **나비연산(butterfly operation)**이라 부르고, 그 그림을 **나비(butterfly)**라고 한다.섬네일|대체글=basic radix-2 butterfly diagram|가운데|380x380픽셀|그림 1. 기본적인 기수 2 시분할 나비

### 역비트순(Bit-reversed Order)
만약 ''N''이 2의 거듭제곱이면 즉 ''N=2'' 이면 분할(decimation)에의해 길이가 ''N/2'' 인 두신호는 길이가 ''N/4'' 인 두신호로 쪼개어진다. 이런 방식으로 계속 분할을 진행하면 결국 길이가 2인''(N=2)'' 신호로 나누어진다. ''N=2'' 인 DFT는 매우 쉽게 계산된다.
그림(2)와 같이 길이가 8인''(N=8'')인 신호를 생각하자. 처음 길이가 8인 신호는 다니엘슨-란초스 보조정리에의해 분할을 계속하면 stage 3과 같은 순서가 된다.

그런데 위의 표에서 처음 원래의 신호와 최종적으로 나누어진 신호의 순서를 이진수로 나타내면 그림에서와 같이 대응하는 신호의 모든 비트들을 거꾸로 배열한 것과 같다. 이것을 **Bit reversal** 이라 부른다. 이런 현상은 신호가 ''N=2'' 라면 항상 나타나는 현상이다. 계산구조가 **in-place**''(입력 신호 메모리 장소에 출력 값을 덮어쓰는 것. 다른 표현으로 원래의 샘플 메모리 안에서 FFT를 수행하고 추가적인 버퍼 메모리를 사용하지않는 것)''이어야 한다는 요구조건을 포기한다면 입력자료와 출력 결과 둘 다 순서대로 나열되도록 하는 것이 가능하며, 이를 **out-of-place**라 한다.

### 쿨리-튜키 알고리즘(Cooley-Tukey algorithm)
가장 일반적으로 사용되는 FFT 알고리즘은 쿨리-튜키 알고리즘이다. 이 방법은 1965년에 J. W. 쿨리와 J. W. 튜키가 발표하여 널리 알려졌지만, 나중에 카를 프리드리히 가우스가 1805년에 같은 방법을 이미 개발하였으며, 그 뒤에도 제한된 형태의 FFT가 종종 발견되었음이 밝혀졌다.

식(2)의 경우 ''k =0'' 에서 ''N-1''까지의 각 항의 계산에 ''N'' 회의 곱셈이 필요하기 때문에, 전체적으로 ''N /4'' 회의 곱셈으로 실행할 수 있으므로 이 분할(Decimation)에 의해 계산량은 약 절반으로 줄어든다. 또한, 이 분할을 2회, 3회,... 반복하면 즉, 재사용(reuse)하면 계산량은 약 ''1/4, 1/8,...'' 로 격감한다. 이것이 쿨리-튜키 FFT (정확하게는 기수 2 쿨리-튜키 FFT)의 기본적인 생각이다.

쿨리-튜키 알고리즘은 보통 크기 ''N''을 재귀적으로 2등분하여 길이가 2인 신호가 얻어질 때까지 분할 정복 알고리즘(Divide and conquer algorithm)을 적용하기 때문에 ''N'' = 2인 경우에 많이 적용된다.

보통의 프로그램 코드는 ''log N'' 개의 단계(그림(2)나 그림(3)의 stage에 해당)에 대한 재귀 호출을 수행하고, 각 단계에서 ''N / 2'' 회의 복소수 곱셈과 ''N'' 회의 복소수 가산을 수행한다. 따라서 복소수 곱셈 횟수는 ''(N / 2) * log N'' 로 감소하고 부동 소수점 연산의 양은 ''N * log N''의 order가 될 수 있다. 이것은 쿨리-튜키 FFT의 일반적인 연산량이다.
일반적으로 ''N'' = ''n''는 같을 필요가 없으며, 따라서 ''N''이 임의의 합성수일 때에도 적용 가능하다(아래 혼합 기수 FFT 를 참고). 쿨리-튜키 알고리즘은 DFT를 더 작은 크기의 DFT로 나누기 때문에, 뒤에 설명된 다른 FFT 알고리즘과 함께 사용될 수 있다.

### 푸리에 행렬**(Fourier Matrix)**
회전자로 이루어진 차수(order) N의 복소 방데르몽드 행렬((Vandermonde matrix)
을 푸리에 행렬(Fourier Matrix)이라고 한다.
식(2)를 아래와 같이 푸리에 행렬로 표현할 수 있다. 편의를 위해 지금부터는 회전자의 아래첨자 ''N''을 생략하겠다. 예를들면, 
식(3a)가 보여주는 회전자의 주기성으로 인해 까지 모두 계산할 필요가 없이
까지만 계산하면 된다. 다음 기수 2 시분할 FFT의 식(6)에서 확인해 볼 수 있다.

## 기수 2 알고리즘(Radix-2 FFT Algorithm)
앞에 열거한 내용들을 기초하여 기수 2 FFT 알고리즘을 다루어본다. 이는 다른 알고리즘들을 다루는데 있어 가장 기초가 되는 알고리즘이다. 우선 기수의 뜻을 살펴보자.

#### 기수(radix)의 의미
**-** 기수(基數)는 밑 또는 기저로도 부르고, 숫자 표현(진법 체계)의 기준이 되는 수다.
radix 는 라틴어로 뿌리(root)라는 뜻이다.

(예) 10진수의 기수(base)는 10이다.
''10 '' 의 밑(base)은 10이다.

**-** 거듭제곱 ''r ''의 기수(radix)는 ''r''이다. 여기서, ''n''는 지수(exponent)이다.

(예) ''N=2 ''는 기수 4(radix-4)이다.

##### 시분할(DIT) FFT와 주파수분할(DIF) FFT
FFT를 수행하는 방식에는 두가지 알고리즘이 있다.

1) 입력(일반적으로 시간 domain)을 나누는 방식 - 시분할 FFT

2) 출력(일반적으로 주파수 domain)을 나누는 방식 - 주파수분할 FFT

다음은 이들에 대해 설명한다.

### 1. 기수 2 시분할 FFT(Radix-2 Decimation in Time FFT)
''N'' = 4 일 때, 기수 2 시분할 FFT를 유도해 보자.
우선 식(5)로부터 ''N'' = 4 DFT 행렬식은 다음과 같다.

지수의 짝 홀을 기준으로 위의 식을 다음과 같이 열의 순서를 바꾸는 변형할 수 있다(이는 곧, 앞서 설명한 분할(decimation)을 의미한다).

또한 식(3a)로 부터