引言
最小均方误差算法(LMS)作为一种自适应均衡和滤波算法,在通信与信号处理中具有广泛的应用,可以有效地滤除信道噪声,获取很好的通信质量。本文针对该算法进行了理论分析,Matlab仿真与FPGA实现。
1、理论分析
在前面的博文中我们对常见的几种MIMO均衡算法(CMA,LMS,RLS)理论进行了详细介绍,这里不再赘述,见链接:MIMO均衡算法(CMA,LMS,RLS)原理介绍
这里主要介绍一下LMS算法的主要流程:
- 初始化滤波器长度,权值,遗忘因子
- 执行卷积,计算输出值
- 计算输出值与参考值之间的误差
- 进行权值更新
2、Matlab仿真
根据如前所述的算法原理,我们利用Matlab算法仿真工具对该算法进行了仿真,相应代码及注释如下:
% 最小均方误差(LMS)
function [e,w,y]=LMS(mu,M,x,d)
%% 参数定义
% 输出参数:
% e: 误差输出
% w: 最终滤波器系数 M*1维
% y: 输出信号
% 输入参数:
% mu: 因子
% M:滤波器长度
% x: 输入信号,N*1维
% d: 目标信号
%%
%step1: 算法初始化
% 滤波器系数
w=zeros(M,1);
% 输入向量长度
N=length(x);
% 执行LMS
for n=M:N
% 倒序输入
filter_in = x(n:-1:n-M+1);
% 计算输出
y(n) = w'*filter_in;
% 误差计算
e(n) = d(n)- y(n);
% 滤波器系数更新
w = w + mu*filter_in*e(n);
end
clc;
clear;
%% 产生待滤波信号
Fs = 20000; %采样频率
N = 2^12; %采样点数
t = 0:1/Fs:N/Fs-1/Fs;%时间跨度
s = sin(2000*2*pi*t) + sin(6000*2*pi*t) + sin(9000*2*pi*t);%待滤波波形
% 归一化
s = (s - min(s))/(max(s) - min(s));
%% 通过高斯信道
noise=0.05*randn(1,length(s));
s_addnoise = s + noise;
% %% RLS
% lambda = 1;
% M = 15;
% delta = 1e-7;
% [e,w,y]=RLS(lambda,M,s_addnoise',s',delta);
%% LMS
M = 15;
mu = 0.0234;
[e,w,y]=LMS(mu,M,s_addnoise',s');
% %% NLMS
% M = 15;
% mu = 0.05;
% a = 1e-4;
% [e,w,y]=NLMS(mu,M,s_addnoise',s',a);
%% 时域波形
figure(1);
subplot(3,1,1);
plot(t,s,'r','LineWidth',1.2);
axis([1500/Fs,1600/Fs,0,1]);
title('滤波前时域波形');
subplot(3,1,2);
plot(t,s_addnoise,'r','LineWidth',1.2);
axis([1500/Fs,1600/Fs,0,1]);
title('加噪声后时域波形');
subplot(3,1,3);
plot(t,y,'r','LineWidth',1.2);
axis([1500/Fs,1600/Fs,0,1]);
title('自适应滤波后时域波形');
%% 误差曲线
figure(2);
plot(abs(e),'r','LineWidth',1.2);
title('误差曲线');
如下所示为LMS算法对应的误差曲线,迭代次数为 500次的时候误差基本已经收敛。
3、FPGA实现
一种算法要想在实际应用中产生实际效果,就必须研究其具体的实现方式,FPGA作为一种并行处理器,在通信及信号处理领域应用比较广泛,因此,本文还研究了该算法的FPGA实现。该算法应用流水线的思想进行实现,流水线处理思想增大了数据吞吐量,降低了数据的处理延时,可以使得该算法能应用于高速度的通信场合。
- 卷积模块(conv.v):该模块主要执行输入数据与滤波器权值数据的卷积操作,实现滤波数据输出
`timescale 1ns/1ps
module conv(
// system signals
input clk ,
input rst_n ,
// 输入待滤波数据
input signed [15:0]data_in ,
// 权值数据
input signed [15:0]w0 ,
input signed [15:0]w1 ,
input signed [15:0]w2 ,
input signed [15:0]w3 ,
input