数字信号处理--基于MATLAB的小波去噪算法--小波变换在信号降噪和压缩中的应用

小波分析的重要应用之一就是用于信号消噪,首先简要地说明一下小波变换实现信号消噪的基本原理。

一、基本原理

含噪的一维信号模型可以表示如下

式中s(k)为含噪信号,f(k)为有用信号,e(k)为噪声信号。这里假设e(k)是一个高斯白噪声,通常表现为高频信号,而实际工程中f(k)通常为低频信号或者是一些比较平稳的信号

因此我们可按如下方法进行消噪处理:

首先对信号进行小波分解,由于噪声信号多包含在具有较高频率的细节中,从而可以利用门限阈值等形式对分解所得的小波系数进行处理,然后对信号进行小波重构即可达到对信号消噪的目的。

信号消噪实质上是抑制信号中的无用部分,增强信号中有用部分的过程。

一般地,一维信号消噪的过程可分为如下3个步骤。

步骤1:一维信号的小波分解选择一个小波确定分解的层次,然后进行分解计算。

步骤2:小波分解高频系数的阈值量化。对各个分解尺度下的高频系数选择一个阈值进行软阈值量化处理。

步骤3:一维小波重构。根据小波分解的最底层低频系数和各层高频系数进行一维小波重构。

这3个步骤中,最关键的是如何选择阈值以及进行阈值量化。在某种程度上,它关系到信号消噪的质量。

二、噪声在小波分解下的特性

总体上,对于一维离散信号来说,其高频部分所影响的是小波分解的第一层细节,其低频部分所影响的是小波分解的最深层和低频层。如果对一个仅由白噪声所组成的信号进行分析,则可得出这样的结论:高频系数的幅值随着分解层次的增加而迅速地衰减且其方差也有同样的变化趋势

用C(j,k)表示噪声经过小波分解后的系数,其中j表示尺度,k表示时间

下面将噪声看做普通信号,分析它的相关性、频谱和频率分布这3个主要特征。

(1)如果所分析的信号s是一个平稳的、零均值的白噪声,那么它的小波分解系数是相互独立的。

(2)如果信号s是个高斯型噪声,那么其小波分解系数是互不相关的,且服从高斯分布

(3)如果信号s是一个平稳、有色、零均值的高斯型噪声序列,那么它的小波分解系数也是高斯序列,并且对每一个分解尺度j,其相应的系数也是一个平稳、有色的序列。如何选择对分解系数具有相关性的小波是一个很困难的问题,在目前也没有得到很好的解决。进一步需要指出的是,即使存在这样的一个小波,但它对噪声的解相关性还取决于噪声的有色性。为了利用小波计算噪声的解相关性,必须事先知道噪声本身的特性

(4)如果信号s是一个固定的、零均值ARMA模型,那么对每一个小波分解尺度j,C(j,k)(k∈z)也是固定的、零均值ARMA模型,且其特性取决于尺度j。

(5)如果信号s是一个一般的噪声

①若它的相关函数已知,则可计算系数序列C(j,k)和C(j,k’);

②若它的相关函数谱已知,则可计算C(j,k)(k∈z)的谱及尺度j和j’的交叉谱。

三、应用一维小波分析进行信号消噪处理

小波分析工具箱中用于信号消噪的一维小波函数是wden.m的wdencmp.m。

小波分析进行消噪处理一般有下述3种方法。

(1)默认阈值消噪处理。该方法利用函数ddencmp生成信号的默认阈值,然后利用函数wdencmp进行消噪处理。

(2)给定阈值消噪处理。在实际的消噪处理过程中,阈值往往可通过经验公式获得,且这种阈值比默认阈值的可信度高。在进行阈值量化处理时可利用函数wthresh。

(3)强制消噪处理。该方法是将小波分解结构中的高频系数全部置为0,即滤掉所有高频部分,然后对信号进行小波重构。这种方法比较简单,且消噪后的信号比较平滑,但是容易丢失信号中的有用成分

[例1]利用小波分析对含噪正弦波进行消噪。

