(60)使用LMS算法和NLMS(归一化LMS)算法进行降噪


前言

本文介绍了LMS自适应滤波器和NLMS自适应滤波器在降噪方面的应用,阐明期望信号、参考信号和噪声信号的差别,以及它们在LMS自适应滤波和NLMS自适应滤波过程中的应用,还说明了类LMS自适应算法步长的选择。给出了完整的MATLAB仿真代码与降噪结果,另外,还将LMS自适应滤波器、NLMS自适应滤波器与最优的FIR维纳滤波器进行了对比,可以看到在LMS与NLMS的自适应过程中,自适应滤波器系数收敛于维纳滤波器系数。


一、关于自适应降噪仿真的几点说明

1.降噪

降噪也称信号增强,是指使用自适应滤波器进行噪声滤除,从噪声干扰的信号中提取期望的信号。

2. 参考信号与噪声信号

为了进行自适应滤波,一般需要两个信号:一个参考信号,一个包含期望信号和附加噪声成分的噪声信号。

3. LMS算法的步长

类LMS算法有一个步长参数,它决定了滤波器从一个迭代到下一个迭代所应用的校正量。选择合适的步长并不总是容易的,通常需要自适应滤波器设计的经验。步长太小会增加滤波器收敛到一组系数的时间,这是一个收敛速度和准确性的问题。步长太大可能会导致自适应滤波器发散,永远无法达到收敛。在这种情况下,关注的问题是稳定性,要避免设计的滤波器不稳定。 就设计校验而言,较小的步长可以提高滤波器收敛的准确性,但这是以适应所需时间为代价的。

MATLAB中,dsp.LMSFilter对象的maxstep函数可以用来计算滤波器收敛的条件下,适合每个LMS自适应滤波器算法的最大步长通常,步长的符号是mu。maxstep有两个返回值,第一个是系数均值收敛所需的值,第二个是系数均方收敛所需的值。选择较大的步长通常会导致从收敛值产生较大的波动,因此通常选择较小的步长。

4.自适应降噪原理

在设置了自适应滤波器的参数,并准备好所需的参考信号与噪声信号后,将进行自适应滤波过程,滤波器的输出y尽可能接近期望信号x。 由于参考v2只与x的噪声成分v1相关,它实际上只能模拟v1。误差信号(期望的x)减去实际输出y,构成了与v2不相关的x部分的估计s,即要从x中提取的信号。

5.维纳滤波器系数

最后,为了进行比较,代码中还计算了最优的FIR维纳滤波器。

二、LMS与NLMS自适应降噪的仿真

以下是LMS与NLMS自适应降噪的仿真代码:

clc
close all
clear all
%% 创建自适应信号
% 期望的信号(处理过程的输出)是一个包含1000个样本的正弦波。
f = 1;                               % 频率,单位Hz
fs = 30;                             % 采样率,单位Hz
Ts = 1/fs;                           % 采样间隔,单位秒
t = (1:1000) * Ts;                   % 采样时刻
s = sin(2*pi*f*t');                  % 期望信号

% 生成包含期望信号和噪声的噪声信号
v = 0.8*randn(1000,1);               % 随机噪声
ar = [1,1/2];                        % 自回归系数
v1 = filter(1,ar,v);                 % 噪声
x = s + v1;                          % 噪声信号

% 创建参考信号 
ma = [1, -0.8, 0.4 , -0.2];
v2 = filter(ma,1,v);                 % 参考信号 
%% 构建LMS自适应滤波器和NLMS自适应滤波器
L = 7;                               % LMS和NLMS,都是6阶的
lms = dsp.LMSFilter(L,'Method','LMS');
nlms = dsp.LMSFilter(L,'Method','Normalized LMS');
%% 选择步长
[mumaxlms,mumaxmselms]   = maxstep(lms,x);
% mumaxlms = 0.2134
% mumaxmselms = 0.1264
[mumaxnlms,mumaxmsenlms] = maxstep(nlms,x);
% mumaxnlms = 2
% mumaxmsenlms = 2
%% 设置自适应滤波器步长
% 选择较小的步长
lms.StepSize  = mumaxmselms/30;
nlms.StepSize = mumaxmsenlms/20;
%% 使用自适应滤波器进行滤波
[ylms,elms,wlms] = lms(v2,x);
[ynlms,enlms,wnlms] = nlms(v2,x);
%% 计算维纳最优解
bw = firwiener(L-1,v2,x);            % 最优FIR维纳滤波器
yw = filter(bw,1,v2);                % 使用维纳滤波器估计x
ew = x - yw;                         % 实际正弦信号的估计
%% 绘制结果
% 绘制每个滤波器处理后的去噪正弦波结果
figure();
plot(t(900:end),ew(900:end),'LineWidth',1.5);
hold on;
plot(t(900:end),elms(900:end),'LineWidth',1.5);
plot(t(900:end),enlms(900:end),'LineWidth',1.5);
plot(t(900:end),x(900:end),'k:');                      % 用虚线画出噪声信号,作为参考
grid on;
legend('Wiener filter denoised sinusoid',...
       'LMS denoised sinusoid',...
       'NLMS denoised sinusoid',...
       'Noisy Signal');
title('滤波处理后的去噪正弦波');
xlabel('Time index (n)'); ylabel('Amplitude');
hold off;
%% 画图比较最终系数
figure()
subplot(311)
plot(bw,'ro-','LineWidth',1.5);                  % 维纳滤波器的系数
grid on; title('Wiener filter coefficients');
xlabel('coefficients index'); ylabel('coefficients');
subplot(312)
plot(wlms,'bo-','LineWidth',1.5);                % LMS自适应滤波器系数
grid on; title('LMS adaptive filters coefficients');
xlabel('coefficients index'); ylabel('coefficients');
subplot(313);
plot(wnlms,'go-','LineWidth',1.5);               % NLMS自适应滤波器系数
grid on; title('NLMS adaptive filters coefficients');
xlabel('coefficients index'); ylabel('coefficients');

三、仿真结果

(1)带噪信号与自适应降噪处理后的信号对比:

在这里插入图片描述

(2)LMS与NLMS自适应滤波器系数与FIR维纳滤波器系数:

在这里插入图片描述

通过比较最终系数可以发现:在自适应过程中,自适应滤波器收敛于维纳系数。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值