如何正确使用FFTPack库中的__ogg_fdrfftb实现逆FFT?
解决FFTPack __ogg_fdrfftb 与MATLAB/Octave ifft结果不符的问题
核心原因与修正步骤
1. 手动添加归一化操作
MATLAB/Octave的ifft函数默认会对结果执行除以变换长度N的归一化,但FFTPack的__ogg_fdrfftb逆变换函数不会自动完成这一步,这是导致结果幅值差异的最常见原因。
修正方式:在调用__ogg_fdrfftb得到输出数组后,将每个元素都除以变换长度n(即正向FFT时使用的序列长度)。
示例C89代码片段:
// n为变换长度,ifft_output是__ogg_fdrfftb的输出数组 for (int i = 0; i < n; i++) { ifft_output[i] /= n; }
2. 确保输入格式与正向输出完全匹配
__ogg_fdrfftb的输入必须严格对应__ogg_fdrfftf的输出格式:
- 当
n为偶数时:正向输出数组的前n/2 + 1个元素是频谱实部,剩余元素是正频率分量的虚部(Nyquist频率分量无虚部); - 当
n为奇数时:正向输出数组的前(n+1)/2个元素是频谱实部,剩余元素是正频率分量的虚部。
逆变换时传入的输入数组必须是正向变换的完整输出,不能修改顺序或截断。
3. 检查工作区数组的有效性
调用__ogg_fdrfftb时使用的工作区数组,需与__ogg_fdrfftf调用时的工作区保持一致,或确保其大小满足逆变换要求(工作区大小可通过__ogg_fdrffti函数预先计算)。
验证示例
以长度为8的实序列为例:
- 调用
__ogg_fdrfftf(8, input, fft_out, work)得到正向FFT结果; - 调用
__ogg_fdrfftb(8, fft_out, ifft_raw, work)得到逆变换原始结果; - 将
ifft_raw每个元素除以8,最终结果将与MATLAB中ifft(input)的输出完全匹配。
内容的提问来源于stack exchange,提问作者euraad
相关产品推荐
相关产品推荐

