1. FFTW 简介
FFTW (Fastest Fourier Transform in the West) 是一个高性能的傅里叶变换库,支持:
-
实数/复数的一维/多维变换
-
任意长度的输入(包括质数长度)
-
多线程和SIMD优化
2. 安装 FFTW
Linux/macOS
bash
# Debian/Ubuntu
sudo apt-get install libfftw3-dev
# macOS (Homebrew)
brew install fftw
Windows
-
下载预编译库:FFTW Windows版
-
配置头文件路径和库文件路径到项目
3. C++ 代码实现
示例:实数信号FFT(Real-to-Complex)
cpp
#include <iostream>
#include <vector>
#include <cmath>
#include <fftw3.h>
int main() {
// 参数设置
const double fs = 1000.0; // 采样率 (Hz)
const double duration = 1.0; // 信号时长 (秒)
const int N = fs * duration; // 采样点数
const double target_freq = 50.0; // 目标频率 (Hz)
// 1. 生成测试信号 (50Hz + 120Hz)
std::vector<double> signal(N);
for (int i = 0; i < N; ++i) {
double t = i / fs;
signal[i] = 0.7 * sin(2 * M_PI * 50 * t) + 1.0 * sin(2 * M_PI * 120 * t);
}
// 2. 分配FFTW输入/输出数组
fftw_complex* spectrum = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * (N/2 + 1));
double* fft_input = (double*)fftw_malloc(sizeof(double) * N);
// 3. 准备输入数据
std::copy(signal.begin(), signal.end(), fft_input);
// 4. 创建FFT计划
fftw_plan plan = fftw_plan_dft_r2c_1d(N, fft_input, spectrum, FFTW_ESTIMATE);
// 5. 执行FFT
fftw_execute(plan);
// 6. 计算频率轴
std::vector<double> freqs(N/2 + 1);
for (int i = 0; i <= N/2; ++i) {
freqs[i] = i * fs / N;
}
// 7. 提取目标频率成分 (50Hz)
int k = round(tar