当前位置:首页 » 《资源分享》 » 正文

Matlab小波去噪——基于wden函数的去噪分析

4 人参与  2024年05月16日 13:30  分类 : 《资源分享》  评论

点击全文阅读


文章目录

一、问题描述二、代码问题1:原始信号加6分贝高斯白噪声问题2:确定合适的小波基函数问题3:确定最合适的阈值计算估计方法问题4:确定合适的分解层数问题5:实际信号去噪问题6:对比 三、演示视频最后


一、问题描述

1.利用MATLAB绘制原始信号,对其加6分贝高斯白噪声;
2.以Minimaxi阈值法,软阈值函数,3层分解层数,分别用dbN和symN小波对加噪信号去噪,获得分解图和去噪后的图,并用信噪比和均方根误差作为评判标准,确定合适的小波基函数;
3.用第2步确定的小波基函数,软阈值函数,分解层数为3层,对无偏估计阈值(RigrSure)、固定式阈值(Sqtwolog)、启发式阈值(HeurSure)和极大极小阈值(Minimaxi)四种分别去噪,获得去噪后的图,并用信噪比和均方根误差作为评判标准,确定最合适的阈值计算估计方法;
4.用第2步确定的小波基函数,第3步确定的阈值计算估计准则,分别用分解层数为1,2,3,4,5,6对加噪信号进行去噪,获得去噪后得到图,并用信噪比和均方根误差作为评判标准;
5.用实际的信号加6分贝噪声对前面确定的小波基函数,阈值计算方法以及分解层数用小波阈值进行去噪,并求信噪比和均方根误差。
6、确定好小波基函数、阈值函数和分解层数后,分别模拟加入不同量的噪声与4阶巴特沃斯低通滤波器滤波对比

二、代码

问题1:原始信号加6分贝高斯白噪声

代码如下(示例):

clearclcclose all%% MATLAB绘制原始信号load('data.mat'); %私聊发数据data=data;%% 加6分贝高斯白噪声SNR=6; %6dBnoise=0.2*randn(size(data))*std(data)/db2mag(SNR);s=data+noise;figure;subplot(211)plot(data);ylabel('P/MPa');title('原始信号')subplot(212)plot(s);ylabel('P/MPa');title('加6dB高斯白噪声')

问题2:确定合适的小波基函数

代码如下(示例):

clearclcclose all%% MATLAB绘制原始信号load('data.mat');data=data;%% 加6分贝高斯白噪声SNR=6; %6dBnoise=0.2*randn(size(data))*std(data)/db2mag(SNR);s=data+noise;%% Minimaxi阈值法,软阈值函数,3层分解层数,db5去噪wname=strvcat('sym4','sym5','db4','db5');for i=1:4    [C,L] = wavedec(s,3,wname(i,:));  %进行3层小波包分解    s1=wden(s,'minimaxi','s','mln',3,wname(i,:)); %Minimaxi、软阈值,3层,db5    figure;    subplot(311)    plot(data);xlabel('t/ms');ylabel('P/MPa');title('原始信号')    subplot(312)    plot(s);xlabel('t/ms');ylabel('P/MPa');title('加6dB高斯白噪声')    subplot(313)    plot(s1);xlabel('t/ms');ylabel('P/MPa');title(['Minimaxi-软阈值-3层-',wname(i,:)])    figure    subplot(511)    plot(data,'r');ylabel('s');title([wname(i,:),'小波分解图'])    set(gca,'ytick',[])     set(gca,'xtick',[])     subplot(512)    plot(C(1:L(2)),'b');ylabel('a3')    set(gca,'ytick',[])     set(gca,'xtick',[])     subplot(513)    plot(C(L(2):L(3)));ylabel('d3')    set(gca,'ytick',[])     set(gca,'xtick',[])     subplot(514)    plot(C(L(3):L(4)));ylabel('d2')    set(gca,'ytick',[])     set(gca,'xtick',[])     subplot(515)    plot(C(L(4):L(5)));ylabel('d1')    SNR_s1(i)=snr(data,s1-data);RMSE_s1(i)=sqrt(mse(data-s1));       SNR_s11(i)=snr(s,s1-s);    disp(['Minimaxi-软阈值-3层-',wname(i,:),':信噪比=',num2str(SNR_s1(i)),'dB,均方根误差=',num2str(RMSE_s1(i))])    disp(['加噪后信噪比=',num2str(SNR_s11(i)),'dB'])    disp('-----------------------------------------------------------')end%% 根据SNR选取较好的小波基函数[m,index]=max(SNR_s1);disp(['最合适的阈值计算估计方法为:',wname(index,:)])disp('-----------------------------------------------------------')

问题3:确定最合适的阈值计算估计方法

代码如下(示例):

clearclcclose all%% MATLAB绘制原始信号load('data.mat');data=data;%% 加6分贝高斯白噪声SNR=6; %6dBnoise=0.2*randn(size(data))*std(data)/db2mag(SNR);s=data+noise;%% main2已经确定最合适的小波基函数wname='sym5';%% 无偏估计阈值(RigrSure)、固定式阈值(Sqtwolog)、启发式阈值(HeurSure)和极大极小阈值(Minimaxi)TPTR=['rigrsure';'sqtwolog';'heursure';'minimaxi'];for i=1:4    s3=wden(s,TPTR(i,:),'s','mln',3,wname); %依次进行滤波    figure    subplot(311)    plot(data);xlabel('t/ms');ylabel('P/MPa');title('原始信号')    subplot(312)    plot(s);xlabel('t/ms');ylabel('P/MPa');title('加6dB高斯白噪声')    subplot(313)    plot(s3);xlabel('t/ms');ylabel('P/MPa');title(['采用',TPTR(i,:),'进行滤波'])    snr_s3(i)=snr(data,s3-data);RMSE_s3(i)=sqrt(mse(data-s3));    snr_s33(i)=snr(s,s3-s);    disp([TPTR(i,:),'-软阈值-3层-',wname,':信噪比=',num2str(snr_s3(i)),'dB,均方根误差=',num2str(RMSE_s3(i))])    disp(['加噪后信噪比=',num2str(snr_s33(i)),'dB'])    disp('-----------------------------------------------------------')end%% 根据SNR选取较好的阈值计算估计方法[m,index]=max(snr_s3);disp(['最合适的阈值计算估计方法为:',TPTR(index,:)])disp('-----------------------------------------------------------')

