赞
踩
今天看到一篇文章
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、使用卷积核进行实验
在进行卷积前先采用短时傅里叶变换观察振动信号是否为非平稳信号。
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左右。
在进行卷积之前先设计不同频率的卷积核。
代码中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)
完整代码
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()
f = filter(2000) #卷积核
可以看出卷积结果的频谱图都分布在卷积核频谱图附近。也就是2000Hz附近
f = filter(4000) #卷积核
与上面相似,可以看出卷积结果的频谱图都分布在卷积核频谱图附近。也就是4000Hz附近
f = filter(8000) #卷积核
不用说了
因此两个信号时域的卷积就是频域的相乘,卷积神经网络应该也是这么个原理暂时没试
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。