参考资料:
书籍:机械故障诊断及典型案例解析(第2版,时献江)
1. 傅里叶级数
1.1 傅里叶级数原理及典型信号频谱特点
2. 典型信号的傅里叶变换
2.1 单位脉冲信号(
2.1 周期单位脉冲信号(梳妆
3. 信号的采样
3.1 连续信号的采样
3.2 采样定理
3.3 采样点数和频率分辨率
4. 离散傅里叶变换(DFT)
4.1 DFT的理论公式及计算过程
5. 快速傅里叶变换(FFT)
5.1 FFT方法提出背景
5.2 FFT计算案例
摘要
1、傅里叶级数
1.1 傅里叶级数原理及典型信号频谱特点
(1) 基本原理
式中
式中,
于是,幅值
式中,
也可以采用复数描述傅里叶级数,根据欧拉公式有:
代入式 (1) 式变为:
即:
式中,
此时出现了负频率,这是由于用复数表示
下面求系数
其中,
(2) 周期信号傅里叶级数谱的特点
图1 傅里叶级数的幅值谱图
图2 两个正弦信号的叠加(有公共周期)
图3 两个正弦信号的叠加(无公共周期)
(3) 典型信号的傅里叶级数谱
图4 方波及其频谱
2、典型信号的傅里叶变换
(1)
图5 单位脉冲函数
(2)
①
a. 任何一函数
b. 任一函数
②
a.任一函数
b.同理,任一函数
图6 任一函数与
(3)
图7
(4)
图8 含有均值和不含均值的简谐信号的频谱
(1) 定义
周期单位脉冲序列
式中,
图9 周期单位脉冲序列及其频谱
(2) 梳状
3、信号的采样
图10 连续时间信号的采样过程
图11 理想采样过程
图12 波形采样过程 (普通采样频率)
图13 波形采样过程(较低采样频率)
图14 不产生混叠现象时的频谱
即:
这就是香农采样定理。
式中,
采样频率
频率分辨率
采样点数
此时, 应取
由于采样长度未变,此时,频率分辨率仍然不变,且
4、离散傅里叶变换(DFT)
(1) 第一步:时域离散
(2) 第二步:时域截断
图15 DFT过程的图解说明
(3) 第三步:频域离散(或称时域延拓)
图16 DFT运算频谱的实际位置
5、快速傅里叶变换(FFT)
5.1 快速傅里叶变换(FFT)的方法提出背景
5.2 FFT计算案例
图17 FFT运算结果
## 导入包
from matplotlib import pyplot as plt
from matplotlib import rcParams
import numpy as np
import pandas as pd
config = {
"font.family": 'serif', # 衬线字体
"font.size": 14, # 相当于小四大小
"font.serif": ['SimSun'], # 宋体
"mathtext.fontset": 'stix', # matplotlib渲染数学字体时使用的字体,和Times New Roman差别不大
'axes.unicode_minus': False # 处理负号,即-号
}
rcParams.update(config)
##========绘制时域信号图========##
def plt_time_domain(arr, fs=1600, ylabel='Amp(mg)', title='原始数据时域图', img_save_path=None, x_vline=None, y_hline=None):
"""
:fun: 绘制时域图模板
:param arr: 输入一维数组数据
:param fs: 采样频率
:param ylabel: y轴标签
:param title: 图标题
:return: None
"""
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号
font = {'family': 'Times New Roman', 'size': '20', 'color': '0.5', 'weight': 'bold'}
plt.figure(figsize=(12,4))
length = len(arr)
t = np.linspace(0, length/fs, length)
plt.plot(t, arr, c='g')
plt.xlabel('t(s)')
plt.ylabel(ylabel)
plt.title(title)
if x_vline:
plt.vlines(x=x_vline, ymin=np.min(arr), ymax=np.max(arr), linestyle='--', colors='r')
if y_hline:
plt.hlines(y=0.2, xmin=np.min(t), xmax=np.max(t), linestyle=':', colors='y')
#===保存图片====#
if img_save_path:
plt.savefig(img_save_path, dpi=500, bbox_inches = 'tight')
plt.show()
##========绘制频域信号图========##
def plt_fft_img(arr, fs, ylabel='Amp(mg)', title='频域图', img_save_path=None, vline=None, hline=None, xlim=None):
"""
:fun: 绘制频域图模板
:param arr: 输入一维时域数组数据
:param fs: 采样频率
:param ylabel: y轴标签
:param title: 图标题
:return: None
"""
# 计算频域幅值
length = len(arr)
t = np.linspace(0, length/fs, length)
fft_result = np.fft.fft(arr)
fft_freq= np.fft.fftfreq(len(arr), d=t[1]-t[0]) # FFT频率
fft_amp= 2*np.abs(fft_result)/len(t) # FFT幅值
# 绘制频域图
plt.figure(figsize=(12,4))
##=====单边频谱图====##
plt.subplot(1,2,1)
plt.plot(fft_freq[0: int(len(t)/2)], fft_amp[0: int(len(t)/2)], label='Frequency Spectrum', color='b')
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.legend()
##=====双边频谱图====##
plt.subplot(1,2,2)
plt.plot(fft_freq[0: int(len(t))], fft_amp[0: int(len(t))], label='Frequency Spectrum', color='b')
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.legend()
if vline:
plt.vlines(x=vline, ymin=np.min(fft_amp), ymax=np.max(fft_amp), linestyle='--', colors='r')
if hline:
plt.hlines(y=hline, xmin=np.min(fft_freq), xmax=np.max(fft_freq), linestyle=':', colors='y')
#===保存图片====#
if img_save_path:
plt.savefig(img_save_path, dpi=500, bbox_inches = 'tight')
if xlim: # 图片横坐标是否设置xlim
plt.xlim(0, xlim)
plt.tight_layout()
plt.show()
return fft_freq, fft_amp
fs = 100 # 采样频率
f = 10 # 模拟正弦信号频率
time = 10.24 # 采样时长
t = np.linspace(0, time, int(time*fs))
data = 10*np.sin(2*np.pi*f*t)
plt_time_domain(data, fs)
fft_freq, fft_amp = plt_fft_img(data, int(time*fs))
注意,幅值为6点多,与10相差了一些,这是因为时域截断时没有截到整周期,导致出现了频率泄露,因此幅值降低了。可以试试把采样时长设置为10s,这个时候幅值接近10,即频率泄露很轻了。
6、总结