文章目录
前言
本文介绍了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维纳滤波器系数:
通过比较最终系数可以发现:在自适应过程中,自适应滤波器收敛于维纳系数。
标签:滤波器,NLMS,LMS,步长,适应,算法,信号,归一化 From: https://blog.csdn.net/weixin_45333185/article/details/143533453