在打电话给fft或ifft之前,我是否需要调用Matlab fftshift?

时间:2015-08-23 12:56:27

标签: matlab

在David Voelz撰写的“计算傅立叶光学,Matlab教程”一书中写道,在调用fft或ifft之前需要调用fftshift,但是在命令fftshift的matlab文档中,它只写了这个命令“通过将零频率分量移动到阵列的中心来重新排列fft,fft2和fftn的输出”。在Matlab文档中没有提到在调用fft之前应该调用这个命令,我看到一些调用fft而不事先调用ffthift的例子。

我的问题是:在调用fft或ifft之前是否需要调用fftshift? 如果在调用fft之前不需要调用fftshift,并且只在调用fft之后调用ffthift,那么我们何时应该使用(如果有的话)命令ifftshift与计算数据集的fft有关? / p>

5 个答案:

答案 0 :(得分:3)

matlab fft仅计算频谱的一半(如果您的样本数为奇数,则为正频率和零频率),以节省计算时间。

然后,在该向量的末尾添加频谱的后半部分(前半部分的复共轭)。

所以你在fft之后得到的是:

0 1 2 3 ...(freq bins> 0)... Fs/2 -Fs/2 ...(freq bins< 0)... -3 -2 -1

Fs是频率样本。

现在,fftshift只是在矢量开头移动负频率区间(频谱的第二部分),这样就可以显示从-Fs / 2开始到结束的漂亮频谱在+ Fs / 2。

因此,要回答您的问题,在致电fftshiftfft之前,您不需要使用ifft。但是如果您在向量上使用了fftshift,则应该通过应用ifftshiftfftshift来撤消它(我认为这两个调用都是等效的。)

答案 1 :(得分:2)

如果您在fftshift的文档中继续阅读: "在频谱中间用零频率分量可视化傅立叶变换是很有用的。"

执行fft不需要移位,但可视化傅里叶变换很方便。因此,是否使用fftshift取决于您是否想要将变换可视化。

答案 2 :(得分:2)

请注意,ifftshift与fftshift不同,因为它将负数转回正数。在fftshift之前假设在频域中有一个简单的3 bin单位脉冲

[0,exp(-jw1),exp( - (jw1-pi)= exp(-jw1 + pi)];

fftshift给出

[exp(-jw1 + pi)],0,exp(-jw1)];

你可以看到阶段的不连续性。如果执行ifftshift,则负频率将转回正值: [0,exp(-jw1),exp(-jw1 + pi)];

然而,fftshift再次给出了:

[exp(-jw1),exp(-jw1 + pi),0];

可以看出相位单调性不相同,(又称,fftshift-ifftshift情况给出[减少,增加],而fftshift-fftshift情况给出[增加,减少]阶段。)

答案 3 :(得分:0)

简单的答案是在调用fft之前不需要调用fftshiftfftshift不影响快速傅立叶变换的计算。 fftshift重新排列矩阵内的值。例如:

cameraman = imread('cameraman.tif');
fftshifted_cameraman = fftshift(cameraman);
subplot(1,2,1); imshow(cameraman); title('Cameraman');
subplot(1,2,2); imshow(fftshifted_cameraman); title('FFTShifted Cameraman');

答案 4 :(得分:0)

根据您正在学习的书名,我假设您正在处理图像。那么正确的方法是在调用 [i]fft 之前和之后调用 fftshift 和 ifftshift。

你的代码应该是这样的

spectrum = fftshift(fft2(ifftshift(myimage))

应用傅里叶逆变换时完全相同

myimage = fftshift(ifft2(ifftshift(spectrum))