离散傅里叶变换(python numpy笔记)
numpy中关于离散傅里叶变换
·
一、离散傅里叶变换(DFT)
离散傅里叶变换的正变换和逆变换:
DFT是将离散信号分解为一系列离散三角函数分量,每一个分量都有对应的幅度、频率以及相位。通过所有分量叠加,可以得到原离散信号。
二、numpy中离散傅里叶变换的幅度谱和相位谱
-
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/2−1,...,−n2,−n1,0,n1,n2,...,nn/2−1,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(n−1)/2,−n(n−3)/2,...,−n2,−n1,0,n1,n2,...,n(n−3)/2,n(n−1)/2)∗dt1
n越小,那么傅里叶变换之后的用来叠加的离散三角函数个数(频率个数)越少,离散三角函数对应频率的间隔越大。
- 如果n是偶数,那么复数数组对应的频率为:(dt为原数组的采样时间间隔)
-
-
举例如下:
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之后对应的离散信号的频率间距会更小。
-
幅度谱和相位谱
频率为横轴,幅度为纵轴的图即为幅度谱;频率为横轴,相位为纵轴的图为相位谱。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
更多推荐
已为社区贡献1条内容
所有评论(0)