在python中可以使用numpy和scipy进行傅里叶的操作且二者的傅里叶操作函数名都差不多
首先我们导入相关模块并初始化一个信号
import numpy as np
import matplotlib.pyplot as plt
t = np.linspace(0, 1, 1000)
signal = 5*np.sin(50*2*np.pi*t) + 10*np.sin(10*2*np.pi*t) + 6
显示信号
plt.figure(figsize=(10, 5))
plt.plot(t, signal)
plt.show()
使用numpy中的fft模块进行傅里叶变换的相关操作
# 间传入的信号进行傅里叶变换,返回傅里叶变换的结果,返回的是复数
f_signal = np.fft.fft(signal)
# 传入信号长度及采样率,返回对应频率
f_t = np.fft.fftfreq(len(t), 1/1000)
# 要对傅里叶变换结果取绝对值
plt.plot(f_t, abs(f_signal))
plt.xlim(-100, 100)
plt.show()
这个时候都图并不是我们想要的频谱图
# 由于是计算结果是双边频谱而且它的左右两边的整体顺序不连续的是先右边的数据再左边的数据所以要进行排序
# 对傅里叶变换的结果进行排序
f_signal = np.fft.fftshift(f_signal)
# 对频率进行排序
f_t = np.fft.fftshift(f_t)
# 要将幅值转换成信号成分的幅度需要除以信号的长度又因为是双倍频谱所以只需要除信号长度的一半
f_signal = f_signal / len(t) * 2
# 因为双边频谱的频率等于0的位置是左右两部分的叠加所以还需要再除2
f_signal[f_t==0] = f_signal[f_t==0] / 2
plt.plot(f_t, abs(f_signal))
plt.xlim(-100, 100)
plt.show()
通过处理后便能出现幅度等于幅值的频谱图