主要内容

小波区间相关去噪

这个例子展示了如何使用区间相关的阈值去噪信号。

小波图形用户界面工具通过允许我们微调去噪信号所需的参数,提供了一个精确的去噪过程。然后,我们可以保存去噪后的信号、小波分解和所有去噪参数。

使用相同的去噪设置处理多个信号可能很乏味,有时甚至不可能。批处理模式,使用命令行,可以更有效。这个例子展示了如何在命令行中简化和解决这个问题。

在这个例子中,我们执行了六次试验来去噪电信号nelec使用这些程序:

  1. 使用一个最小阈值区间:4.5

  2. 使用一个最大阈值区间:19.5

  3. 手动选择三个间隔和三个阈值,并使用wthresh函数来阈值系数。

  4. 使用utthrset_cmd函数自动查找间隔和阈值。

  5. 使用cmddenoise函数自动执行所有进程。

  6. 使用cmddenoise带有附加参数的函数。

使用单一区间去噪

负载用电信号nelec

负载nelec.matSig = nelec;

现在我们用离散小波分析5级sym4小波。我们将阈值类型设置为“年代”(软)。

wname =“sym4”;Level = 5;sorh =“年代”

使用函数去噪信号wdencmp将阈值设置为4.5,这是GUI工具提供的最小值。

