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

这篇具有很好参考价值的文章主要介绍了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仿真…希望能帮到你!
Matlab小波去噪——基于wden函数的去噪分析文章来源地址https://www.toymoban.com/news/detail-443403.html

到了这里,关于Matlab小波去噪——基于wden函数的去噪分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Matlab小波变换-音频去噪

    小波变换-音频去噪 使用小波变换进行音频去噪,实验环境:Matlab 推荐课程:数字信号处理(北京交通大学 陈后金) 第八章内容 B站链接:https://www.bilibili.com/video/BV1at411Q75D?p=101 (慕课上也有) 一、原音频加噪 二、sym8小波去噪 也不一定非选这个sym8,也可以选其他的小波,matl

    2024年02月11日
    浏览(64)
  • 【M波段2D双树(希尔伯特)小波多分量图像去噪】基于定向M波段双树(希尔伯特)小波对多分量/彩色图像进行降噪研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 本文实

    2024年02月13日
    浏览(32)
  • 【高光谱图像的去噪算法】通过全变异最小化对受激拉曼光谱图像进行去噪研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章

    2024年02月14日
    浏览(27)
  • 基于ICEEMDAN-SpEn(样本熵)联合小波阈值去噪

    以样本熵为阈值的ICEEMDAN(Incomplete Ensemble Empirical Mode Decomposition with Adaptive Noise)联合小波阈值去噪是一种信号处理方法,用于去除信号中的噪声。它结合了ICEEMDAN分解和小波阈值去噪方法。 以下是该方法的步骤: 1. ICEEMDAN分解:将原始信号通过ICEEMDAN方法进行分解,得到多个

    2024年01月22日
    浏览(25)
  • matlab小波变换、离散小波变换函数使用

    matlab中,连续小波变换、离散小波变换函数使用比较复杂,最近做了个总结。 参考1:https://www.jianshu.com/p/56733f6c0a10 参考2:小波变换工具箱(7页)-原创力文档 参考3:《Matlab信号处理》 沈再阳,清华大学出版社,第8章 注意:以下所有函数均为matlab 2020a环境中测试,更早的版

    2024年02月02日
    浏览(30)
  • 如何评价滤波器的去噪效果?

    假如使用两种滤波器,那么滤波效果如何去评价 1 ? 为了能够得到高质量的去噪后信号,需要对滤波器的滤波效果进行评价,选取去噪效果最好的滤波器对原始信号进行去噪处理。 一般使用 信噪比和峰值信噪比 对滤波器进行量化评价, 信噪比和峰值信噪比的值越大,说明

    2024年02月03日
    浏览(97)
  • Matlab 离散小波变换函数 dwt2() 原理介绍与实验

    离散小波变换(DWT)的原理介绍和说明请参考文章: 【DWT笔记】傅里叶变换与小波变换 这篇文章写的通俗易懂,小白也能看懂。 1.1 小波变换简介 离散小波变换(DWT)的原理介绍和说明请参考文章:【DWT笔记】傅里叶变换与小波变换 这篇文章写的通俗易懂,小白也能看懂。

    2024年02月04日
    浏览(30)
  • 基于MATLAB的语音去噪处理系统

    一.滤波器的简述 在MATLAB环境下IIR数字滤波器和FIR数字滤波器的设计方 法即实现办法,并进行图形用户界面设计,以显示所介绍迷你滤波器的设计特性。 在无线脉冲响应(IIR)数字滤波器设计中,先进行模拟滤波器的设计,然后进行模拟数字滤波器转换,即采取脉冲响应不

    2024年02月11日
    浏览(39)
  • 169基于matlab的小波神经网络预测

    基于matlab的小波神经网络预测,通过权值参数更新得到误差较小模型,进行多输出单输出预测。输出预测可视化结果。程序已调通,可直接运行。 169matlab小波神经网络预测 多输入单输出 (xiaohongshu.com)

    2024年02月22日
    浏览(32)
  • c++仿写小波分解和去噪代码(只使用基础库)

    参考了一些Github的代码 最终代码可从链接下载。 main函数如果打不开的话,使用 Matlab自带函数去噪效果更好,改写的C++因为计算精度和逻辑有所差异,但改变软阈值的值或者改成硬阈值去噪法也能改善结果。

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包