一、离散傅里叶变换(DFT)

离散傅里叶变换的正变换和逆变换:

DFT是将离散信号分解为一系列离散三角函数分量,每一个分量都有对应的幅度、频率以及相位。通过所有分量叠加,可以得到原离散信号。

二、numpy中离散傅里叶变换的幅度谱和相位谱
  1. numpy.fft.fft(a, n=None, axis=-1, norm=None)
    numpy.fft.fft计算输入数组a的n个点的离散傅里叶变换,得到长度为n的一维复数数组。每一个复数分量对应三角函数,都可计算对应三角函数的幅度、频率以及相位。这些所有频率的三角函数叠加可以得到原数组。

    • 幅度为复数的模除以采样点数n

    • 相位为复数的辅角

    • 频率可通过复数在数组中的位置对应求出(需利用函数numpy.fft.fftshift调整复数数组顺序,使得复数数组对应的频率顺序为负频率、0、正频率)

      • 如果n是偶数,那么复数数组对应的频率为:(dt为原数组的采样时间间隔)
        ( − 1 2 , − n / 2 − 1 n , . . . , − 2 n , − 1 n , 0 , 1 n , 2 n , . . . , n / 2 − 1 n , 1 2 ) ∗ 1 d t (-\frac{1}{2}, -\frac{n/2-1}{n},..., -\frac{2}{n} , -\frac{1}{n} ,0,\frac{1}{n},\frac{2}{n},...,\frac{n/2-1}{n},\frac{1}{2})*\frac{1}{dt} (21,nn/21,...,n2,n1,0,n1,n2,...,nn/21,21)dt1
      • 如果n是奇数,那么复数数组对应的频率为:
        ( − ( n − 1 ) / 2 n , − ( n − 3 ) / 2 n , . . . , − 2 n , − 1 n , 0 , 1 n , 2 n , . . . , ( n − 3 ) / 2 n , ( n − 1 ) / 2 n ) ∗ 1 d t (-\frac{(n-1 )/2 }{n}, -\frac{(n-3 )/2}{n},..., -\frac{2}{n} , -\frac{1}{n} ,0,\frac{1}{n},\frac{2}{n},...,\frac{(n-3 )/2}{n},\frac{(n-1 )/2 }{n})*\frac{1}{dt} (n(n1)/2,n(n3)/2,...,n2,n1,0,n1,n2,...,n(n3)/2,n(n1)/2)dt1

      n越小,那么傅里叶变换之后的用来叠加的离散三角函数个数(频率个数)越少,离散三角函数对应频率的间隔越大。

  2. 举例如下:

     import numpy as np
    
     fft=np.fft.fft(arrayTemp,512)
     fftshift=np.fft.fftshift(fft)
     amp=abs(fftshift)/len(fft)
     pha=np.angle(fftshift)
     fre=np.fft.fftshift(np.fft.fftfreq(d=1,n=512))
    

    输入数组为arrayTemp,np.fft.fft计算了该输入数组的DFT,输出的复数数组长度为512个点;np.fft.fftshift调整复数数组顺序。那么,

    • 幅度amp。
    • 相位pha。np.angle(复数)计算复数的辅角主值。
    • 离散复数数组对应的频率值为从-1/2至1/2的512个值。d=dt,为原数组的采样时间间隔,这里设为1。np.fft.fftfreq返回离散傅里叶变换的采样频率值,np.fft.fftshift对应于复数数组调整频率数组顺序。注意如果将n设为1024,DFT之后对应的离散信号的频率间距会更小。
  3. 幅度谱和相位谱
    频率为横轴,幅度为纵轴的图即为幅度谱;频率为横轴,相位为纵轴的图为相位谱。

    import matplotlib.pyplot as plt
    
    plt.figure()
    plt.plot(fre,amp)
    plt.xlabel('Frequency');plt.ylabel('Amplitude')
    
    plt.figure()
    plt.plot(fre,pha)
    plt.xlabel('Frequency');plt.ylabel('Phase')
    

参考:

https://docs.scipy.org/doc/numpy-1.15.1/reference/routines.fft.html#module-numpy.fft
https://zhuanlan.zhihu.com/p/90102365

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