
MATLAB R2021b中的新一维时间序列信号变化/事件/异常检测方法
最近在捣鼓信号异常检测的时候,发现有个挺有意思的方法。不需要复杂的深度学习框架,直接在M
ATLAB里用传统信号处理+图像处理思路就能搞定。咱们先看个实际案例:
加载数据后顺手做个归一化,这是常规操作:
```matlab
load data_1.mat
x = x/max(abs(x)); % 音量拉满到[-1,1],防止后续处理被幅值影响
t = (0:length(x)-1)/44100; % 44.1kHz采样率对应音频场景
```
核心思路是把时域信号转成时频图,再用图像边缘检测那套来找异常。来看这个骚操作:
```matlab
% 时频变换
[~,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让高斯平滑适度保留细节。
接着用形态学处理去噪:
```matlab
se = strel('disk',2);
clean_map = imopen(edge_map, se); % 开运算去除孤立噪点
```
这个disk结构元素选2像素半径,既能抹掉细碎杂讯,又不至于把真实事件的边缘抹平。试过用矩形
元素,但在斜向边缘保持上不如disk自然。
最后做个自适应阈值分割:
```matlab
[~, event_regions] = adaptiveThreshold(clean_map, 50, 0.2); % 自定义函数