【问题标题】:Discrete Fourier Transform: How to use fftshift correctly with fft离散傅里叶变换:如何正确使用 fftshift 和 fft
【发布时间】:2011-12-06 07:47:10
【问题描述】:

我想在 numpy 数组 Y 上数值计算 FFT。为了测试,我使用高斯函数 Y = exp(-x^2)。 (符号)傅里叶变换是 Y' = 常数 * exp(-k^2/4)。

import numpy
X = numpy.arange(-100,100)
Y = numpy.exp(-(X/5.0)**2)

天真的方法失败了:

from numpy.fft import *
from matplotlib import pyplot

def plotReIm(x,y):
    f = pyplot.figure()
    ax = f.add_subplot(111)
    ax.plot(x, numpy.real(y), 'b', label='R()')
    ax.plot(x, numpy.imag(y), 'r:', label='I()')
    ax.plot(x, numpy.abs(y), 'k--', label='abs()')
    ax.legend()


Y_k = fftshift(fft(Y))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)

real(Y_k) 在正值和负值之间跳跃,这对应于跳跃阶段,符号结果中不存在该阶段。这当然是不可取的。 (结果在技术上是正确的,因为 abs(Y_k) 给出了预期的幅度 ifft(Y_k) 是 Y。)

这里,函数 fftshift() 渲染数组 k 单调递增并相应地改变 Y_k。对 zip(k, Y_k) 应用此操作不会改变两个向量。

此更改似乎可以解决问题:

Y_k = fftshift(fft(ifftshift(Y)))
k = fftshift(fftfreq(len(Y)))
plotReIm(k,Y_k)

如果需要单调 Y 和 Y_k,这是使用 fft() 函数的正确方法吗?

上面的逆运算是:

Yx = fftshift(ifft(ifftshift(Y_k)))
x = fftshift(fftfreq(len(Y_k), k[1] - k[0]))
plotReIm(x,Yx) 

对于这种情况,documentation 明确指出 Y_k 的排序必须与 fft() 和 fftfreq() 的输出兼容,我们可以通过应用 ifftshift() 来实现。

这些问题困扰了我很长时间:fft() 和 ifft() 的输出和输入数组是否总是这样a[0] should contain the zero frequency term, a[1:n/2+1] should contain the positive-frequency terms, and a[n/2+1:] should contain the negative-frequency terms, in order of decreasingly negative frequency [numpy reference],其中“频率”是自变量?

Fourier Transform of a Gaussian is not a Gaussian 上的答案没有回答我的问题。

【问题讨论】:

    标签: python numpy fft


    【解决方案1】:

    FFT 可以被认为是产生一组向量,每个向量都有一个幅度和相位。 fft_shift 操作将相位角为零的参考点从 FFT 孔径的边缘更改为原始输入数据向量的中心。

    执行此操作时,结果的相位(以及复矢量的实部)有时会变得不那么“跳跃”,尤其是当某些输入函数被加窗以使其在 FFT 孔径边缘周围不连续时。或者,如果输入围绕 FFT 孔径中心对称,则 FFT 结果的相位在 fft_shift 之后将始终为零。

    一个 fft_shift 可以通过 N/2 的向量旋转来完成,或者通过简单地翻转 FFT 结果中的交替符号位来完成,这可能对 CPU dcache 更友好。

    【讨论】:

      【解决方案2】:

      fft(和ifft)的输出定义在这里:http://docs.scipy.org/doc/numpy/reference/routines.fft.html#background-information

      这是例程计算的,不多也不少。观察到离散傅里叶变换与连续傅里叶变换有很大不同。对于密集采样的函数,两者之间存在关系,但这种关系除了fftshift之外还涉及相位因子和缩放。这是您在绘图中看到的振荡的原因。您可以根据上述 DFT 数学公式自行计算出必要的相位因子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-09
        • 2020-09-24
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        相关资源
        最近更新 更多