3

我正在查看 matlab 项目中的一些 FFT 代码,FFT 和逆 FFT 是这样计算的:

% Here image is a 2D image.
image_fft = fftshift(image,1);
image_fft = fftshift(image_fft,2);

image_fft = fft(image_fft,[],1);
image_fft = fft(image_fft,[],2);

image_fft = fftshift(image_fft,1);
image_fft = fftshift(image_fft,2);

% Some processing and then same sequence of fftshift, ifft and fftshift to move to
% time domain

我试图在网上找到一些信息,但不知道为什么在计算 FFT 之前需要完成 fftshift。

我的另一个问题是这是否真的是 Matlab 特有的东西。例如,我计划将此代码移植到 C++ 并使用 KISS FFT。我需要对此有所不同吗?

4

2 回答 2

3

人们喜欢在 DFT 之前进行交换的原因是因为它使图像的中心像素成为零相移的像素。它通常使依赖于相位的算法更容易思考和实现。它不是 matlab 特定的,如果您想将代码的确切版本移植到另一种语言,您也需要事先执行 quadswap。

编辑:

让我举一个例子,我希望能把事情弄清楚。假设我们的图像是一堆 sinc 函数的总和,在整个图像中具有不同的位置。在频域中,这些 sinc 函数中的每一个都是具有相同幅度但具有不同的线性相位分量的 rect 函数,这决定了 sinc 在图像域中的位置。通过在进行 DFT 之前交换图像,我们使中心像素的频域表示的线性相位分量为零。此外,其他 sinc 函数的线性相位分量现在将是它们与中心像素的距离的函数。如果我们没有事先交换图像,那么 rect 函数的线性相位分量将是它们与图像左上角像素的距离的函数。

于 2014-11-11T16:11:19.777 回答
2

对于图像,最好使用fft2. 将 2D ffts 与 DC 放在角落是 matlab 的惯例。大概是因为行/数组约定。fftshift可以更直观地显示以 DC 为中心的 FFT。

我不完全理解您复制的代码是关于什么的,是使用 matlab 对图像进行 fft 和反 fft 的示例。

还有更详细的教程在这里

于 2014-11-11T15:46:01.263 回答