振动信号直接使用卷积神经网络提取特征

今天看到一篇文章

https://huaweicloud.csdn.net/6380304bdacf622b8df867d6.html?spm=1001.2101.3001.6650.17&utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaiduactivity-17-119684535-blog-86352790.pc_relevant_3mothn_strategy_and_data_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaiduactivity-17-119684535-blog-86352790.pc_relevant_3mothn_strategy_and_data_recovery&utm_relevant_index=24

直接对振动信号进行卷积,就想看一下卷积对振动信号的作用。

卷积其实就是加权平均,其中一个重要结论就是两个信号时域的卷积就是频域的相乘,因此如果将振动信号直接输入到卷积神经网络中那么卷积核对振动信号进行卷积就相当于一个具有特定频率的卷积核与振动信号进行卷积,其得到的结果的频率就是卷积核的频率与振动信号频率对位相乘。(注:卷积神经网络中的卷积其实是互相关,两者差不多不做区分)
本文采用离心泵轴承故障数据进行实验:
1、故障信号分析,故障采用频率为20kHz
2、设计不同特征频率的卷积核
3、使用卷积核进行实验

1、故障信号分析

在进行卷积前先采用短时傅里叶变换观察振动信号是否为非平稳信号。

import pandas as pd
import numpy as np
from scipy.signal import stft
import matplotlib.pyplot as plt


def loadData():
    data = pd.read_csv("./pump.TXT", sep="\t", encoding="ANSI").values[:, 4:]

    return data[:, 0]


def showStft(data):
    f, t, Z = stft(data, 20000, nperseg=256)
    Z = np.abs(Z)
    Z = np.array(Z, dtype=np.float64)
    plt.pcolormesh(t, f, Z)
    plt.colorbar()
    plt.show()

if __name__ == "__main__":
    data = loadData()
    showStft(data)

下图是计算结果,从图中可以看出由于故障程度不变,且采样时间较短,因此其频谱没有明显的变化,信号是平稳的,信号特征频率大致分布在3000Hz左右。
在这里插入图片描述

2、卷积核设计

在进行卷积之前先设计不同频率的卷积核。
代码中fs表示频率大小,其中卷积核的采样频率与故障数据相同,卷积核大小为64,改变fs就能得到大小为64且频率不同的卷积核。

def filter(fs):
    t = np.linspace(0, 1, 20000)
    signal = np.sin(2*np.pi*fs*t) + np.cos(2*np.pi*fs*t)
    return signal[:64]

下面代码中f为卷积核,data为故障数据,其中步长step默认为1,使用如下方法进行卷积也就是加权平均。

def convolution(f, data):
    result = []
    for i in range(len(data) - len(f) + 1):
        result.append(np.sum(f*data[i:i+len(f)]))

    return np.array(result)

3、实验

完整代码

import pandas as pd
import numpy as np
from scipy.signal import stft
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


def loadData():
    data = pd.read_csv("./pump.TXT", sep="\t", encoding="ANSI").values[:, 4:]

    return data[:, 0]


def showStft(data):
    f, t, Z = stft(data, 20000, nperseg=256)
    Z = np.abs(Z)
    Z = np.array(Z, dtype=np.float64)
    plt.pcolormesh(t, f, Z)
    plt.colorbar()
    plt.show()


def convolution(f, data):
    result = []
    for i in range(len(data) - len(f) + 1):
        result.append(np.sum(f*data[i:i+len(f)]))

    return np.array(result)


def FFT (Fs,data):
    L = len (data)                          # 信号长度
    N =int(np.power(2,np.ceil(np.log2(L))))    # 下一个最近二次幂
    FFT_y = (np.fft.fft(data, N))/L*2                  # N点FFT,但除以实际信号长度 L
    n = int(N/2)
    Fre = np.arange(n)/N*Fs          # 频率坐标
    FFT_y = FFT_y[range(int(N/2))]          # 取一半
    return Fre, np.abs(FFT_y)


def filter(fs):
    t = np.linspace(0, 1, 20000)
    signal = np.sin(2*np.pi*fs*t) + np.cos(2*np.pi*fs*t)
    return signal[:64]


if __name__ == "__main__":
    data = loadData()
    showStft(data) # 显示stft图
    f = filter(2000) #卷积核
    result = convolution(f, data+0.1) #卷积结果

    # 分别对原始数据、卷积结果以及卷积核做fft变换,并画出频谱图
    fre1 , fft_y1 = FFT(20000, data)
    fre2 , fft_y2 = FFT(20000, result)
    fre3 , fft_y3 = FFT(20000, f)
    plt.subplot(3, 1, 1)
    plt.title("振动信号")
    plt.plot(fre1, fft_y1)
    plt.subplot(3, 1, 2)
    plt.title("卷积结果")
    plt.plot(fre2 , fft_y2)
    plt.subplot(3, 1, 3)
    plt.title("卷积核")
    plt.plot(fre3, fft_y3)
    plt.show()

(1)2000Hz卷积核

f = filter(2000) #卷积核

可以看出卷积结果的频谱图都分布在卷积核频谱图附近。也就是2000Hz附近
在这里插入图片描述

(2)4000Hz卷积核

f = filter(4000) #卷积核

与上面相似,可以看出卷积结果的频谱图都分布在卷积核频谱图附近。也就是4000Hz附近
在这里插入图片描述

(3)8000Hz卷积核

f = filter(8000) #卷积核

不用说了
在这里插入图片描述
因此两个信号时域的卷积就是频域的相乘,卷积神经网络应该也是这么个原理暂时没试

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值