Thư viện FFTW (Fastest Fourier Transform in the West) cung cấp các hàm C tối ưu cho biến đổi Fourier nhanh (FFT) một hoặc nhiều chiều, được ứng dụng rộng rãi trong xử lý tín hiệu và phân tích tần số.
Thiết lập FFTW trên Hệ điều hành Windows
1. Tải xuống phiên bản đã biên dịch sẵn
Truy cập trang chủ FFTW, chọn gói cài đặt dành cho Windows 64-bit (phiên bản 3.3.5). Giải nén tệp sau khi tải về hoàn tất. 2. Tạo file thư viện liên kết
Mở công cụ dòng lệnh x64 Native Tools Command Prompt for VS 2022, di chuyển đến thư mục giải nén và thực thi lần lượt:
Đoạn mã sau minh họa quá trình biến đổi thuận và nghịch:
1. Tải xuống phiên bản đã biên dịch sẵn
Truy cập trang chủ FFTW, chọn gói cài đặt dành cho Windows 64-bit (phiên bản 3.3.5). Giải nén tệp sau khi tải về hoàn tất. 2. Tạo file thư viện liên kết
Mở công cụ dòng lệnh x64 Native Tools Command Prompt for VS 2022, di chuyển đến thư mục giải nén và thực thi lần lượt:
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3f-3.def
lib /machine:x64 /def:libfftw3l-3.def
Thao tác này sinh ra các file .lib cần thiết cho quá trình liên kết.
3. Cấu hình Dự án Visual Studio
- Thêm đường dẫn tiêu đề: Trong thuộc tính dự án → C/C++ → Additional Include Directories, chỉ định thư mục chứa file fftw3.h
- Chỉ định thư viện: Tại Linker → Additional Library Directories, nhập đường dẫn đến file .lib vừa tạo
- Liên kết file thư viện: Trong Linker → Input → Additional Dependencies, thêm tên file libfftw3-3.lib
- Sao chép DLL: Copy file libfftw3-3.dll vào thư mục đích xuất (output directory) của dự án để đảm bảo chạy thời gian thực thi
Đoạn mã sau minh họa quá trình biến đổi thuận và nghịch:
#include <fftw3.h>
#include <iostream>
#include <vector>
int main() {
const int length = 8;
std::vector<double> input{0, 1, 2, 3, 4, 5, 6, 7};
std::vector<double> output(length);
std::vector<double> error(length);
fftw_complex* spectrum = static_cast<fftw_complex*>(fftw_malloc(sizeof(fftw_complex) * length));
fftw_plan forward = fftw_plan_dft_r2c_1d(length, input.data(), spectrum, FFTW_ESTIMATE);
fftw_plan backward = fftw_plan_dft_c2r_1d(length, spectrum, output.data(), FFTW_ESTIMATE);
fftw_execute(forward);
fftw_execute(backward);
const double norm_factor = 1.0 / length;
for (int i = 0; i < length; ++i) {
error[i] = input[i] - output[i] * norm_factor;
std::printf("Gốc: %.1f | Phục hồi: %.3f\n", input[i], output[i] * norm_factor);
}
fftw_destroy_plan(forward);
fftw_destroy_plan(backward);
fftw_free(spectrum);
return 0;
}
Kết quả thực thi minh họa thành công với giá trị phục hồi gần đúng sau khi chuẩn hóa hệ số.