做完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);
问题仍然存在,我的数据阵列已损坏。
所以,问题在于我的变换大小和规范化。如果我使用真实到实际的FFTW_REDFT10和FFTW_REDFT01转换我需要使用的变换尺寸? 2 * N?或者是其他东西?然后我需要通过将每个元素除以2 * n来实现输出信号的标准化 感谢大家的回复。
感谢所有人再次回复。我帮你解决了这个问题。这是工作代码:
// 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;
}
答案 0 :(得分:5)
我看不出你的输出正常化的地方。必须将输出值除以数据数组中的元素数,以将数据规范化为原始值范围。
参见FFTW手册4.8.2,最后一段(我有V3.2手册)。
答案 1 :(得分:2)
您正在执行实际到实际的FFT(实际上,FFTW在内部计算DCT或离散余弦变换,但它会产生相同的结果)。请注意输出光谱数组中计算的点数。实数到实数变换只有n / 2 + 1个实际值放入数组中。
如果你正如你所指出的那样计算一个真实到复数的变换,你将生成光谱的两边(它们是彼此的复共轭),但是你的输出数组需要调整大小以适应复杂的值加上DC结果。