Biến đổi Fourier nhanh
Biến đổi Fourier nhanh (FFT) là một thuật toán rất hiệu quả để tính toán Biến đổi Fourier rời rạc (DFT) và Biến đổi ngược. Có nhiều loại thuật toán FFT khác nhau sử dụng các kiến thức từ nhiều mảng khác nhau của toán học, từ số phức tới lý thuyết nhóm và lý thuyết số. Bài này chỉ giới thiệu tổng quan các kĩ thuật và một số tính chất tổng quát. Các thuật toán cụ thể được mô tả chi tiết hơn trong các bài khác được liên kết ở dưới.
Phép biến đổi DFT phân tích một dãy các số thành các thành phần ở các tần số khác nhau. Nó được sử dụng trong nhiều lĩnh vực khác nhau (xem các tính chất và ứng dụng ở biến đổi Fourier rời rạc) nhưng tính toán trực tiếp từ định nghĩa thường quá chậm trong thực tế. FFT là một cách để đạt được cùng kết quả đó nhưng nhanh hơn nhiều: tính DFT của N điểm trực tiếp theo định nghĩa đòi hỏi O(N2) phép tính, trong khi FFT tính ra cùng kết quả đó trong O(N log N) phép tính.
Định nghĩa và tốc độ
[sửa | sửa mã nguồn]Giả sử x0, x1,..., xn là các số phức. DFT được định nghĩa bởi công thức sau:
Tính trực tiếp từ định nghĩa trên đòi hỏi O(N2) phép tính: có N số Xk cần tính, để tính mỗi số cần tính một tổng N số hạng. Một FFT là một phương pháp để tính cùng kết quả đó trong O(N log N) phép tính. Ko/l(mauio
Các thuật toán
[sửa | sửa mã nguồn]Thuật toán Cooley–Tukey
[sửa | sửa mã nguồn]Thuật toán FFT phổ biến nhất là thuật toán FFT Cooley-Tukey[1]. Đây là một thuật toán chia để trị dùng đệ quy để chia bài toán tính DFT có kích thước hợp số N=N1N2, thành nhiều bài toán tính DFT nhỏ hơn có kích thước N1 và N2, cùng với O(N) phép nhân với căn của đơn vị, thường được gọi là thừa số xoay (theo Gentleman và Sande, 1966)[2].
Phương pháp này (cùng với ý tưởng chung về một FFT) được phổ biến rộng rãi bởi bài báo của J. W. Cooley và J. W. Tukey năm 1965 nhưng sau đó người ta nhận ra rằng hai tác giả đó đã phát hiện lại một cách độc lập thuật toán mà Carl Friedrich Gauss đã tìm ra khoảng năm 1805 (và sau đó được phát hiện lại nhiều lần trong những trường hợp đặc biệt).
Dạng phổ biến nhất của thuật toán Cooley-Tukey là chia biến đổi thành hai nửa kích thước N / 2 ở mỗi bước (vì vậy chỉ dùng được cho kích thước là lũy thừa của 2) nhưng bất kì cách phân tích ra thừa số nào cũng đều có thể dùng được (điều này cả Gauss và Cooley/Tukey đều nhận ra). Đây là dạng cơ số 2 và dạng nhiều cơ số. Mặc dù ý tưởng cơ bản là đệ quy, khi lập trình, người ta thường sắp xếp lại thuật toán để tránh đệ quy. Ngoài ra, do thuật toán Cooley-Tukey chia một DFT thành các DFT nhỏ hơn, có thể phối hợp nó với các thuật toán khác cho DFT, chẳng hạn như những thuật toán mô tả dưới đây.
Các thuật toán FFT khác
[sửa | sửa mã nguồn]Có nhiều thuật toán FFT khác ngoài Cooley-Tukey. Với N=N1N2 và N1, N2 nguyên tố cùng nhau, có thể dùng thuật toán FFT thừa số nguyên tố (thuật toán Good-Thomas), dựa trên [[định lý số dư Trung Quốc|định lý số dư Trung Hoa]], để phân tích DFT tương tự như Cooley-Tukey nhưng không cần thừa số xoay.
Thuật toán FFT cho số thực và dữ liệu đối xứng
[sửa | sửa mã nguồn]Trong nhiều ứng dụng, dữ liệu vào cho DFT là số thực. Khi đó kết quả thỏa mãn điều kiện đối xứng sau
và nhiều thuật toán FFT hiệu quả được thiết kế cho trường hợp này. Một phương pháp là lấy một thuật toán thông thường (chẳng hạn Cooley-Tukey) rồi bỏ đi phần tính toán không cần thiết, do đó tiết kiệm khoảng một nửa thời gian và bộ nhớ cần thiết.
Các vấn đề tính toán
[sửa | sửa mã nguồn]Vấn đề mở trong khoa học máy tính: Chặn dưới của độ phức tạp tính toán của biến đổi Fourier nhanh là gì? Liệu nó có thể nhanh hơn Θ(N log N) hay không? (các vấn đề mở khác trong khoa học máy tính)
|
Một bài toán mở quan trọng về mặt lý thuyết là chứng minh chặn dưới cho độ phức tạp tính toán và số phép tính của biến đổi Fourier nhanh. Hiện vẫn chưa có chứng minh nào cho việc DFT có thực sự đòi hỏi Ω(N log N) phép tính, ngay cả trong trường hợp kích thước N là lũy thừa của hai, mặc dù không có thuật toán nào có độ phức tạp thấp hơn. Chú ý rằng tuy số phép tính thường là quan tâm chính về mặt lý thuyết, trên thực tế, tốc độ thực thi phụ thuộc nhiều yếu tố khác như các tối ưu hóa cho bộ nhớ đệm và ống lệnh CPU (CPU Pipes).
Theo công trình của Winograd năm 1978[3], chặn dưới chặt cho số phép nhân của FFT đã được biết là Θ(N).
Xem thêm
[sửa | sửa mã nguồn]- Thuật toán FFT Bruun
- Thuật toán FFT Rader
- Thuật toán FFT Bluestein
- Biểu đồ cánh bướm - một biểu đồ minh họa cho FFT.
- Thuật toán Odlyzko–Schönhage áp dụng FFT cho chuỗi Dirichlet
- FFTW "Fastest Fourier Transform in the West" - Thư viện viết bằng 'C' để tính biến đổi Fourier rời rạc (DFT) trong một hay nhiều chiều
- FFTPACK - một thư viện FFT khác cho C và Java
Ghi chú
[sửa | sửa mã nguồn]- ^ Cooley, James W.; Tukey, John W. (1965). “An algorithm for the machine calculation of complex Fourier series”. Math. Comput. 19 (90): 297–301. doi:10.1090/S0025-5718-1965-0178586-1.
- ^ W. M. Gentleman, G. Sande (1966). “Fast Fourier Transforms: for fun and profit”. Proceedings of the November 7-10, 1966, fall joint computer conference (AFIPS '66 (Fall)). ACM, New York, NY, USA. tr. 563–578. doi:10.1145/1464291.1464352.
- ^ Winograd, S. (1978). “On computing the discrete Fourier transform”. Math. Computation. 32 (141): 175–199. doi:10.1090/S0025-5718-1978-0468306-4. JSTOR 2006266