%% 利用小波分析对含噪正弦波进行降噪
clc;clear;
% 1、生成正弦信号
N=1000;
t=1:N;
x=sin(0.03*t);
% 2、加噪声
load noissin;% 这是一个含噪正弦波
ns=noissin;
% 3、显示波形
subplot(3,1,1);
title('含噪正弦波消噪结果');
plot(t,x);
xlabel('样本序号 n');
ylabel('(原始信号)幅值 A');
subplot(3,1,2);
plot(ns);
xlabel('样本序号n');
ylabel('(含噪信号)幅值A');
% 4、小波消噪
xd=wden(ns,'minimaxi','s','one',5,'db3');
% Wden函数:一维信号的小波消噪处理
% [xd,cxd,lxd]=wden(x,tptr,sorh,scal,n,‘wname’);返回经过小波消噪处理后的信号xd及其小波分解结构。
% 1、x = ns为含噪信号
% 2、tptr = rigrsure:stein无偏估计; heursure:启发式阈值; sqtwolog:固定式阈值; minimaxi:极大极小值阈值
% 3、sorh = s:为软阈值; h: 为硬阈值;
% 4、输入参数scal规定了阈值处理随噪声水平的变化:
%   Scal=one:不随噪声水平变化。
%    Scal=sln:根据第一层小波分解的噪声水平估计进行调整。
%   Scal=mln:根据每一层小波分解的噪声水平估计进行调整。
% 5、N 是小波变换的级别。
% 6、WNAME 是指定为字符串的小波。

subplot(3,1,3);
plot(xd);
xlabel('样本序号n');
ylabel('(消噪信号)幅值A'); 

数字信号处理--基于MATLAB的小波去噪算法--小波变换在信号降噪和压缩中的应用_第1张图片

从上图可以看出:消噪后的信号大体上恢复了原始信号的形状,并明显地除去了噪声所引起的干扰。但是,恢复后的信号和原始信号相比,有明显的改变。这主要是因为在进行消噪处理的过程中所用的分析小波细节系数阙值不恰当所致。

下面我们再通过一个例程对此进行说明。

[例2]在电网电压值监测过程中,由于监测设备出现了一点故障,致使所采集到的信号受到噪声的污染。现在利用小波分析对污染信号进行消噪处理以恢复原始信号。

%% 分别使用3中阈值来消噪,并分析其适用场合:默认阈值消噪、给定阈值消噪、强制消噪
% 零、信号加载与处理(分解、系数提取、重构)
% 1、装载采集的信号leleccum.mat
load leleccum;
% 将信号中第2000到第3450个采样点赋给s
indx=2000:3450;
s=leleccum(indx);
% 2、画出原始信号
subplot(2,2,1);
plot(s);
title('原始含噪信号');
xlabel('样本序号n');
ylabel('幅值A');

% 3、对原始信号进行分解
% 用db1小波对原始信号进行3层分解并提取系数
[c,l]=wavedec(s,3,'db1');   %这里c的长度为1453,比s(1451)多,l的长度为5

% function [c,l] = wavedec(x,n,IN3,IN4):多层一维小波分解。
% WAVEDEC 使用一个特定的小波“wname”或一组特定的小波分解滤波器进行多层一维小波分析。
% [C,L] = WAVEDEC(X,N,'wname') 使用'wname'返回信号X在N级的小波分解。
% 输出分解结构包含小波 the wavelet decomposition vector C和 the bookkeeping vector L
% N 必须是一个严格的正整数。

% 4、对[c,l]提取近似系数
a3=appcoef(c,l,'db1',3);
% APPCOEF: 提取一维小波变换近似系数。
% A = APPCOEF(C,L,'wname',N) 使用小波分解结构计算N级的近似系数[C,L]
% Level N must be an integer such that 0 <= N <= length(L)-2. 
% A = APPCOEF(C,L,'wname') extracts(提取) the approximation coefficients(近似系数) at the last level length(L)-2.

