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


一、问题描述

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分贝高斯白噪声

代码如下(示例):

clear
clc
close all
%% MATLAB绘制原始信号
load('data.mat'); %私聊发数据
data=data;
%%6分贝高斯白噪声
SNR=6; %6dB
noise=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:确定合适的小波基函数

代码如下(示例):

clear
clc
close all
%% MATLAB绘制原始信号
load('data.mat');
data=data;
%%6分贝高斯白噪声
SNR=6; %6dB
noise=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:确定最合适的阈值计算估计方法

代码如下(示例):

clear
clc
close all
%% MATLAB绘制原始信号
load('data.mat');
data=data;
%%6分贝高斯白噪声
SNR=6; %6dB
noise=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:确定合适的分解层数

代码如下(示例):

clear
clc
close all
%% MATLAB绘制原始信号
load('data.mat');
data=data;
%%6分贝高斯白噪声
SNR=6; %6dB
noise=0.2*randn(size(data))*std(data)/db2mag(SNR);
s=data+noise;
%% main2和main3确定的小波基函数和阈值计算估计方法
wname='sym5';
TPTR='sqtwolog';
%% 分解层数为123456
for 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:实际信号去噪

代码如下(示例):

clear
clc
close all
%% 读取实际的信号
data=xlsread('14#c1.csv');
data=data(:,2);
%%6分贝高斯白噪声
SNR=6; %6dB
noise=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:对比

代码如下(示例):

clear
clc
close 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));
end
figure;
plot(1:16,snr_s1,'o-r');
hold on
plot(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仿真…希望能帮到你!
在这里插入图片描述

  • 24
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: Matlab中的小波去噪是一种信号处理技术,可以有效地去除信号中的噪声。小波去噪的基本原理是利用小波变换将信号分解成不同频率的小波系数,进而根据小波系数的大小和变化规律对其进行滤波处理,最终重构出去噪后的信号。 实现小波去噪的主要步骤包括:首先,利用Matlab中的Wavelet Toolbox进行信号小波变换,并根据需要选择合适的小波基和分解层数;然后,利用阈值处理方法,如硬阈值或软阈值,对小波系数进行滤波处理,去除小于阈值的噪声系数;最后,采用Matlab中的逆小波变换函数,根据处理后的小波系数重构出去噪后的信号。除了基本处理步骤外,还可以通过调节阈值参数等方法来优化小波去噪效果,以便得到更好的去噪结果。 小波去噪在众多领域中有着广泛的应用,如图像处理、信号处理、声音处理等。在Matlab中实现小波去噪,可以利用该软件强大的小波工具箱和灵活的编程环境,为各个应用领域的去噪需求提供高效、准确的解决方案。 ### 回答2: 小波去噪是一种常用于信号处理领域的降噪方法,在MATLAB中也有相应的函数实现。通常,小波去噪的流程包括以下步骤: 首先,需要选择一个适当的小波基函数MATLAB提供了多种小波基函数可供选择,如db1、sym4等。 接着,需要将待处理的信号进行小波分解,可以使用MATLAB中的函数wavedec进行多层小波分解。分解后的结果是一个多层小波系数向量,通过分析这些系数可以确定信号中的噪声成分。 在确定噪声成分后,可以通过将小波系数进行软或硬阈值处理来剔除噪声成分。软阈值处理可以使用MATLAB中的函数wthresh实现,硬阈值处理则可以使用函数hthresh实现。 最后,通过使用MATLAB中的函数waverec进行小波重构,得到去噪后的信号。 需要注意的是,小波去噪不仅可以应用于一维信号处理,还可以用于图像处理等领域。同时,在实际应用中,还需要针对具体的场景进行参数调节和算法优化,以取得更好的去噪效果。 ### 回答3: 小波去噪是使用小波变换对信号进行处理,去除其中的噪声的一种方法。 Matlab中实现小波去噪可以用到多种函数,包括wdenwdenoise。wden函数是Wavelet Toolbox中的一个函数,用于对信号进行小波去噪处理,可以指定小波类型、噪声类型、去噪方法以及去噪强度等参数,同时也可以进行小波重构。wdenoise函数是Signal Processing Toolbox中的一个函数,也能够实现小波去噪,但是参数设置相对简单一些。 使用Matlab进行小波去噪需要先载入信号,对信号进行小波变换,再进行噪声分析,选择适当的小波分解层数和去噪强度,最后进行小波重构得到去除噪声后的信号。在这个过程中,需要对信号的特征进行一定的了解,选择适当的小波类型、去噪方法和去噪强度等参数,才能够得到较好的去噪效果。 总之,Matlab中使用小波变换进行去噪是一种非常有效的方法,可以在信号处理中得到广泛应用。在进行小波去噪时,需要对信号特性进行适当的分析和参数设置,具有较大的灵活性和可操作性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatpyMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值