机械故障诊断信号的幅域分析 - 幅值概率密度函数 | 基于python的代码实现,在CWRU数据上实战
欢迎关注我的公众号《故障诊断与python学习》
代码位置:https://github.com/HappyBoy-cmd/fault_diagnosis_signal_processing 参考资料: 机械故障诊断及典型案例解析(第2版,时献江)
1、随机信号的幅值概率密度函数介绍
随机信号的幅值概率密度函数表示信号的幅值落在某一个指定区间内的概率 如上图所示为时域波形及幅值概率密度。
x
(
t
)
x(t)
x(t)值落在
x
x
x到
x
+
Δ
x
x+\Delta x
x+Δx之间的时间为
T
x
=
Δ
t
1
+
Δ
t
2
+
Δ
t
3
+
Δ
t
4
T_{x}=\Delta t_{1}+\Delta t_{2}+\Delta t_{3}+\Delta t_{4}
Tx?=Δt1?+Δt2?+Δt3?+Δt4?,其总的观测时间为
T
T
T,则出现的频次可以用
T
x
/
T
T_{x} / T
Tx?/T;
当
Δ
x
\Delta x
Δx趋于零时,就得到该点的幅值概率密度函数。
-
典型信号的时域波形和幅值概率密度函数如下图所示,根据随机过程理论,随机信号的幅值概率密度函数符合正态分布规律; -
确定性信号如简谐信号的幅值概率密度函数则呈盆形曲线,如图3.2(a)所示; -
一般故障信号多是随机信号和简谐信号的混合体,所以当信号幅值概率密度函数的正态分布曲线上端出现盆型漏斗时[图3. 2(b) ] ,往往预示着系统存在故障征兆。
2、代码实战
2.1导入包
import scipy.io as scio
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal, fftpack, stats
from matplotlib import rcParams
config = {
"font.family": 'serif',
"font.size": 10,
"font.serif": ['SimSun'],
"mathtext.fontset": 'stix',
'axes.unicode_minus': False
}
rcParams.update(config)
2.2定义CWRU数据读取函数
使用CWRU轴承数据进行分析,选取了4个mat文件,包括内圈故障、外圈故障、滚动体故障和正常状态。
文件名解释(以“1730_12k_0.007-InnerRace”为例):
1730:转速,单位rpm
12k:采样频率,Hz
0.007:故障大小,单位inch,1inch=25.4mm
InnerRace:代表为内圈故障
def data_acquision(FilePath):
"""
fun: 从cwru mat文件读取加速度数据
param file_path: mat文件绝对路径
return accl_data: 加速度数据,array类型
"""
data = scio.loadmat(file_path)
data_key_list = list(data.keys())
accl_key = data_key_list[3]
accl_data = data[accl_key].flatten()
return accl_data
3、内圈故障幅值概率密度函数分析
3.1时域图绘制
file_path = r'E:/研究生/pytorch/CSDN代码/fault_diagnosis_signal_processing/第4篇-包络谱/1730_12k_0.007-InnerRace.mat'
xt = data_acquision(file_path)
plt.figure(figsize=(12,3))
plt.plot(xt)
plt.show()
print(xt)
[ 0.22269856 0.09323776 -0.14651649 ... -0.36125573 0.31138814
0.17055689]
3.2编程思路分析
-
step1:确定幅值绝对值最大值max_value -
step2:在幅值区间[-max_value, max_value]内等分划分成n个小区间,区间长度为interval_len -
step3:在幅值区间[-max_value, max_value]内等分划分成n个小区间,每个区间长度为interval_len -
step4:在第i个幅值小区间[-max_value+i * interval_len, max_value+(i+1) * interval_len]内,统计落入该区间的幅值个数count_num -
step5:将n个区间统计的个数count_num形成一个列表count_num_list -
step6:绘制柱状图,即得到幅值概率密度图
def interval_num_count(data, low, high):
'''
fun: 统计一维数据data落入某一个区间[low, high]内的数量
param low: 区间下限
param high: 区间上限
return count_num: 落入某一个区间[low, high]内的数量
'''
count_num = 0
for i in range(len(data)):
if data[i]>low and data[i]<high:
count_num += 1
return count_num
n = 10
xt = xt - np.mean(xt)
max_value = np.abs( xt[np.argmax( np.abs(xt) )] )
count_num_list = []
for i in range(n):
interval_len = max_value*2/n
low = -max_value + i*interval_len
high = -max_value + (i+1)*interval_len
count_num = interval_num_count(data=xt, low=low, high=high)
count_num_list.append(count_num)
plt.bar(x=range( len(count_num_list) ), height=count_num_list)
是不是已成雏形,有正态分布形状了。只是原始区间分成了10份,看不太出来
下面分成100份
n = 100
xt = xt - np.mean(xt)
max_value = np.abs( xt[np.argmax( np.abs(xt) )] )
count_num_list = []
for i in range(n):
interval_len = max_value*2/n
low = -max_value + i*interval_len
high = -max_value + (i+1)*interval_len
count_num = interval_num_count(data=xt, low=low, high=high)
count_num_list.append(count_num)
plt.bar(x=range( len(count_num_list) ), height=count_num_list)
这下有正态分布那味了。不得不说这个形状还挺优美的。
4、封装成一个plt_amp_prob_density_fun()函数
def plt_amp_prob_density_fun(data, n):
'''
fun: 绘制幅值概率密度函数
param data: 输入数据,1维array
param n: 分割成段数的数量
return: 绘制幅值概率密度函数
'''
max_value = np.abs( xt[np.argmax( np.abs(xt) )] )
count_num = []
for i in range(n):
interval = max_value*2/n
low = -max_value + i*interval
high = -max_value + (i+1)*interval
count = interval_num_count(data=xt, low=low, high=high)
count_num.append(count)
plt.bar(x=range( len(count_num) ), height=count_num)
plt.show()
4.1滚动体故障轴承幅值概率密度函数分析
此时的正态分布形状比较瘦小,峭度K大于3。K值大于3时,说明信号中冲击成分幅值增大。
4.2外圈故障轴承幅值概率密度函数分析
file_path = r'E:/研究生/pytorch/CSDN代码/fault_diagnosis_signal_processing/第4篇-包络谱/1730_12k_0.007-OuterRace3.mat'
xt = data_acquision(file_path)
plt.figure(figsize=(12,3))
plt.plot(xt)
plt.show()
n = 100
plt_amp_prob_density_fun(data=xt, n=n)
在顶部出现了第1节介绍时说的盆型漏斗
4.3正常状态轴承幅值概率密度函数分析
file_path = r'E:/研究生/pytorch/CSDN代码/fault_diagnosis_signal_processing/第4篇-包络谱/1730_48k_Normal.mat'
xt = data_acquision(file_path)
plt.figure(figsize=(12,3))
plt.plot(xt)
plt.show()
n = 100
plt_amp_prob_density_fun(data=xt, n=n)
看着与标准正态分布挺像的
5、总结
与正常状态轴承的幅值概率密度函数相比,其故障轴承状态有两种情况
- 第一种情况:概率密度函数偏瘦小,定量分析及为峭度K大于3
- 第二种情况:概率密度函数顶部出现盆型漏斗,该现象预示存在故障
|