% 5、对[c,l]提取细节系数
% 5.1、提取3级细节系数
d3=detcoef(c,l,3);
%  DETCOEF提取一维细节系数。
%  D = DETCOEF(C,L,N)从小波分解结构[C,L]中提取出N级的细节系数(the detail coefficients)。
%  Level N must be an integer such that 1 <= N <= NMAX where NMAX = length(L)-2.
%  D = DETCOEF(C,L)提取最后一级NMAX的细节系数。
%  If N is a vector of integers such that 1 <= N(j) <= NMAX:

% 5.2、提取2级细节系数
d2=detcoef(c,l,2);
% 5.3、提取1级细节系数
d1=detcoef(c,l,1);

% 一、强制消噪
%对信号进行强制性消噪处理并图示结果
dd3=zeros(1,length(d3)); % length(d3) = 182,这句话执行完,生成了182个0
dd2=zeros(1,length(d2)); % length(d2) = 363
dd1=zeros(1,length(dl)); % length(dl) = 726
% 将近似系数a3与其他细节系数(均为0)合并, length(a3) = 182, length(cl) = length(c) = 1453
c1=[a3 dd3 dd2 dd1]; % 由于dd3 dd2 dd1 均为0,那么c1有用信息仅来自使用db1进行的3级分解的近似系数a3
s1=waverec(c1,l,'db1');% 用c1来重构c,命名为s1(重构后的信号s1,与原信号c对应)

% WAVEREC:多层一维小波重建。与WAVEDEC相对应
% WAVEREC使用特定的小波('wname',参见WFILTERS)或特定的重建滤波器(Lo_R和Hi_R)来执行多层一维小波重构。
% X = WAVEREC(C,L,'wname')根据多级小波分解结构对信号X进行重构

subplot(2,2,2);
plot(s1);
title('强制消噪后的信号');
xlabel('样本序号n');
ylabel('幅值A');


% 二、用默认阈值对信号进行消噪处理并图示结果
% 1、用ddencmp函数获得信号的默认阈值
[thr,sorh,keepapp]=ddencmp('den','wv',s); 
%使用ddencmp函数的去噪功能对原始信号s进行小波分解,并得到阈值thr,阈值方式,是否允许近似保持系数

%  DDENCMP:去噪或压缩的默认值
%  [THR,SORH,KEEPAPP,CRIT] = DDENCMP(IN1,IN2,X):返回输入向量或矩阵X的默认去噪或压缩值,使用小波或小波包,可以是一维或二维信号。其中:
%  THR是阈值,SORH是函数(自动)选择的阈值方式:软阈值(SORH = s)或硬阈值(SORH = h),KEEPAPP允许保持近似系数(0、1),CRIT(仅用于小波包)是熵名(参见WENTROPY)。
%  IN1是den(去噪)或者cmp(压缩)
%  IN2是wv(小波分解)或者wp(小波包分解)。
 
s2=wdencmp('gbl',c,l,'db1',3,thr,sorh,keepapp);%利用ddencmp得到的阈值、阈值方式、近似保持系数对小波分解后的信号c进行去噪

% WDENCMP使用小波对信号或图像进行去噪或压缩处理。
% [XC,CXC,LXC,PERF0,PERFL2] = WDENCMP('gbl',X,'wname',N,THR,SORH,KEEPAPP)返回输入信号X 的去噪或压缩版本的XC,使用全局正阈值THR进行小波系数阈值化。
%  附加输出参数[CXC,LXC]是XC的小波分解结构,
% PERFL2和PERF0是以百分比表示的L^2恢复和压缩分数。
% PERFL2 = 100*(CXC的向量范数/ C的向量范数)^2其中[C,L]为X的小波分解结构。
% 小波分解在第N层执行,'wname'是一个包含小波名称的字符串。
% SORH ('s'或'h')用于软阈值或硬阈值(有关详细信息,请参阅WTHRESH)。
% 如果KEEPAPP = 1,逼近系数不能设置阈值,否则是可能的。


subplot(2,2,3);
plot(s2);
title('默认阈值消噪后的信号');
xlabel('样本序号n');
ylabel('幅值A');