THR = 4.5;[sigden_1,~,~,perf0,perfl2] = wdencmp(gbl(的、团体、wname水平,用力推,sorh, 1);Res = sign -sigden_1;次要情节(1,1)情节(团体,“r”)轴标题(原始信号的) subplot(3,1,2) plot(sigden_1,“b”)轴标题(的去噪信号) subplot(3,1,3) plot(res,“k”)轴标题(“残留”

图中包含3个轴对象。标题为Original Signal的Axes对象1包含一个类型为line的对象。标题为降噪信号的Axes对象2包含一个类型为line的对象。标题为Residual的Axes对象3包含一个类型为line的对象。

perf0, perfl2
Perf0 = 66.6995
Perfl2 = 99.9756

得到的结果不太好。去噪在信号的开始和结束是非常有效的,但在100和1100之间,噪声没有被去除。注意perf0值给出设置为0的系数的百分比perfl2Value表示保存能量的百分比。

现在,我们用GUI工具提供的阈值最大值去噪信号,19.5

THR = 19.5;[sigden2,cxd,lxd,perf0,perfl2] = wdencmp(gbl(的、团体、wname水平,用力推,sorh, 1);Res = sign -sigden_2;次要情节(1,1)情节(团体,“r”)轴标题(原始信号的) subplot(3,1,2) plot(sigden_2,“b”)轴标题(的去噪信号) subplot(3,1,3) plot(res,“k”)轴标题(“残留”

图中包含3个轴对象。标题为Original Signal的Axes对象1包含一个类型为line的对象。标题为降噪信号的Axes对象2包含一个类型为line的对象。标题为Residual的Axes对象3包含一个类型为line的对象。

perf0, perfl2
Perf0 = 94.7860
Perfl2 = 99.9564

去噪后的信号非常平滑。这看起来很好,但是如果我们看1100位置后的残差,我们可以看到底层噪声的方差不是恒定的。信号的一些成分可能留在残差中,例如,在1300位附近和1900位和2000位之间。

利用区间相关阈值(IDT)去噪

现在我们将使用区间相关的阈值,就像在去噪GUI工具中一样。

对信号进行离散小波分析。

[coefs,long] = wavedec(sig,level,wname);

使用GUI工具对信号执行区间相关的阈值nelec,并将间隔数设置为3,我们得到的内容denPAR变量,可以解释为:

  • I1 = [1 94]有一个阈值Thr1 = 5.9

  • I2 = [94 1110]有一个阈值Thr2 = 19.5

  • I3 = [1110 2000]有一个阈值Thr3 = 4.5

定义依赖于区间的阈值。

denPAR = {[1 94 5.9;94 1110 19.5;1110 2000 4.5]};thrParams = cell(1,level);thrParams(:) = denPAR;

显示信号的小波系数和区间依赖阈值为每个水平的离散分析。

复制系数Cfs_beg = wrepcoef(coefs,long);显示分解的系数图subplot(6,1,1) plot(sig,“r”)轴标题(原始信号和细节系数从1到5) ylabel (“年代”“旋转”, 0)K = 1:level subplot(6,1, K +1) plot(cfs_beg(K,:),“颜色”,[0.5 0.8 0.5]) ylabel([' D 'int2str (k)),“旋转”, 0)轴持有Maxi = max(abs(cfs_beg(k,:)));持有par = thrParams{k};plotPar = {“颜色”“米”“线型”“-”。};j = 1:尺寸(par, 1) 1块(((j, 2), par (j, 2)]、[马克西马克西],plotPar {:})结束j = 1:尺寸(par, 1)情节((par (j, 1),票面(j, 2)]、[par (j, 3)票面(j, 3)], plotPar{:})图((par (j, 1),票面(j, 2)), - - - - - - (par (j, 3)票面(j, 3)], plotPar {:})结束ylim((马克西马克西* 1.05 * 1.05))%推迟结束次要情节(6 1级+ 1)包含(“时间还是空间”

图中包含6个轴对象。标题为原始信号和细节系数从1到5的坐标轴对象1包含一个类型为line的对象。Axes对象2包含9个line类型的对象。Axes对象3包含9个line类型的对象。Axes对象4包含9个line类型的对象。Axes对象5包含9个line类型的对象。Axes对象6包含9个line类型的对象。

对于每个级别k,变量thrParams {k}包含去噪过程的间隔和相应的阈值。

阈值的小波系数逐级,和区间的间隔,使用的值包含在thrParams变量。

使用函数wthresh时,我们对水平线之间的小波系数值进行阈值处理,将它们替换为零,而其他值则降低Sorh = 's'或保持不变,如果Sorh = 'h'

第一个=累计(长)+1;First = First (end-2:-1:1);TMP = long (end-1:-1:2);Last = first+tmp-1;k = 1:level thr_par = thrParams{k};如果~isempty(thr_par) CFS = coefs(第一个(k):最后一个(k));nbCFS = long (end-k);NB_int = size(thr_par,1);X = [thr_par(:,1);thr_par (NB_int, 2)];alf = (nbCFS-1)/(x(end)-x(1));Bet = 1 - alf*x(1);X = round(alf* X +bet);X (X <1) = 1;x(x>nbCFS) = nbCFS; thr = thr_par(:,3);j = 1:NB_int如果J = 1 d_beg = 0;其他的D_beg = 1;结束J_beg = x(j)+ d_beg;J_end = x(j+1);J_ind = (j_beg:j_end);Cfs (j_ind) = wthresh(Cfs (j_ind),sorh,thr(j));结束Coefs (first(k):last(k)) = cfs;结束结束

显示信号的阈值小波系数。

复制系数。Cfs_beg = wrepcoef(coefs,long);显示分解系数。图subplot(6,1,1) plot(sig,“r”)轴标题(原始信号和细节系数从1到5) ylabel (“年代”“旋转”, 0)K = 1:level subplot(6,1, K +1) plot(cfs_beg(K,:),“颜色”,[0.5 0.8 0.5]) ylabel([' D 'int2str (k)),“旋转”, 0)轴持有Maxi = max(abs(cfs_beg(k,:)));%抓住par = thrParams{k};plotPar = {“颜色”“米”“线型”“-”。};j = 1:尺寸(par, 1) 1块(((j, 2), par (j, 2)]、[马克西马克西],plotPar {:})结束j = 1:尺寸(par, 1)情节((par (j, 1),票面(j, 2)]、[par (j, 3)票面(j, 3)], plotPar{:})图((par (j, 1),票面(j, 2)), - - - - - - (par (j, 3)票面(j, 3)], plotPar {:})结束Ylim ([-maxi*1.05 maxi*1.05])持有结束次要情节(6 1级+ 1)包含(“时间还是空间”

图中包含6个轴对象。标题为原始信号和细节系数从1到5的坐标轴对象1包含一个类型为line的对象。Axes对象2包含9个line类型的对象。Axes对象3包含9个line类型的对象。Axes对象4包含9个line类型的对象。Axes对象5包含9个line类型的对象。Axes对象6包含9个line类型的对象。

重建去噪后的信号。

Sigden = waverec(coefs,long,wname);Res = sig - sigden;

显示原始信号、去噪信号和残余信号。

图subplot(3,1,1) plot(sig,“r”)举行情节(sigden“b”)轴标题(“原始信号和去噪信号”) subplot(3,1,2) plot(signed,“b”)轴标题(的去噪信号) subplot(3,1,3) plot(res,“k”)轴标题(“残留”

图中包含3个轴对象。标题为原始信号和去噪信号的Axes对象1包含2个类型为line的对象。标题为降噪信号的Axes对象2包含一个类型为line的对象。标题为Residual的Axes对象3包含一个类型为line的对象。

比较信号的三个去噪版本。

图绘制(sigden_1,‘g’)举行情节(sigden_2“r”)情节(sigden“k”)轴持有传奇(“去噪点”运用马克思的“去噪IDT”“位置”“北”

图中包含一个轴对象。axis对象包含3个line类型的对象。这些对象代表去噪的最小值,去噪的最大值,去噪的IDT。

看看信号的前半部分,很明显,使用阈值的最小值去噪是不好的。现在,我们放大信号的末端以了解更多细节。

Xlim ([1200 2000]) ylim([180 350])

图中包含一个轴对象。axis对象包含3个line类型的对象。这些对象代表去噪的最小值,去噪的最大值,去噪的IDT。

我们可以看到,当使用最大阈值时,去噪后的信号被过度平滑,信息丢失。

最好的结果是使用基于区间相关阈值方法的阈值,正如我们现在将要展示的那样。

区间相关阈值的自动计算

我们可以使用该函数,而不是手动为每个级别设置间隔和阈值utthrset_cmd自动计算每个间隔的间隔和阈值。然后,我们通过应用阈值、重构和显示信号来完成整个过程。

小波分析。[coefs,long] = wavedec(sig,level,wname);Siz =大小(coefs);thrParams = utthrset_cmd(coefs,long);第一个=累计(长)+1;First = First (end-2:-1:1);TMP = long (end-1:-1:2);Last = first+tmp-1;k = 1:level thr_par = thrParams{k};如果~isempty(thr_par) CFS = coefs(第一个(k):最后一个(k));nbCFS = long (end-k);NB_int = size(thr_par,1);X = [thr_par(:,1);thr_par (NB_int, 2)];alf = (nbCFS-1)/(x(end)-x(1));Bet = 1 - alf*x(1);X = round(alf* X +bet);X (X <1) = 1;x(x>nbCFS) = nbCFS; thr = thr_par(:,3);j = 1:NB_int如果J =1 d_beg = 0;其他的D_beg = 1;结束J_beg = x(j)+d_beg;J_end = x(j+1);J_ind = (j_beg:j_end);Cfs (j_ind) = wthresh(Cfs (j_ind),sorh,thr(j));结束Coefs (first(k):last(k)) = cfs;结束结束Sigden = waverec(coefs,long,wname);图subplot(2,1,1) plot(sig,“r”)轴持有情节(sigden“k”)标题(“原始信号和去噪信号”) subplot(2,1,2) plot(signed,“k”)轴持有标题(的去噪信号

图中包含2个轴对象。标题为原始信号和去噪信号的Axes对象1包含2个类型为line的对象。标题为降噪信号的Axes对象2包含一个类型为line的对象。

自动区间相关去噪

在命令行模式下,我们可以使用这个函数cmddenoise基于区间相关去噪方法自动计算去噪后的信号及其系数。该方法只使用这个函数执行去噪的整个过程,其中包括本例中前面描述的所有步骤。

[sigden,~,thrParams] = cmd降噪(sig,wname,level);thrParams {1}% 1级去噪参数。
ans =2×3103.× 0.0010 1.1100 0.0176 1.1100 2.0000 0.0045

自动过程找到两个去噪区间:

  • I1 = [1 1110]有一个阈值Thr1 = 17.6

  • I2 = [1110 2000]有一个阈值Thr2 = 4.5

我们可以显示去噪的结果,结果是好的。

图subplot(2,1,1) plot(sig,“r”)轴持有情节(sigden“k”)标题(“原始信号和去噪信号”)举行次要情节(2,1,2)情节(sigden,“k”)轴标题(的去噪信号

图中包含2个轴对象。标题为原始信号和去噪信号的Axes对象1包含2个类型为line的对象。标题为降噪信号的Axes对象2包含一个类型为line的对象。

高级自动区间依赖去噪

现在,我们来看一个自动去噪的更完整的例子。

我们可以在调用函数时指定输入参数,而不是使用默认值。这里,阈值的类型选择为年代(软)和间隔的数量设置为3。

负载nelec.mat;Sig = nelec;要分析的信号。wname =“sym4”%小波分析。Level = 5;%小波分解级别。sorh =“年代”%阈值类型。nb_Int = 3;%阈值间隔数。[sigden,系数,thrParams、int_DepThr_Cell BestNbOfInt] =...cmddenoise(团体、wname级别、sorh nb_Int);

对于输出参数,为变量thrParams {1}给出从1到5级别的去噪参数。例如,下面是1级的去噪参数。

thrParams {1}
ans =3×3103.× 0.0010 0.0940 0.0059 0.0940 1.1100 0.0195 1.1100 2.0000 0.0045

我们找到了与本例前面设置的值相同的值。它们对应于我们通过固定输入参数中的间隔数为3所做的选择:nb_Int = 3

自动程序表明2作为去噪的最佳间隔数。这个输出值BestNbOfInt = 2与本例的前一步中使用的相同。

BestNbOfInt
BestNbOfInt = 2

的变量int_DepThr_Cell包含从1到6的多个间隔的间隔位置和阈值。

int_DepThr_Cell
int_DepThr_Cell =1×6单元格数组第1至4列{[1 2000 8.3611]}{2x3 double} {3x3 double} {4x3 double}第5至6列{5x3 double} {6x3 double}

最后,我们查看对应于5个区间的位置和阈值的值。

int_DepThr_Cell {5}
ans =5×3103.× 0.0010 0.0940 0.0059 0.0940 0.5420 0.0184 0.5420 0.5640 0.0056 0.5640 1.1100 0.0240 1.1100 2.0000 0.0045

总结

这个例子展示了如何使用命令行模式来实现与GUI工具相同的去噪功能,同时为您提供对特定参数值的更多控制,以获得更好的结果。

另请参阅

||

相关的话题