在 FFT 变得比 DFT 更有效之前,我必须计算多少个傅立叶幅度?

计算科学 matlab 傅立叶分析
2021-12-04 09:54:59

我只需要计算复杂二维数组的少量低频傅里叶分量。随着输入数组的变化,我将一遍又一遍地计算相同的傅立叶分量。显然,在我只想要一个傅立叶分量的限制下,建立一个 DFT 矩阵来给出我所追求的分量,并重复乘以该矩阵将是最快的。

在另一个限制中,如果我想要所有傅立叶分量,使用 FFT 会更快。

在什么时候计算数组的 FFT 并简单地拉出我所追求的组件会变得更快?

如果它有所作为,在我的特殊情况下,输入数组将类似于256×256. 我正在使用 MATLAB,这意味着我的 FFT 是使用 FFTW 完成的,并且矩阵 DFT 的矩阵乘法是通过 MATLAB 在后台使用的任何矩阵乘法算法完成的。

2个回答

17.

大量的工作已经投入到良好的 fft 实现中,您不太可能能够可靠地胜过良好的 fft 库。例如,fftw“自动适应您的机器、缓存、内存大小、寄存器数量以及通常无法为多台机器优化程序的所有其他因素”参考此页面

你是对的,在某些情况下计算几个点积会更快,但它会非常依赖于系统。

一个实验:

EDU>> n = 256^2;
EDU>> x = randn(n,1);
EDU>> d = randn(1,n); %really, you should take a row from the output of the dftmtx command. But dftmtx(n) won't fit on my laptop...
EDU>> tic;d*x;toc; %time to compute a single frequency from the dft matrix
Elapsed time is 0.000225 seconds.
EDU>> tic;fft(x);toc; %time to compute the entire fft
Elapsed time is 0.003909 seconds.

因此,当有 4096 个数据点计算整个 fft 时,只需要比计算单个点积长约 17 倍。

作为替代方案,您可以考虑使用Goertzel 算法直接计算您感兴趣的频率分量。