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

加载数据后顺手做个归一化,这是常规操作:
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); % 自定义函数
这个adaptiveThreshold的实现挺有意思,核心是分块统计局部能量:
matlab
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%来避免边缘效应。
总的来说,这套方法胜在物理意义明确------把信号异常转化为时频图的"视觉"特征来处理。调参也比深度学习友好得多,适合快速原型验证。完整代码包里还带了三个典型场景的数据,改改参数就能看到不同效果,比看论文公式直观多了。