Python fft的登录结果

Python fft的登录结果,python,math,numpy,fft,Python,Math,Numpy,Fft,我试图从测试目标计算MTF。我很容易计算扩展函数,但FFT结果对我来说意义不大。总而言之,这些价值观似乎是交替的,让我对我的期望有所反映。为了测试,我使用了一个简单的方波和numpy: from numpy import fft data = [] for x in range (0, 20): data.append(0) data[9] = 10 data[10] = 10 data[11] = 10 dataFFT = fft.fft(data) 结果看起来是正确的,除了符

我试图从测试目标计算MTF。我很容易计算扩展函数,但FFT结果对我来说意义不大。总而言之,这些价值观似乎是交替的,让我对我的期望有所反映。为了测试,我使用了一个简单的方波和numpy:

from numpy import fft

data = []
for x in range (0, 20):
    data.append(0)

data[9] = 10
data[10] = 10
data[11] = 10

dataFFT = fft.fft(data)
结果看起来是正确的,除了符号。。。我以前4个值为例看到以下内容:

30.00000000+0.00000000 E+00j

-29.0211333+7.10542736e-15j

26.18033989-1.24344979e-14j

-21.75570505+1.24344979e-14j

所以我的问题是,为什么在真实的平面上,正->负->正->负?这不是我所期望的。。。如果我把它画出来,几乎可以看出正确的函数是围绕x轴镜像的

注意:我希望以下是一个例子:

这就是我得到的:

这并不完全出乎意料。如果你想对照传统的曲线图进行检查,在得出任何结论之前,一定要把这些信息转换成震级和相位


我用你的代码和numpy.abs快速检查了mag,numpy,phase的角度。在我看来,它确实像一个sinc()函数,如果时域是一个方脉冲,这就是所期望的。如果你这样做,你会发现一个相当宽的sinc,就像在如此少的样本上短时间脉冲所经历的那样。

这并不是那么意外。如果你想对照传统的曲线图进行检查,在得出任何结论之前,一定要把这些信息转换成震级和相位

我用你的代码和numpy.abs快速检查了mag,numpy,phase的角度。在我看来,它确实像一个sinc()函数,如果时域是一个方脉冲,这就是所期望的。如果你这样做,你会发现一个相当宽的sinc,就像在如此少的样本上短时间的脉冲所经历的那样

  • 您忘记指定数据是真实的还是复杂的

    不是每个人都使用python/numpy(包括我)编写代码,如果您不知道这一点,那么您可能会以错误的方式处理数据到FFT

    • FFT输入可以是实域也可以是复域
    • FFT输出是复数域
    因此,请检查您的FFT实现的文档,并指定它,同时相应地修复您的数据处理。复域通常有第一个值Re和第二个值Im,但这取决于FFT实现/配置

  • 信号

    这里是来自FFT 第一个是输入实域信号(Im=0)单个有限非零宽度脉冲,第二个是FFT输出的Re部分。第三个是FFT输出的Im部分。若你们把它放大一点,你们就会看到每个信号y轴的振幅范围(在左边)

    不要忘记,不同的FFT实现可能具有不同的归一化常数,这将改变信号的振幅。如果需要幅值和相位,请按以下方式进行转换:

    mag=sqrt(Re*Re+Im*Im); // power
    ang=atanxy(Re,Im); // phase angle
    
    atanxy(dx,dy)
    是四象限
    arctan
    也称为
    atan2
    ,但要注意使操作数顺序与
    atanxy/atan2
    实现需要相同。也可以用我的

  • [Notes]

    如果您的输入信号是实域,那么FFT输出是对称的。Re和Im信号如下所示:

    { a0,a1,a2,a3,...,a(n-1),a(n-1)...,a3,a2,a1,a0 }
    
    与上图完全相同。左边是低频,中间是最高频率。如果输入信号是复数域,那么输出可以是任何东西

  • 您忘记指定数据是真实的还是复杂的

    不是每个人都使用python/numpy(包括我)编写代码,如果您不知道这一点,那么您可能会以错误的方式处理数据到FFT

    • FFT输入可以是实域也可以是复域
    • FFT输出是复数域
    因此,请检查您的FFT实现的文档,并指定它,同时相应地修复您的数据处理。复域通常有第一个值Re和第二个值Im,但这取决于FFT实现/配置

  • 信号

    这里是来自FFT 第一个是输入实域信号(Im=0)单个有限非零宽度脉冲,第二个是FFT输出的Re部分。第三个是FFT输出的Im部分。若你们把它放大一点,你们就会看到每个信号y轴的振幅范围(在左边)

    不要忘记,不同的FFT实现可能具有不同的归一化常数,这将改变信号的振幅。如果需要幅值和相位,请按以下方式进行转换:

    mag=sqrt(Re*Re+Im*Im); // power
    ang=atanxy(Re,Im); // phase angle
    
    atanxy(dx,dy)
    是四象限
    arctan
    也称为
    atan2
    ,但要注意使操作数顺序与
    atanxy/atan2
    实现需要相同。也可以用我的

  • [Notes]

    如果您的输入信号是实域,那么FFT输出是对称的。Re和Im信号如下所示:

    { a0,a1,a2,a3,...,a(n-1),a(n-1)...,a3,a2,a1,a0 }
    

    与上图完全相同。左边是低频,中间是最高频率。如果您的输入信号是复域信号,那么输出可以是任何信号。

    您的脉冲是对称的,并且位于FFT窗口的中心(大约N/2)。对称实数据仅对应于FFT结果的余弦或“实”分量。请注意,余弦函数在FFT窗口中心的-1和1之间交替,具体取决于频率