最近在捣鼓信号异常检测的时候,发现有个挺有意思的方法。不需要复杂的深度学习框架,直接在MATLAB里用传统信号处理+图像处理思路就能搞定。咱们先看个实际案例
MATLAB环境下一种新的一维时间序列信号变化/事件/异常检测方法。 算法运行环境为MATLAB R2021b,执行一种新的一维时间序列信号变化/事件/异常检测,并给出了若干例子。 压缩包=程序+数据+参考。 load data_1.mat % load data fs = 44100; % sampling frequency x = x/max(abs(x)); % normalize the signal N = length(x); % signal length t = (0:N-1)/fs; % time vector
加载数据后顺手做个归一化,这是常规操作:
load data_1.mat x = x/max(abs(x)); % 音量拉满到[-1,1],防止后续处理被幅值影响 t = (0:length(x)-1)/44100; % 44.1kHz采样率对应音频场景核心思路是把时域信号转成时频图,再用图像边缘检测那套来找异常。来看这个骚操作:
% 时频变换 [~,F,T,P] = spectrogram(x, 256, 250, 256, 44100); P_db = 10*log10(abs(P)); % 转分贝尺度更符合听觉特性 % 当图像处理 edge_map = edge(P_db, 'canny', [0.1 0.5], 1.5); % 用Canny算子找边缘这里有个细节——spectrogram的overlap设到250(256点窗长),相当于97%的重叠率。虽然计算量上去了,但时域分辨率大幅提升,对小尺度事件更敏感。Canny算子的双阈值设置也是门道,低阈值设0.1避免漏检,高阈值0.5防误报,sigma=1.5让高斯平滑适度保留细节。
接着用形态学处理去噪:
se = strel('disk',2); clean_map = imopen(edge_map, se); % 开运算去除孤立噪点这个disk结构元素选2像素半径,既能抹掉细碎杂讯,又不至于把真实事件的边缘抹平。试过用矩形元素,但在斜向边缘保持上不如disk自然。
最后做个自适应阈值分割:
[~, event_regions] = adaptiveThreshold(clean_map, 50, 0.2); % 自定义函数这个adaptiveThreshold的实现挺有意思,核心是分块统计局部能量:
function [threshold, mask] = adaptiveThreshold(map, block_size, sensitivity) [rows, cols] = size(map); mask = false(size(map)); % 分块处理 for i = 1:block_size:rows for j = 1:block_size:cols row_range = i:min(i+block_size-1, rows); col_range = j:min(j+block_size-1, cols); block = map(row_range, col_range); local_thresh = mean(block(:)) + sensitivity*std(block(:)); mask(row_range, col_range) = block > local_thresh; end end threshold = mask; end分块尺寸50×50在时频图上约对应350ms的时间窗,sensitivity参数控制灵敏度。比起全局阈值,这种动态调整能更好应对信号中的能量波动。
MATLAB环境下一种新的一维时间序列信号变化/事件/异常检测方法。 算法运行环境为MATLAB R2021b,执行一种新的一维时间序列信号变化/事件/异常检测,并给出了若干例子。 压缩包=程序+数据+参考。 load data_1.mat % load data fs = 44100; % sampling frequency x = x/max(abs(x)); % normalize the signal N = length(x); % signal length t = (0:N-1)/fs; % time vector
实际效果看data1的结果图(假装有图),正常段的平稳振荡和异常段的突变在时频边缘图上对比明显。测试过瞬态脉冲(如data2中的爆破音)、渐变式变化(data_3中的缓慢频移),方法都能稳定捕捉。
有个坑要注意:处理长信号时内存容易爆。试过10分钟音频(约2.6亿采样点),直接处理会OOM。这时候需要分段处理,每段加汉宁窗重叠10%来避免边缘效应。
总的来说,这套方法胜在物理意义明确——把信号异常转化为时频图的"视觉"特征来处理。调参也比深度学习友好得多,适合快速原型验证。完整代码包里还带了三个典型场景的数据,改改参数就能看到不同效果,比看论文公式直观多了。
