代码语言:javascript复制
import numpy as np#主要用于信号处理相关操作
import matplotlib.pyplot as plt#主要用于数据可视化操作
def DFT(sig):
#离散傅里叶变换
t=np.linspace(0,1.0,len(sig))#创建等间隔时间序列
f=np.arange(len(sig)//2 1,dtype=complex)
for index in range(len(f)):
#计算公式2.1.2,重复上述步骤④~⑥获得傅里叶变换结果
f[index]=complex(np.sum(np.cos(2*np.pi*index*t)*sig),
-np.sum(np.sin(2*np.pi*index*t)*sig))
return f
if __name__=='__main__':
sampling_rate=1000 #采样率
t=np.arange(0, 10.0, 1.0/sampling_rate)#时间轴
N=30
x =np.sin(N*np.pi*t)#定义信号,周期为T=2*pi/N*pi=1/15,频率为1/T=15
x_ft=DFT(x)/len(x)#对信号进行傅里叶变换
freqs = np.linspace(0, sampling_rate//2, len(x)//2 1)#信号频率
#输出原正弦波信号
plt.xlabel("Time")
plt.ylabel("Amplitude($m$)")
plt.title("Original Signal")
plt.xlim(0,1000)
plt.plot(x)
#输出DFT后的信号频谱,此处应为频率=15的幅频曲线
plt.figure(figsize=(16,4))
plt.plot(freqs,2*np.abs(x_ft),'b-')
plt.xlabel("Frequency(Hz)")
plt.ylabel("Amplitude($m$)")
plt.title("Amplitude-Frequency Curve")
plt.xlim(0,100)
plt.show()
算法:离散傅里叶变换(Discrete Fourier Transform,DFT)是将信号从时域变换到频域计算信号的频谱,进而研究信号的频谱结构和变化规律。