首页 > 编程学习 > 稀疏表示与字典学习(2)基于字典学习的振动信号处理

稀疏表示与字典学习(2)基于字典学习的振动信号处理

  • 1. 信号读取
  • 2. 基于字典学习的信号特征提取
  • 3. 提取结果与可视化
  • 参考文献资料

1. 信号读取

测试数据集为Ottawa 变转速轴承数据集

import scipy.io as scio
import matplotlib.pyplot as plt

def data_acquist(file_path):
    # 从mat文件中 提取振动信号
    # file_path = r"C:\Users\LIU\PycharmProjects\pythonProject\ottawa_bearing_data_division\H-A-1.mat"
    data = scio.loadmat(file_path)
    vib_data = data["Channel_1"]
    return vib_data

file_path = r"C:\Users\LIU\PycharmProjects\pythonProject\ottawa_bearing_data_division\H-A-1.mat"
xt = data_acquist(file_path)

正如前面博客所测试的,该数据集包括不同加减速状态的振动监测信号和对应转速信号。
在这里插入图片描述

2. 基于字典学习的信号特征提取

基于字典学习的信号特征提取步骤如下:

  • 先将采集到的轴承振动加速度信号进行分割得到字典学习训练集;
  • 计算学习字典中每一列原子与信号y的相关系数,
  • 选取相关系数最大的四个所对应的原子进行循环移位得到优化字典;
  • 利用正交匹配追踪算法重构信号,获得轴承故障特征提取时域图。
# 字典生成
print('Learning the dictionary...')
t0 = time()
dico = MiniBatchDictionaryLearning(n_components=300, alpha=0.1, n_iter=500)
V = dico.fit(res_data).components_
V = (V.T / np.linalg.norm(V, ord=1, axis=1)).T
dt = time() - t0
print('done in %.2fs.' % dt)

3. 提取结果与可视化

提取字典的部分结果如下所示

plt.figure(figsize=(20, 10))
total_basis = len(V)
col = int(np.sqrt(total_basis))
for i, comp in enumerate(V[:col*col]):
    plt.subplot(col, col, i + 1)
    plt.plot(np.linspace(0, 1, len(comp)), comp)
    plt.xticks(())
    plt.yticks(())
plt.suptitle('Dictionary learned from voices patches\n' +
             'Train time %.1fs on %d patches \n coherence is %.3f' % (dt, len(res_data), coherence(V)),
             fontsize=16)
plt.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23)
plt.show()

运行结果:

res_data shape: (2000, 1000)
Learning the dictionary...
done in 14.52s.

可视化结果,轴承正常状态监测信号:
在这里插入图片描述

可视化结果,轴承外圈故障:
在这里插入图片描述

参考文献资料

【1】https://www.jmlr.org/papers/volume13/zitnik12a/zitnik12a.pdf
【2】https://sporco.readthedocs.io/en/latest/examples/index.html

Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式