庫利-圖基快速傅裡葉變換算法(Cooley-Tukey算法)[1]是最常見的快速傅裡葉變換算法。這一方法以分治法為策略遞歸地將長度為N = N1N2的DFT分解為長度分別為N1和N2的唡個較短序列的DFT,以及與旋轉因子的複數乘法。這種方法以及FFT的基本思路在1965年J. W. Cooley和J. W. Tukey合作發表An algorithm for the machine calculation of complex Fourier series之後開始為人所知。但後來發現,實際上這唡位作者只是重新發明了高斯在1805年就已經提出的算法(此算法在歷史上數次以各種形式被再次提出)。
! In place Cooley-Tukey FFT
recursive subroutine fft(x)
complex(kind=dp), dimension(:), intent(inout) :: x
complex(kind=dp) :: t
integer :: N
integer :: i
complex(kind=dp), dimension(:), allocatable :: even, odd
N=size(x)
if(N .le. 1) return
allocate(odd((N+1)/2))
allocate(even(N/2))
! divide
odd =x(1:N:2)
even=x(2:N:2)
! conquer
call fft(odd)
call fft(even)
! combine
do i=1,N/2
t=exp(cmplx(0.0_dp,-2.0_dp*pi*real(i-1,dp)/real(N,dp),kind=dp))*even(i)
x(i) = odd(i) + t
x(i+N/2) = odd(i) - t
end do
deallocate(odd)
deallocate(even)
end subroutine fft
end module fft_mod
program test
use fft_mod
implicit none
complex(kind=dp), dimension(8) :: data = (/1.0, 1.0, 1.0, 1.0, 0.0,
0.0, 0.0, 0.0/)
integer :: i
call fft(data)
do i=1,8
write(*,'("(", F20.15, ",", F20.15, "i )")') data(i)
end do
private double[] dft(double[] data)
{
int n = data.Length;
int m = n;// I use m = n / 2d;
double[] real = new double[n];
double[] imag = new double[n];
double[] result = new double[m];
double pi_div = 2.0 * Math.PI / n;
for (int w = 0; w < m; w++)
{
double a = w * pi_div;
for (int t = 0; t < n; t++)
{
real[w] += data[t] * Math.Cos(a * t);
imag[w] += data[t] * Math.Sin(a * t);
}
result[w] = Math.Sqrt(real[w] * real[w] + imag[w] * imag[w]) / n;
}
return result;
}
離散余弦變換(英語:DCT for Discrete Cosine Transform)是與傅裡葉變換相關的一種變換,類似於離散傅裡葉變換,但是只使用實數。離散余弦變換相當於一個長度大概是它兩倍的離散傅裡葉變換,這個離散傅裡葉變換是對一個實偶函數進行的(因為一個實偶函數的傅裡葉變換仍然是一個實偶函數),在有些變形裡面需要將輸入或者輸出的位置移動半個單位(DCT有8種標准類型,其中4種是常見的)。