前言
小波变换专业处理时变信号!其重要用途包含:突变点检测、时频分析、信号降噪等。本文将详细介绍小波变换的这3种主要用途,借助具体例子来说明并总结相关函数的使用。
间断点检测
现实信号中的间断点是较为常见的,明显的间断点就是信号的"突跳",反应在数学上就是该点"一阶不可导"!如何突跳很明显,我们可以肉眼识别并剔除;但是如果数据本身幅值变化就很大,那么很多小的时域的间断点凭人眼是很难发现和剔除的!此时我们可以使用小波变换,把原始分解到"小波域"去查看!间断点例子如图1所示:
存在3个间断点的原始信号.png
其生成函数为:
x = zeros(1,500);
% 待检测数据
for t = 1:500
if (t<200)
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*t);
elseif (t>=200) & (t<300)
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*200) + 30;
elseif (t>=300) & (t<400)
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*200) + 10;
else
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*200) + 10 + 250*sin(2*pi*0.003*t);
end
end
figure(1)
plot(x); title('原始信号'); grid on;
xlabel('采样点'); ylabel('振幅');
说明:间断点的检查对于原始信号总体上本应是有规律、连续、平滑变化的!但是由于偶然且剧烈的仪器或外界的干扰,导致在某采样点发生了"突跳"!图1中间断点1和2就是这种情况。另外,如果突跳还经常发现在两个频率信号的交界处,图1中的间断点3就是这种情况。
下面我们就用简单的小波分解来检测间断点:一维haar小波1级分解
x = zeros(1,500);
% 待检测数据
for t = 1:500
if (t<200)
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*t);
elseif (t>=200) & (t<300)
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*200) + 30;
elseif (t>=300) & (t<400)
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*200) + 10;
else
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*200) + 10 + 250*sin(2*pi*0.003*t);
end
end
% 一级分解: haar
[cA1,cD1] = dwt(x,'haar');
A1 = upcoef('a',cA1,'haar',1);
D1 = upcoef('d',cD1,'haar',1);
figure(1);
subplot(1,3,1); plot(x); title('原始信号'); grid on;
xlabel('采样点'); ylabel('振幅');
subplot(1,3,2); plot(A1); title('时域: 原始信号低频近似部分(点数一样)'); grid on;
xlabel('小波域: x和y轴无量纲');
subplot(1,3,3); plot(D1); title('时域: 原始信号高频细节部分(点数一样)'); grid on;
xlabel('小波域: x和y轴无量纲');
效果:
图2:一维haar小1级分解间断点检测结果
说明:可以看到只做了1级的小波分解,其"高频细节"部分"系数图像"就可以很好的辨识出原始信号的间断点!这里需要注意的是:我们辨识间断点看的就是无量纲的、小波域的系数图像!而不需要做系数重构回到时间域。
总结1:小波域的高频细节的系数图像,专门用来检查原始信号间断点。
下面我们再使用db4小波基做多级(3级)分解看看:
x = zeros(1,500);
% 待检测数据
for t = 1:500
if (t<200)
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*t);
elseif (t>=200) & (t<300)
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*200) + 30;
elseif (t>=300) & (t<400)
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*200) + 10;
else
x(t) = 50.*exp(t/300).*sin(2*pi*0.01*200) + 10 + 250*sin(2*pi*0.003*t);
end
end
% 多级(3级)分解: db4
[C,L] = wavedec(x,3,'db4');
A3=wrcoef('a',C,L,'db4',3); % 低
D3=wrcoef('d',C,L,'db4',3);
D2=wrcoef('d',C,L,'db4'