我正在研究的基本思想是使用从电机捕获的音频信号进行自动故障检测。我喜欢一组在没有故障时记录的样本音频信号,以及在不同转速下出现故障时记录的音频信号。在听到音频时,我可以清楚地识别和区分音频信号。但是我怎样才能在技术上或程序上区分它。基本上我来自计算机科学背景,所以我很难找到实现方法是否可以通过音频分析本身找到,或者我是否想对音频信号实现机器学习
样本信号在这里
1. 3500rpm-清洁 2. 3500rpm-故障
我正在研究的基本思想是使用从电机捕获的音频信号进行自动故障检测。我喜欢一组在没有故障时记录的样本音频信号,以及在不同转速下出现故障时记录的音频信号。在听到音频时,我可以清楚地识别和区分音频信号。但是我怎样才能在技术上或程序上区分它。基本上我来自计算机科学背景,所以我很难找到实现方法是否可以通过音频分析本身找到,或者我是否想对音频信号实现机器学习
样本信号在这里
1. 3500rpm-清洁 2. 3500rpm-故障
@Stan 给出的参考是一个很好的参考,但仍然存在使用什么措施的问题。
以前,我已经看到峰态运行良好。但是,在这个数据集上似乎并没有那么好。
我要考虑的两件事是:
以下是分析数据左通道的一小部分的几个图。他们是:
也许最简单的是最后一个:虽然能量值之间有重叠,但没有太多,而且它们似乎分开得很好。
第二个可能是原始 PDF 估计值:检查哪个最接近均匀分布。您可以在时域图中看到,vibes
信号通常离clean
信号的原点更远。
第二个图在 3 x 2 上显示与上一个图相同,但它是带通滤波信号的 100 个样本能量。那看起来还是更好。
仅在下面的 R 代码
#Q42498
library('tuneR')
library(e1071)
clean <- readWave('3500-clean.wav')
vibes <- readWave('3500-vibes.wav')
t_index <- seq(10000,11000)
par(mfrow=c(2,3))
plot(clean@left[t_index], type='l', col='blue', lwd=3)
lines(vibes@left[t_index], col='red')
title('Time doman 10000:11000')
plot(log(abs(fft(clean@left[t_index]))[1:500]), type='l', col='blue', ylim = c(8,15))
lines(log(abs(fft(vibes@left[t_index]))[1:500]), col='red')
title('Frequency domain 10000:11000')
library(signal)
bpf <- butter(10,c(0.4,0.8), type='pass')
clean_f <- filter(bpf, clean@left[t_index])
vibes_f <- filter(bpf, vibes@left[t_index])
plot(abs(fft(clean_f))[1:500], type='l', col='blue', lwd=3)
lines(abs(fft(vibes_f))[1:500], col='red')
title('Band Pass Filtered 10000:11000')
vibes_pdf <- density(vibes@left[t_index])
clean_pdf <- density(clean@left[t_index])
plot(clean_pdf$y/sum(clean_pdf$y), type='l', col='blue', lwd=3)
lines(vibes_pdf$y/sum(vibes_pdf$y), col='red')
title('PDF Estimate (Original)')
vibes_f_pdf <- density(vibes_f)
clean_f_pdf <- density(clean_f)
plot(clean_f_pdf$y/sum(clean_f_pdf$y), type='l', col='blue', lwd=3)
lines(vibes_f_pdf$y/sum(vibes_f_pdf$y), col='red')
title('PDF Estimate (filtered)')
maf <- rep(1,100)
clean_e <- filter(maf, 1, (clean@left[t_index])^2)
vibes_e <- filter(maf, 1, (vibes@left[t_index])^2)
plot(clean_e, type='l', col='blue', lwd=3, ylim=c(min(clean_e,vibes_e), max(clean_e,vibes_e)))
lines(vibes_e, col='red')
title('100 sample energy')
你可能想看看:
突变检测:理论与应用1 Michele Basseville ` IRISA/CNRS Rennes, France Igor V. Nikiforov Institute of Control Sciences Moscow, Russia
有点老了,但出来的时候就先进了。
这个主题有很多谷歌搜索结果。
以下是我在评论中所说的:
绿点表示谐波(基频×1、2、3、4 ...),而红点表示谐波之间的“失真产物”。红点是使机器听起来很糟糕的频率分量。
如果您知道机器的 RPM 是多少,那么您可以制作陷波/梳状滤波器来测量谐波频率与非谐波频率,当非谐波高于某个相对阈值时,您就知道它已经坏了。
如果您不知道 RPM,则必须通过确定哪个频率是基本频率(不一定是最强频率)来测量它。您可以将搜索限制在机器能够产生的 RPM 等范围内。但脏波形看起来像一个缺少基频的低八度音程的信号,因此您必须小心不要测量错误的频率并计算它信号干净。
这是制作此图的 Python 代码:
from soundfile import read
import matplotlib.pyplot as plt
import numpy as np
from scipy import signal
fig, (clean, vibes) = plt.subplots(2, 1, sharex=True, sharey=True)
N = 2**16
window = signal.kaiser(N, 40)
filename = '3500-clean.flac' # converted to mono
data, fs = read(filename)
f, Pxx = signal.welch(data, fs=fs, window=window, nperseg=N)
clean.plot(f, 20*np.log10(Pxx))
clean.set_title(filename.split('.')[0])
filename = '3500-vibes.flac'
data, fs = read(filename)
f, Pxx = signal.welch(data, fs=fs, window=window, nperseg=N)
vibes.plot(f, 20*np.log10(Pxx))
vibes.set_title(filename.split('.')[0])
faxis = np.fft.rfftfreq(N, 1/fs)
plt.xlim(0, 1000)
plt.ylim(-140, -50)