% 三、用给定的软阈值进行消噪处理 
softd1=wthresh(d1,'s',1.465);% 对d1进行软阈值
% WTHRESH执行软或硬阈值。
% Y = WTHRESH(X,SORH,T)返回输入向量或矩阵X的软(如果SORH = 's')或硬(如果SORH = 'h') 阈值。T是阈值。
% Y = WTHRESH(X,'s',T) returns Y = SIGN(X).(|X|-T)+, soft  thresholding is shrinkage.
% Y = WTHRESH(X,'h',T) returns Y = X.1_(|X|>T), hard  thresholding is cruder.
softd2=wthresh(d2,'s',1.823); % 对d2进行软阈值
softd3=wthresh(d3,'s',2.768);% 对d3进行软阈值

% softdl softd2 softd3为执行阈值处理后的细节系数
c2=[a3 softd3 softd2 softd1];% 将近似系数与(经过阈值处理后的)细节系数合并
s3=waverec(c2,l,'db1'); % 使用c2和级数l来重构s3
subplot(2,2,4);
plot(s3);
title('给定软阈值消噪后的信号');
xlabel('样本序号n');
ylabel('幅值A');

 数字信号处理--基于MATLAB的小波去噪算法--小波变换在信号降噪和压缩中的应用_第2张图片

在本例程中,分别利用前面所提到的了3种消噪方法进行处理。

图得到的结果来看应用强制消噪处理后的信号较为光滑,但是它很有可能丢了信号中的一些有用成分默认阈值消噪的效果较好,保留了有用信号的高频成分,同时对微小扰动去噪效果明显;给定软阈值消噪需要有一定的经验或者需要多次试验也可作为备选。

四、消噪阈值选取规则

在Matlab的小波工具箱中,设置软或硬阈值的函数为wthresh.m。

该函数根据参数sorh的值计算分解系数的软阈值或硬阈值。其中,硬阀值对应于最简单的处理方法,而软阙值具有很好的数学特性,并且所得到的理论结果是可用的。

[例3]生成不同阀值下的信号。

% 生成线性信号
y=linspace(-1,1,100);
% 设置T阈值
thr=0.4;
% 计算软、硬阈值
ythard=wthresh(y,'h',thr);	% 对信号y进行硬阈值,阈值设为thr
ytsoft=wthresh(y,'s',thr);  % 对信号y进行软阈值,阈值设为thr
% 显示不同阈值后的信号
subplot(1,3,1);
plot(y);
title('原始信号');
xlabel('样本序号n');
ylabel('幅值A');
subplot(1,3,2);
plot(ythard);
title('硬阈值信号');
xlabel('样本序号n');
ylabel('幅值A');
subplot(1,3,3);
plot(ytsoft);
title('软阈值信号');
xlabel('样本序号n');
ylabel('幅值A');

数字信号处理--基于MATLAB的小波去噪算法--小波变换在信号降噪和压缩中的应用_第3张图片

根据基本的噪声模型,阈值的选取有以下4个规则,其中每一条规则对应于函数thselect中输入参数 tptr的一个选项。

(1)选项tptr='rigrsure',是一种基于Stein无偏似然估计原理的自适应阙值选择。给定一个阈值t,得到它的似然估计,再将非似然最小化,就可得到所选的阈值。这是一种软件阈值估计器。

(2)选项 tptr='sqtwolog',是一种固定的值形式,它所产生的阈值为 sprt(2*log(length(X)))。

(3)选项 tptr='heursure',是前两种阈值的综合,所选择的是最优预测变量阈值。如果信噪比很小,而SURE估计有很大的噪声,此时就需要采用这种固定的阈值形式

(4)选项tptr='minimaxi',也是一种固定的阅值选择形式,它所产生的是一个最小均方差的极值,而不是无误差

【例4-6】计算高斯白噪声信号N(0,1)在上述4条规则下的阈值。

%产生白噪声
y=randn(1,1000);
%生成不同的阙值
thr1=thselect(y,'rigrsure');
thr2=thselect(y,'sqtwolog');
thr3=thselect(y,'heursure');
thr4=thselect(y,'minimaxi');

计算结果为:

数字信号处理--基于MATLAB的小波去噪算法--小波变换在信号降噪和压缩中的应用_第4张图片数字信号处理--基于MATLAB的小波去噪算法--小波变换在信号降噪和压缩中的应用_第5张图片

