在进行 FFT 和 IFFT 之后,我只能听到耳机中的噪音...这是代码:
double* spectrum = new double[n];
fftw_plan plan;
plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT10, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT01, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
也许我选择了错误的 FFT 类型?
附言数据是初始信号
更新
好的,现在代码是
fftw_complex* spectrum = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);
fftw_plan plan;
plan = fftw_plan_dft_r2c_1d(n, data, spectrum, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
plan = fftw_plan_dft_c2r_1d(n, spectrum, data, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
问题仍然存在,我的数据数组已损坏。
更新 #2
所以,问题出在我的变换大小和规范化上。如果我使用真实到真实的 FFTW_REDFT10 和 FFTW_REDFT01 转换,我需要使用哪些转换大小? 2*n?或者是其他东西?然后我需要通过将每个元素除以 2*n 来标准化我的输出信号?
感谢大家的回复。
更新 #3
再次感谢大家的回复。我已经在你的帮助下解决了这个问题。这是工作代码:
// FFT
fftw_complex* spectrum = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * n);
fftw_plan plan;
plan = fftw_plan_dft_r2c_1d(n, data, spectrum, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
// some filtering here
// IFFT
plan = fftw_plan_dft_c2r_1d(n, spectrum, data, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
// normalizing
for (int i = 0; i < n; i++) {
data[i] = data[i] / n;
}
最佳答案
我没有看到您在哪里对输出进行标准化。您必须将输出值除以数据数组中的元素数,才能将数据规范化回原始值范围。
请参阅 FFTW 手册 4.8.2,最后一段(我有 V3.2 手册)。
关于c++ - FFTW:IFFT后信号由噪声组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430172/