自适应滤波算法实现信号噪声的消除

自适应滤波算法实现信号噪声的消除,第1张

自适应滤波算法实现信号噪声的消除 一.实验目的

利用LMS算法和RLS算法将一个叠加有噪声的信号实现噪声消除,恢复原始信号。

二.实验过程及仿真

在一个理想信号中,混入一定量的高斯白噪声,通过上述两种自适应算法把噪声尽可能消除,最终恢复输入的理想信号。
主输入信号x(n)由理想信号s(n)和噪声n0组成。为了便于分析,理想信号s(n)可以是正弦信号,n0是方差为1、均值为零的高斯白噪声。自适应算法实现降噪的原理框图如图所示.

3.1 LMS算法实现降噪

在本程序中,先取500点信号长度,产生正弦信号作为参考输入信号。然后产生同样长度的随机噪声,把它叠加在正弦信号中。LMS滤波算法单独编写了一个子函数,输入各项参数分别为输入信号、参考输入、收敛因子,输出各项参数分别为滤波器的系数矩阵、误差信号、输出信号。程序如下:

%%%% LMS自适应滤波算法实现滤波功能 %%%%
close all;
clear;
t=0:499;        % 产生理想信号
xs=5*sin(0.2*t);%xs为理想的正弦信号
figure;         %绘制理想信号的图像
subplot(311);
plot(t,xs);
grid on;%显示窗格
title("理想信号");
xn=randn(1,500);%产生均值为0的随机噪声
subplot(312);%绘制随机噪声的图像
plot(t,xn);
grid on;     %显示窗格
title("随机噪声");
xn=xs+xn;   %产生输入信号(理想信号+噪声)
xn=xn.';    %将输入信号由行向量转置为列向量
dn=xs.';    %将理想信号由行向量转置为列向量
subplot(313);%绘制输入信号和理想信号的图像
plot(t,xn,'r');
grid on;    %显示窗格
title('输入信号(理想信号+随机噪声)');
mu=0.003;	%收敛常数
%引用LMS算法实现滤波
[w,en,yn]=my_LMS(xn,dn,mu);
figure; 	%绘制滤波器输出信号和误差信号图像
plot(t,yn);%绘制经过滤波器滤波后信号
grid on;  %显示窗格
title('滤波后信号');
figure;
subplot(311);
plot(t,xn,'red');
grid on;	%显示窗格
title('滤波器的输入信号');
subplot(312);
plot(t,yn,'blue');
grid on;	%显示窗格
title('滤波器的输出信号');
subplot(313);
plot(t,en,'green');
grid on;	%显示窗格
title('误差信号');

%LMS算法子函数
function [w,en,yn]=my_LMS(xn,dn,mu)
%LMS实现程序
%   输入:
% xn    输入信号      列向量
% dn    理想信号      列向量
% mu   收敛常数      标量
% itr    迭代次数      标量
% M    滤波器的阶数  标量
%   输出:
% w    滤波器的系数矩阵    大小为M×itr  每一列代表一次迭代后的系数
% en   误差信号            大小为itr×1  每一行代表一次迭代后产生的误差
% yn   滤波器的输出信号    列向量
M=20; %定义滤波器的阶数为20
itr=length(xn); %使得迭代次数为输入信号xn的长度
w=zeros(M,itr);%将滤波器的初始值设置为0
en=zeros(itr,1);%将初始误差设置为0
%迭代更新滤波器的参数
for k=M:itr    %要保证输入延时后的信号有效,所以实际的迭代次数只有(itr-M)次,
    x=xn(k:-1:k-M+1);%将输入信号延迟,使得滤波器的每个抽头都有输入
    y=w(:,k-1).'*x;
    en(k)=dn(k)-y;   %得出误差信号
    w(:,k)=w(:,k-1)+mu*en(k)*x;%迭代更新滤波器的系数
end
%滤波器参数固定后,得出经过优化滤波器滤波后的输出信号
yn=inf*ones(length(xn));	%inf意为无穷大,将yn的初始值置为无穷大,
%绘制图像的时候将无法显示
for k=M:itr
    x=xn(k:-1:k-M+1);
    yn(k)=w(:,k).'*x;
end
end
3.2 RLS算法实现降噪

用同样的方法,先取1000点信号长度,产生余弦信号作为参考输入信号。然后产生同样长度的随机噪声,把它叠加在正弦信号中。RLS滤波算法单独编写了一个子函数 [e,w]=my_rls(lambda,M,u,d,delta),输入各项参数分别为指数加权因子、滤波器阶数、输入信号、参考输入信号、正则系数,输出各项参数分别为滤波器输出、滤波器系数矩阵。程序如下:

%%%%RLS自适应滤波算法实现滤波功能 %%%%
%RLS实现噪声消除
clc;close all;
N=1000;             %信号点数
t=1:N;
s=5*cos(0.05*pi*t);   %余弦信号
s=s-mean(s);         %除去直流分量
s=s/max(abs(s));      %幅度归一化
clean=s;
ref_noise=0.1*randn(1,N);  %产生高斯白噪声
mixed=clean+ref_noise;    %产生带噪信号
mu=0.005;M=2;espon=1e-4;
delta=1e-7;
lambda=1;
[en,w]=rls(lambda,M,ref_noise,mixed,delta);%RLS算法子程序
er=en-clean;            %er为误差信号,滤波器输出-输入
figure(1);
subplot(311);
plot(t,clean);
grid on;
xlabel('信号点数');
ylabel('幅度');
title('原始信号');
subplot(312);
plot(t,mixed);
grid on;
xlabel('信号点数');
ylabel('幅度');
title('含噪信号');
subplot(313);
plot(t,en);
grid on;
xlabel('信号点数');
ylabel('幅度');
title('滤波器的输出信号');
axis([0 1000 -2 2]);
figure(2);
plot(t,er);
grid on;
xlabel('信号点数');
ylabel('幅度');
title('误差信号');

function [e,w]=rls(lambda,M,u,d,delta)
%输入参数:
% lambda = 指数加权因子, (0,1]
% M = 滤波器阶数, dim 1x1
% u =输入信号, dim Nx1
% d =参考输入, dim Nx1
% delta = 正则系数, 通常取 1e-7.
% 输出参数
% e = 滤波器输出, dim Nx1
% w = 滤波器系数矩阵, dim Mx1
% 1.初始化变量
w=zeros(M,1);
P=eye(M)/delta;
u=u(:);
d=d(:);
%输入信号长度
N=length(u);
e=d.';
% 2.RLS算法部分
for n=M:N
    uvec=u(n:-1:n-M+1);
    e(n)=d(n)-w'*uvec;
    k=lambda^(-1)*P*uvec/(1+lambda^(-1)*uvec'*P*uvec);
    P=lambda^(-1)*P-lambda^(-1)*k*uvec'*P;
    w=w+k*conj(e(n));
end
三.仿真结果及分析

利用LMS算法实现噪声消除的仿真结果如下。图3-1为理想信号、随机噪声、滤波器输入信号的时域波形图。图3-2为滤波器输入信号、滤波器输出信号、误差信号的时域波形图。把滤波器输出信号与理想信号进行对比,可以发现两者波形很相似,但是输出波形有一定延迟。这是因为滤波器的长度为20,经过这20个信号样值的循环后,在下一时刻滤波器才有输出,同时误差逐渐收敛到0。


利用RLS算法实现噪声消除的仿真结果如下。通过比较原始信号与输出信号我们可以发现,在经过一定的时间后,未加噪信号与输出信号之间的误差已经缩小到可以忽略不计,滤波器输出信号与原始信号几乎一样。因此,我们认为RLS算法进行的噪声消除的结果是成功的。
图3-3:噪声消除RLS算法仿真

图3-4: RLS算法误差信号

四.总结

在本次实验中,通过生成原始正弦信号,并将该信号分别通过LMS算法、RLS算法进行噪声消除,最终我们得到了信号的输出情况。完成这些之后,我们又将LMS算法与RLS算法加以对比。最终,我们得出结论:RLS算法不仅收敛速度比LMS算法快得多,而且收敛后的噪声消除稳定度比LMS算法好。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5712013.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存