小波去噪的基本原理及其实现方法(Matlab)
来源:本文内容整理自lxppopo新浪博客和gufengyueban的MATLAB论坛。
小波去噪方法就是一种建立在小波变换多分辨分析基础上的算法,其基本思想是根据噪声与信号在不同频带上的小波分解系数具有不同强度分布的特点,将各频带上的噪声对应的小波系数去除,保留原始信号的小波分解系数,然后对处理后的系数进行小波重构,得到纯净信号。
相比以往的其他去噪方法,小波变换在低信噪比情况下的去噪效果较好,去噪后的信号识别率较高,同时小波去噪方法对时变信号和突变信号的去噪效果尤其明显。
图1 小波去噪基本原理图
利用小波分析对监测采集的信号进行去噪处理,可以恢复原始信号。利用小波分析进行去噪,包括以下3种方法:
默认阈值去噪处理:该方法利用函数ddencmp() 生成信号的默认阈值,然后利用函数wdencmp() 进行去噪处理;
给定阈值去噪处理:在实际的去噪处理过程中,阈值往往可通过经验公式获得,且这种阈值比默认阈值的可信度高。在进行阈值量化处理时可利用函数wthresh();
强制去噪处理:该方法是将小波分解结构中的高频系数全部置0,即滤掉所有高频部分,然后对信号进行小波重构。这种方法比较简单,且去噪后的信号比较平滑,但是容易丢失信号中的有用成分。
3种去噪方法原代码
clear all;
clc;
load default.txt;
%装载采集的信号
x= default;
lx=length(x);
t=[0:1:length(x)-1]';
%% 绘制监测所得信号%%
subplot(2,2,1);
plot(t,x);
title('原始信号');
grid on
set(gcf,'color','w')
set(gca,'fontname','times New Roman')
set(gca,'fontsize',14.0)
%% 用db1小波对原始信号进行3层分解并提取小波系数%%
[c,l]=wavedec(x,3,'db1');
%sym8
ca3=appcoef(c,l,'db1',3);
%低频部分
cd3=detcoef(c,l,3);
%高频部分
cd2=detcoef(c,l,2);
%高频部分
cd1=detcoef(c,l,1);
%高频部分
%% 对信号进行强制去噪处理并图示%%
cdd3=zeros(1,length(cd3));
cdd2=zeros(1,length(cd2));
cdd1=zeros(1,length(cd1));
c1=[ca3,cdd3,cdd2,cdd1];
x1=waverec(c1,1,'db1');
subplot(2,2,2);
plot(x1);
title('强制去噪后信号');
grid on
set(gcf,'color','w')
set(gca,'fontname','times New Roman')
set(gca,'fontsize',14.0)
%% 默认阈值对信号去噪并图示%%
%用ddencmp( )函数获得信号的默认阈值,使用wdencmp( )函数实现去噪过程
[thr,sorh,keepapp]=ddencmp('den','wv',x);
x2=wdencmp('gbl',c,l,'db1',3,thr,sorh,keepapp);
subplot(2,2,3);
plot(x2);
title('默认阈值去噪后信号');
grid on
set(gcf,'color','w')
set(gca,'fontname','times New Roman')
set(gca,'fontsize',14.0)
%% 给定的软阈值进行去噪处理并图示%%
cd1soft=wthresh(cd1,'x',1.465);
%经验给出软阈值数
cd2soft=wthresh(cd2,'x',1.823);
%经验给出软阈值数
cd3soft=wthresh(cd3,'x',2.768);
%经验给出软阈值数
c2=[ca3,cd3soft,cd2soft,cd1soft];
x3=waverec(c2,1,'db1');
subplot(2,2,4);
plot(x3);
title('给定软阈值去噪后信号');
grid on
set(gcf,'color','w')
set(gca,'fontname','times New Roman')
set(gca,'fontsize',14.0)
小波去噪:实例分享
%在马达负载为1,转速为1771,内圈的故障信号
load D:\我的文档\MATLAB\106.mat
%读数据序列
x=X106_DE_time(1:2000);
%将信号1到2000个采样点给x
%x=X106_DE_time; %赋予变量
fs=12000; %采样率
dt=1/fs; %采样间隔时间1/fs
n=length(x); %得到序列的长度
t=[0:n-1]*dt;
y=fft(x); %对信号进行快速FFT变换
figure(1)
subplot(2,2,1),
plot(t,x);
%绘制原始信号序列
xlabel('时间/s'),
title('时间域')
grid on
%subplot(2,2,2),
%plot([0:n-1]/(n*dt),abs(y)*2/n)
%绘制信号的振幅谱
%xlabel('频率/HZ'),title('幅频图')
%ylabel('振幅')
%grid on
%小波去噪1
%将信号用小波函数SYM5分解到第5层,用minimaxi阈值选择对系数进行处理,消除噪声
lev=5;
xd=wden(x,'minimaxi','s','mln',lev,'sym5');
subplot(2,2,2),
plot(t,xd)
xlabel('时间/s'),
title('消噪后的信号')
grid on
程序运行结果如下:
图2 去噪前
图3 去噪后