繁体   English   中英

与Matlab ifft的Ooura逆FFT差异

[英]Ooura inverse FFT differences from Matlab ifft

今天,尽管努力使我的C ++代码(使用Ooura FFT库)获得与Matlab相同的结果,但我终于找到了问题和解决方案。

在Matlab中,以以下方式计算幅度-频率响应网格的反向系数(来自Matlab内部fir2()函数的代码片段):

%H contains 8192 points of AFR data
Hconj = [H conj(H(npt-1:-1:2))];   % Fourier transform of real series
ht = real(ifft(Hconj));            % Symmetric real series

结果,我们得到了16384个bin,它们的后半部分可以扔掉,但是前半部分可以稍后用作FIR系数。

但是,如果我使用Real DFT rdft()函数在Ooura中执行相同的操作,则会得到在最终AFR中产生镜像效果的系数,AFR图上的所有频率都将除以2。

于是我想到一个主意:在我的C ++代码中,我将H放大了两倍(16384点),并用频率数据将它们全部填充而没有镜像。 瞧! 它起作用了,现在我得到了16384点,丢掉了8192点之后的所有东西,现在得到的AFR与Matlab的匹配。

我坚信所有标准FFT实现都需要此镜像。 不需要在输入中镜像数据就是Ooura的一个怪癖,或者可能还有其他事情发生吗?

“实际” FFT通常通过自动使用输入的复共轭作为镜像值来在内部进行镜像。 标准的FFT / IFFT不会执行此操作,因为它的FFT / IFFT实施方式的自由度(例如,从IFFT产生复数输出或说是复数域滤波器)具有两倍的自由度,被限制为仅实际输出。

FFT的频率仓步长由其长度控制。 长度的一半会产生频率步长的一半,就像您的原始试用版一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM