自学内容网 自学内容网

一维信号全变分(TV)降噪方法(MATLAB)

信号降噪一直是领域研究的热点,这是一项十分有意义并且极具挑战性的工作,经过几十年来相关科研人员的共同努力,降噪技术得到了极大的发展,并在现实生活中也得到了广泛的应用。其中,许多常用的方法有:小波变换、线性滤波等算法。线性滤波方法计算简单、运算速度快,这种降噪算法在心电监测仪器中已经被广泛应用。但是,像特殊的生物信号如肌电信号,噪声信号的频谱往往与肌电信号的频谱重叠,传统的线性滤波技术无法将噪声信号与肌电信号分离,提取有效的肌电信号。

现有的降噪算法虽具有良好的降噪性能。但是利用这些算法在对稀疏信号进行降噪时会产生一些阶梯伪像噪声,如寄生噪声尖峰和Gibbs振荡,导致原始信号中重要信号丢失。而 Rudin Osherand Fatemi基于变分法的思想提出基于全变分正则化的降噪方法,由于该方法主要是利用了信号在时域内的光滑性,在对稀疏信号进行降噪时能保留信号的边缘信息并准确还原原始信号。

全变分去噪是一种基于基础信号为分段常数信号的非线性滤波方法(等效地,基础信号的导数是稀疏的)这种信号出现在地球科学、生物物理学和其他领域,全变分去噪技术还与其它方法结合使用,以处理更一般类型的信号,但是全变分去噪方法在处理稀疏信号时更为突出。

全变分降噪的主运行代码如下:

clc;
clear all;
close all;


%Generate sine wave;
%{
x = -10*pi:.1:10*pi; 
y = sin(x); 
plot(x,y)
%}

%Load a piecewice defined function instead of a sine wave
% You can use any  signal that you have
load testSig3.mat;
y = testSig3;

%add some noise to it
sigma = 10;
noisy_y = y + sigma * randn(1, length(y));

%figure;
%plot(x,noisy_y) %To plot sine wave;

lam = 0.0078;
rho = 1.0;
Nit = 200;

%% ********** Run the TV-solver ***************
out = ADMM_1D(noisy_y, lam, rho, Nit); 
%% ********************************************

%%
figure;
subplot(3,1,1)
plot(y);
axis tight;
title('Original Signal');

subplot(3,1,2);
plot(noisy_y)
axis tight;
title('Noisy Signal');

subplot(3,1,3);
plot(out.sol);
axis tight;
title('TV Denoised');

figure;
plot(out.funVal);
title('Function Value');

完整代码:https://mbd.pub/o/bread/ZJeXmptu

擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。

图片

图片

擅长领域:现代信号处理,机器学习,深度学习,数字孪生,时间序列分析,设备缺陷检测、设备异常检测、设备智能故障诊断与健康管理PHM等。


原文地址:https://blog.csdn.net/weixin_39402231/article/details/140115813

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!