问题4:确定合适的分解层数

代码如下(示例):

clearclcclose all%% MATLAB绘制原始信号load('data.mat');data=data;%% 加6分贝高斯白噪声SNR=6; %6dBnoise=0.2*randn(size(data))*std(data)/db2mag(SNR);s=data+noise;%% main2和main3确定的小波基函数和阈值计算估计方法wname='sym5';TPTR='sqtwolog';%% 分解层数为1,2,3,4,5,6for i=1:6    s4=wden(s,TPTR,'s','mln',i,wname); %依次进行滤波    figure    subplot(311)    plot(data);xlabel('t/ms');ylabel('P/MPa');title('原始信号')    subplot(312)    plot(s);xlabel('t/ms');ylabel('P/MPa');title('加6dB高斯白噪声')    subplot(313)    plot(s4);xlabel('t/ms');ylabel('P/MPa');title(['分解层数=',num2str(i)])    snr_s4(i)=snr(data,s4-data);RMSE_s4(i)=sqrt(mse(data-s4));    snr_s44(i)=snr(s,s4-s);    disp([TPTR,'-软阈值-',num2str(i),'层-',wname,':信噪比=',num2str(snr_s4(i)),'dB,均方根误差=',num2str(RMSE_s4(i))])    disp(['加噪后信噪比=',num2str(snr_s44(i)),'dB'])    disp('-----------------------------------------------------------')end%% 根据SNR选取较好的分解层数[m,index]=max(snr_s4);disp(['最合适的分解层数为:',num2str(index)])disp('-----------------------------------------------------------')

问题5:实际信号去噪

代码如下(示例):

clearclcclose all%% 读取实际的信号data=xlsread('14#c1.csv');data=data(:,2);%% 加6分贝高斯白噪声SNR=6; %6dBnoise=0.2*randn(size(data))*std(data)/db2mag(SNR);s=data+noise;%% 根据(2)(3)(4)确定参数wname='sym5';TPTR='sqtwolog';lev=6;%% 进行滤波s5=wden(s,TPTR,'s','mln',lev,wname); %进行滤波%% 绘制figure;subplot(311)plot(data);xlabel('t/ms');ylabel('P/MPa');title('实际信号')subplot(312)plot(s);xlabel('t/ms');ylabel('P/MPa');title('加6dB高斯白噪声')subplot(313)plot(s5);xlabel('t/ms');ylabel('P/MPa');title('信号去噪')snr_s55=snr(s,s5-s);snr_s5=snr(data,s5-data);RMSE_s5=sqrt(mse(data-s5));disp([TPTR,'-软阈值-',num2str(lev),'层-',wname,':信噪比=',num2str(snr_s5),'dB,均方根误差=',num2str(RMSE_s5)])disp(['加噪后信噪比=',num2str(snr_s55),'dB'])

问题6:对比

代码如下(示例):

clearclcclose all%% 读取实际的信号data=xlsread('14#c1.csv');data=data(:,2);fs=125000; %%wname='sym5';TPTR='sqtwolog';lev=6;%% 设计4阶巴特沃斯低通滤波器fc=10000;n=4;  %阶数[b,a]=butter(n,fc/(fs/2), 'low');%% 加1-16分贝高斯白噪声for SNR=1:16 %6dB    noise=0.2*randn(size(data))*std(data)/db2mag(SNR);    s=data+noise;    s1=filter(b,a,s);  %filter既能进行IIR滤波又能进行FIR滤波    s2=wden(s,TPTR,'s','mln',lev,wname); %进行滤波    snr_s1(SNR)=snr(data,s1-data);RMSE_s1(SNR)=sqrt(mse(data-s1));    snr_s2(SNR)=snr(data,s2-data);RMSE_s2(SNR)=sqrt(mse(data-s2));endfigure;plot(1:16,snr_s1,'o-r');hold onplot(1:16,snr_s2,'*-b');xlabel('高斯白噪声dB');ylabel('SNR')legend('FIR滤波','小波滤波')title('信噪比曲线')%% for SNR=2:2:10 %6dB    noise=0.2*randn(size(data))*std(data)/db2mag(SNR);    s=data+noise;    s1=filter(b,a,s);  %filter既能进行IIR滤波又能进行FIR滤波    s2=wden(s,TPTR,'s','mln',lev,wname); %进行滤波    figure;    subplot(411)    plot(data);xlabel('t/ms');ylabel('P/MPa');title('实际信号')    subplot(412)    plot(s);xlabel('t/ms');ylabel('P/MPa');title('加16dB高斯白噪声')    subplot(413)    plot(s1);xlabel('t/ms');ylabel('P/MPa');title('FIR信号去噪')    subplot(414)    plot(s1);xlabel('t/ms');ylabel('P/MPa');title('小波信号去噪')    suptitle(['噪声大小=',num2str(SNR),'dB'])end

三、演示视频

基于wden函数的去噪演示

最后

如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真…希望能帮到你!
在这里插入图片描述


点击全文阅读


本文链接:http://zhangshiyu.com/post/109479.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1