一、LMS算法设计流程
LMS算法,通过误差反馈动态调整滤波器权值,使输出趋近期望信号(原信号)。
其理论公式为:
W(n+1)=W(n)+μ⋅e(n)⋅x(n)
其中,W(n) 是第n次迭代的权值向量,μ是学习率,e(n)=d(n)−y(n) 是误差d(n)为期望输出,y(n) 为滤波器输出,x(n) 是输入向量(包含当前及历史样本)。
四步流程
信号生成与噪声添加
生成正弦信号并添加高斯噪声,模拟实际信号场景;
频谱分析
通过FFT观察原信号、加噪信号的频谱特征;
LMS自适应滤波
调用自定义的zx_lms函数,对加噪信号进行滤波;
结果验证
绘制滤波后信号的时域图和频谱,对比原信号与滤波效果。
二、Matlab代码实现
1. 信号生成与噪声添加
在matlab中生成正弦信号作为“期望输出”d(n),添加噪声模拟实际场景。
t = -5*pi:pi/100:5*pi; % 时间向量,范围[-5π, 5π],步长π/100
x = sin(t); % 生成正弦信号(频率为1Hz,因sin(t)的周期为2π)
x = x(:); % 转为列向量
sx = size(x,1); % 信号长度(sx=1001)
% 添加高斯噪声
noise = 0.2*randn(size(x)); % 均值为0,方差为0.04(randn方差为1,乘以0.2后方差为0.04)
x1 = x + noise; % 加噪信号(输入信号xn)
2. 频谱分析
通过频谱对比,原信号频谱中正弦信号的频谱在1Hz处有尖锐峰值(FFT结果);而加噪信号频谱中噪声使频谱出现宽带的随机成分,淹没原信号峰值。
% 原信号时域图
subplot(2,2,1);
plot(x); axis([0 sx -1 1]);
% 原信号FFT
xf = fft(x,1024);
subplot(2,2,3);
plot(abs(xf));
% 加噪信号时域图
subplot(2,2,2);
plot(x1); axis([0 sx -1 1]);
% 加噪信号FFT
xf = fft(x1,1024);
subplot(2,2,4);
plot(abs(xf));
3.LMS参数配置
M=50:滤波器阶数,决定了输入向量的长度(即延迟线的数量);
w=0.1*ones(50,1):初始权值,通常初始化为小随机数或全1;
u=0.1:学习率,过大导致发散,过小导致收敛慢;
max_iter=100:迭代次数,需足够大以保证权值收敛;
min_err=0.5:误差阈值,当误差小于此值时停止迭代。
% LMS参数设置
param.M = 50; % 滤波器阶数(延迟线长度)
param.w = ones(param.M,1) * 0.1; % 初始化权值(50个0.1)
param.u = 0.1; % 学习率(控制收敛速度与稳定性)
param.max_iter = 100; % 最大迭代次数
param.min_err = 0.5; % 最小误差阈值(迭代停止条件)
% 调用LMS函数
[yn, err] = zx_lms(x1(:,1), x(:,1), param);
% 绘制滤波后信号
figure, plot(yn);
% 滤波后信号FFT
ynf = fft(yn(param.M:end), 1024);
figure, plot(abs(ynf));
4. LMS函数zx_lms的实现分析
function [yn, err] = zx_lms(xn, dn, param)
W = param.w; % 初始权值
M = param.M; % 滤波器阶数
% 参数检查
if length(W) ~= M
error('param.w的长度必须与滤波器阶数相同.n');
end
if param.max_iter > length(xn) || param.max_iter < M
error('迭代次数太大或太小,M<=max_iter<=length(xn)n');
end
iter = 0;
for k = M:param.max_iter % 迭代范围:从M到max_iter(注意:max_iter=100,xn长度=1001)
x = xn(k:-1:k-M+1); % 输入向量(倒序,x(1)=xn(k), x(2)=xn(k-1), ..., x(M)=xn(k-M+1))
y = W.*x;
err = dn(k) - y; % 误差计算(依赖y的正确性)
% 权值更新
W = W + 2*param.u*x;
iter = iter + 1;
if (abs(err) < param.min_err); break; end % 误差阈值停止条件
end
% 计算滤波后输出(从第M个样本开始)
yn = inf * ones(size(xn));
for k = M:length(xn)
x = xn(k:-1:k-M+1);
yn(k) = W(:,end).'* x; % 权值与输入向量的点积(正确)
end
end
三、Matlab仿真验证
1、原信号时域图
正弦波x(n)=sin(t);波形规则、周期性明显,幅度在[-1, 1]之间波动,无噪声干扰,体现“期望输出”的纯净性。
2、加噪信号时域图
原信号 + 高斯噪声(x1(n)=x(n)+0.2⋅randn(n));正弦波被噪声污染,波形波动剧烈(噪声幅度为0.2,原信号幅度为1,信噪比约-14dB),体现“输入信号”的受扰状态。
3、原信号频谱(FFT)
频谱在单频点(如1Hz,因正弦波频率为1Hz)有尖锐峰值,其余频率成分几乎为0,说明原信号是单频纯净信号。
4、加噪信号频谱(FFT)
原信号的峰值依然存在,但宽带噪声覆盖了整个频带(低幅度随机起伏),原信号峰值被噪声淹没,体现噪声对频谱的污染。
27