FFT计算傅里叶变换前的移位:Matlab

FFT计算傅里叶变换前的移位:Matlab,matlab,fft,kissfft,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 = f

我正在查看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之前需要进行FFT移位


我的另一个问题是,这是否真的是Matlab特有的东西。例如,我计划将此代码移植到C++,并使用KIS-FFT。我需要知道这件事吗

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

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


还有一个更详细的教程。

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

编辑:


让我举一个例子,希望能澄清问题。假设我们的图像是一组sinc函数的总和,这些函数在整个图像中具有不同的位置。在频域中,这些sinc函数中的每一个都是具有相同振幅但具有不同线性相位分量的rect函数,该线性相位分量确定sinc在图像域中的位置。通过在进行DFT之前交换图像,我们使中心像素频域表示的线性相位分量为零。此外,其他sinc函数的线性相位分量现在将是它们与中心像素的距离的函数。如果我们事先没有交换图像,那么rect函数的线性相位分量将是它们与图像左上角像素距离的函数。这将是非直觉性的,并且将涉及与将(pi,2pi)rad/样本范围内的频率与更直观的(-pi,0)rad/样本相等时所看到的相同类型的相位包裹考虑。

次要注释:未提供示例。我也想看看这个例子@rayryeng oops忘记了链接。好了,谢谢你的指点。谢谢你的评论。你知不知道基斯是否也做过类似的事情?如何用kiss-FFT或其他类似FFTW的库来验证这一点?@Luca我不知道kiss-FFT。这并不能回答OP的问题。他/她在问为什么在DFT之前进行交换。好的,所以它使DC组件位于箱子的中心。我猜其他图书馆也需要这样做。我在这里的帖子中看到,基斯FFT输出中最左边的值也是直流分量,其次是低频和高频。因此,为了复制这个matlab代码,我还需要在Kiss FFT?@Luca中实现一个类似fftshift的例程。如果在FFT之前应用移位,它不会将第零频率移到中心,因为它会移动原始图像而不是频谱。如果使用标准FFT库,应该有一种机制来改变频谱。但是,如果没有,您只需拍摄图像(在像素域中)并将每个值乘以
(-1)^(x+y)
,其中
x
y
是图像中的像素位置(0索引)。通过对其进行FFT,FFT频移特性将生效,并将有效地使您的频谱居中。@CapeCode:是的,您是对的。然而,我认为这也与原点偏移有关。在原始代码中,傅里叶变换后的图像与高斯核相乘(在频域中构造高斯核)。所以,我猜图像的FFT移位将使原点保持一致。@Luca请参见我的编辑示例。我希望这有助于澄清问题。