计算傅立叶变换前的fftshift:Matlab

时间:2014-11-11 15:35:43

标签: matlab fft kissfft

我正在研究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。我需要改变这个吗?

2 个答案:

答案 0 :(得分:3)

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

编辑:

让我举一个例子,我希望能够解决问题。让我们说我们的图像是整个图像中具有不同位置的一堆sinc函数的总和。在频域中,这些sinc函数中的每一个都是具有相同幅度但具有不同线性相位分量的矩形函数,其确定图像域中sinc的位置。通过在进行DFT之前交换图像,我们使中心像素的频域表示的线性相位分量为零。此外,其他sinc函数的线性相位分量现在将是它们与中心像素的距离的函数。如果我们事先没有交换图像,那么rect函数的线性相位分量将是它们与图像左上角像素的距离的函数。这将是非直观的,并且将涉及相同类型的相位缠绕考虑因素,人们看到将(pi,2pi)rad /样本中的频率等同于更直观(-pi,0)rad /样本。

答案 1 :(得分:2)

对于图像,最好使用fft2。 matlab的惯例是在拐角处安排带有DC的2D ffts。大概是因为行/数组约定。 fftshift允许更直观地显示FFT,其中DC位于中心。

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

更详细的教程here