从计算结果看,rigrsure的结果会随高斯白噪声变化而变化,而其他三种不会变化;

在本例程中,信号y是一个标准的高斯白噪声,所以每一种方法都能粗略地将所有系数剔除。从计算的结果来看,对于Stein的无偏似然估计(SURE)和极大极小(minimaxi)原理的阈值选择规则,仅保存了约3%的系数;而其两种阈值选择规则,将所有的系数都变成了零。

同样地,对噪声进行小波分解时,也会产生高频系数,故一个信号的高频系数向量是有用信号和噪声信号的高频系数的叠加。由于SURE和minimaxi值选取规则较为保守(仅将部分系数置为零),因此在信号的高频信息有很少一部分在噪声范围内时,这两种值非常有用,可以将弱小的信号提取出来。其他两种阈值选取规则, 在去除噪声时更为有效,但是也可能将有用信号的高频部分当作噪声信号去除掉

在实际的工程应用中,大多数信号可能包含着许多尖峰或突变,而且噪声信号也并不是平稳的白声。对这种信号进行消噪处理时,传统的傅里叶变换完全是在频域中对信号进行分析,它不能给出信号在某个时间点上的变化情况,因此分辨不出信号在时间轴上的任何一个突变。但是小波分析能同时在时频域内对信号进行分析,所以它能有效地区分信号中的突变部分和声,从而实现对非平稳信号的消噪。

下面通过一个实例,考察小波分析对非平稳信号的消噪。

【例4-7】利用小波分析对一个含噪的矩形波信号

%% 利用小波分析对一个含噪的矩形波信号进行消噪处理
% 设置信噪比和随机种子值
snr=4;	
init=2055615866;
% 产生原始信号sref和被高斯白噪卢污染的信号s
[sref,s]=wnoise(1,11,snr,init);

% 用sym8小波对信号s进行3层分解并对细节系数
% 选用sure阈值模式和尺度噪声
xd=wden(s,'heursure','s','one',3,'sym8');%对信号s进行启发式阈值,阈值类型为软阈值,输入参数scal为one,用sym8小波进行3级分解
% Wden函数:一维信号的小波消噪处理
% [xd,cxd,lxd]=wden(x,tptr,sorh,scal,n,‘wname’);返回经过小波消噪处理后的信号xd及其小波分解结构。
% 1、x = ns为含噪信号
% 2、tptr = rigrsure:stein无偏估计; heursure:启发式阈值; sqtwolog:固定式阈值; minimaxi:极大极小值阈值
% 3、sorh = s:为软阈值; h: 为硬阈值;
% 4、输入参数scal规定了阈值处理随噪声水平的变化:
%   Scal=one:不随噪声水平变化。
%   Scal=sln:根据第一层小波分解的噪声水平估计进行调整。
%   Scal=mln:根据每一层小波分解的噪声水平估计进行调整。
% 5、N 是小波变换的级别。
% 6、WNAME 是指定为字符串的小波。

%计算信噪比
Ps=sum(sum((sref-mean(mean(sref))).^2));%纯信号功率
Pn1=sum(sum((sref-s).^2));           %含噪信号功率
snr1=10*log10(Ps/Pn1);%未去噪信号的信噪比
Pn2=sum(sum((sref-xd).^2));           %去噪信号功率
snr2=10*log10(Ps/Pn2);%去噪信号的信噪比


% 显示信号波形和信噪比
subplot(3,1,1);
plot(sref);
xlabel('样本序号n');
ylabel('幅值A');
title('原始不含噪信号sref');
subplot(3,1,2);
plot(s);
title(['含噪信号s 信噪比:',num2str(snr1)]);
subplot(3,1,3);
plot(xd);
title(['小波消噪后的信号xd 信噪比:',num2str(snr2)]);	
xlabel('样本序号n');
ylabel('幅值A');

数字信号处理--基于MATLAB的小波去噪算法--小波变换在信号降噪和压缩中的应用_第6张图片

你可能感兴趣的:(Matlab,matlab,数字信号处理)