【问题标题】:Do I need to call fftshift before calling fft or ifft?我需要在调用 fft 或 ifft 之前调用 fftshift 吗?
【发布时间】:2015-08-23 12:56:27
【问题描述】:

在 David Voelz 的“Computational Fourier Optics, A Matlab Tutorial”一书中,写到在调用 fftifft 之前需要调用 fftshift,但在 @ 的 MATLAB 文档中987654324@只写了这个命令

通过将零频率分量移动到数组的中心来重新排列 fftfft2fftn 的输出。

文档中没有提到应该在调用 fft 之前调用此命令,并且我看到了一些调用 fft 而不事先调用 fftshift 的示例。

我的问题是:在调用fftifft 之前是否需要调用fftshift

如果在调用fft 之前不需要调用fftshift,并且只在调用fft 之后调用,那么我们什么时候应该使用(如果有的话)命令ifftshift 与一个数据集的fft的计算?

【问题讨论】:

  • 那么无论您是否事先调用了 fftshift,对 fft 的调用都会返回相同的结果?这怎么可能?

标签: matlab fft


【解决方案1】:

matlab fft 只计算频谱的一半(如果样本数为奇数,则为正频率和零频率)以节省计算时间。 然后,频谱的后半部分(即前半部分的复共轭)正好添加到该向量的末尾。

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

 0 1 2 3 ... Fs/2   -Fs/2 ... -3 -2 -1
<----------------> <------------------>
  positive freq        negative freq

其中Fs 是频率样本。

现在,fftshift 所做的只是移动矢量开头的负频率区间(频谱的第二部分),以便您可以显示从 -Fs/2 开始到 @987654327 结束的漂亮频谱@。 移位后的向量变为:

 -Fs/2 ... -3 -2 -1   0 1 2 3 ... Fs/2
<------------------> <---------------->
    negative freq      positive freq

所以,要回答您的问题,您不需要在致电fftifft 之后或之前使用fftshift。但是如果你在你的向量上使用了fftshift,你应该通过应用ifftshiftfftshift来撤销它。 (我认为这两个调用是等价的。)

【讨论】:

  • MATLAB 为产生 FFT 输出所做的计算是无关紧要的。 FFT 的输出由 DFT 的定义给出,其频率 k=0..N-1。此输出中没有“负频率”。 DFT 是周期性的,这意味着 k=0 处的值与 k=N 处的值相同,并且 k=-N+1 处的值相同。有些人更喜欢查看 k=-N/2..N/2 的输出,fftshift 函数提供了这种能力。 ifftshiftfftshift 不同,它们的功能对于奇数输入不同。
【解决方案2】:

如果您继续阅读fftshift 上的文档: “它对于可视化频谱中间的零频率分量的傅里叶变换很有用。”

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

【讨论】:

  • 我猜当您转换数组以进行绘图并将其分配给原始数组而不是单独的变量时。
  • 那么无论您是否事先调用了 fftshift,对 fft 的调用都会返回相同的结果?怎么可能?
  • 我刚刚告诉过你:你改变了你的变换来绘图,然后想把你的数组移回来做进一步的操作。但是您可以更好地将变换分配给单独的数组,然后不使用反向变换而是使用原始数组。
【解决方案3】:

请注意,ifftshiftfftshift 不同,因为它将负向转换为正向。假设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 case 给出 [decrease, increase] 和 fftshift-fftshift case 给出 [increase, reduction] 相位)。

【讨论】:

    【解决方案4】:

    简单的答案是在调用 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');
    

    【讨论】:

    • 但是通过重新排列值,它确实会影响结果。
    【解决方案5】:

    鉴于您正在学习的书名,我假设您正在使用图像。那么正确的方法是在调用 [i]fft 之前和之后同时调用 fftshift 和 ifftshift。

    你的代码应该是这样的

    spectrum = fftshift(fft2(ifftshift(myimage))
    

    傅里叶逆变换也是如此

    myimage = fftshift(ifft2(ifftshift(spectrum))
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    相关资源
    最近更新 更多