基于LMS算法的自适应均衡器设计及
MATLAB实现
一.实验目的
1.了解LMS算法的基本原理;
2.掌握MATLAB的使用方法;
3.初步体会分析问题、研究问题的基本步骤和方法,为以后科研积累经验。
二.实验原理
1. LMS算法简介
在移动通信环境中,多径传播效应和频率选择性衰落会导致传输信号失真。失真主要表现为码间干扰,码间干扰是降低数字通信系统性能的一个主要因素。在这样的信道条件下设计实际的数字通信系统以高速传输数据时,往往不能获得足够准确的信道频率响应用于调制和解调器的最佳滤波器的设计。这是因为在每次通信时信道的路由不同,对于这样的信道,要设计最佳固定解调滤波器是不可能的。在这样的情况下,应该采取信道均衡的方式以减小失真。
信道均衡是通信技术和信号处理的基本问题之一,其目的在于克服传送的符号码和符号码之间的相互干扰,这种干扰是因为信道的非理想特性造成的。由于通信信道可能是未知和变化的,就需要自适应的调整均衡器,使得整个传输系统输出的符号码和符号码之间的干扰被消除。信道均衡可以利用发送的训练信号来开始,这称为自动均衡。
在设计自适应均衡器的多种方法中,最小均方自适应算法(LMS)采用梯度搜索法,这使收敛到最优解远比其他算法快,而且该算法原理简单,实施容易,所以目前这一算法已广泛用于计算自适应滤波器的权系数。
2.LMS算法的原理
(1)自适应滤波原理
自适应滤波器的特性变化是由自适应算法通过调整滤波器系数来实现的。一般而言,自适应滤波器由两部分组成,一是滤波器结构,二是调整滤波器系数的自适应算法。自适应滤波器的结构采用FIR或IIR结构均可,由于IIR滤波器存在稳定性问题,因此一般采用FIR 滤波器作为自适应滤波器的结构。图1给出了自适应滤波器的一般结构。
图1为自适应滤波器结构的一般形式,图中x(n)为输入信号,通过参数可调的数字滤波器后产生输出信号y(n),将输出信号y(n)与标准信号(或者为期望信号)d(n)进行比较,
得到误差信号e(n)。e(n)和x(n)通过自适应算法对滤波器的参数进行调整,调整的目的使得误差信号e(n)最小。
自适应滤波器设计中最常用的是FIR横向型结构。图2是横向型滤波器的结构示意图。
其中:x(n)为自适应滤波器的输入;w(n)为自适应滤波器的冲激响应:w(n)={w(O),w(1),…,w(N-1)};y(n)为自适应
(2)自适应滤波算法
自适应滤波器除了包括一个按照某种结构设计的滤波器,还有一套自适应的算法。自适应算法是根据某种判断来设计的。自适应滤波器的算法主要是以各种判据条件作为推算基础的。通常有两种判据条件:最小均方误差判据和最小二乘法判据。LMS 算法是以最小均方误差为判据的最典型的算法,也是应用最广泛的一种算法。
最小均方误差(Least Mean Square,LMS)算法是一种易于实现、性能稳健、应用
广泛的算法。所有的滤波器系数调整算法都是设法使y(n)接近d(n),所不同的只是对于这种接近的评价标准不同。LMS算法的目标是通过调整系数,使输出误差序列
e(n)=d(n)-y(n)的均方值最小化,并且根据这个判据来修改权系数,该算法因此而得名。误差序列的均方值又叫“均方误差”(Mean Sqluare Error,MSE)。
理想信号d(n)与滤波器输出y(n)之差e(n)的期望值最小,并且根据这个判据来修改权系数wi(n)。由此产生的算法称为LMS。均方误差ε表示为:
对于横向结构的滤波器,代入y(n)的表达式:
其中:R=E[X(n)XT(n)]为N×N的自相关矩阵,它是输入信号采样值间的相关性矩阵。
P=E[d(n)X(n)]为N×1互相关矢量,代表理想信号d(n)与输入矢量的相关性。在均方误差ε达到最小时,得到最佳权系数它应满足下式:
这是一个线形方程组,如果R矩阵为满秩的,R-1存在,可得到权系数的最佳值满足:W*=R-1p。用完整的矩阵表示为:
显然φx(m)=E[x(n)x(n-m)]为x(n)的自相关值,φxd(R)=E[x(n)d(n一k)]为x(n)与d(n)互相关值。在有些应用中,把输入信号的采样值分成相同的一段(每段称为一帧),再求出R,P的估计值得到每帧的最佳权系数。这种方法称为块对块自适应算法。如语音信号的线性预
测编码LPC就是把语音信号分成帧进行处理的。R,P的计算,要求出期望值E,在现实运算中不容易实现,为此可通过下式进行估计:
用以上方法获得最佳W*的运算量很大,对于一些在线或实时应用的场合,无法满足其时间要求。大多数场合使用迭代算法,对每次采样值就求出较佳权系数,称为采样值对采样值迭代算法。迭代算法可以避免复杂的R-1和P的运算,又能实时求得近似解,因而切实可行。LMS算法是以最快下降法为原则的迭代算法,即W(n+1)矢量是W(n)矢量按均方误差性能平面的负斜率大小调节相应一个增量:W(n+1)=W(n)-μ▽(n),这个“是由系统稳定性和迭代运算收敛速度决定的自适应步长。▽(n)为n次迭代的梯度。对于LMS算法▽(n)为下式
E[e2(n)]的斜率:
由上式产生了求解最佳权系数W*的两种方法,一种是最陡梯度法。其思路为:设计初始权系数W(0),用W(n+1)=W(n)一μ▽(n)迭代公式计算,到W(n+1)与W(n)误差小于规定范围。其中▽(n)计算可用估计值表达式:
上式K取值应足够大。如果用瞬时一2e(n)X(n)来代替上面对-2E[e(n)X(n)]的估计运算,就产生了另一种算法——随机梯度法,即Widrow-Hoft的LMS算法。此时迭代公式为:W(n+1)=W(n)+2ue(n)X(n)
以后讨论的LMS算法都是基于WidrOW-Hoff的LMS算法。上式的迭代公式假定滤波器结构为横向结构。对于对称横向型结构也可推出类似的迭代公式:
W(n+1)=W(n)+2ue(n)[X(n)+X(n一N+1)]
三.MATLAB仿真源程序
1.LMS算法
function [yn,W,en]=LMS(xn,dn,M,mu,itr)
% LMS(Least Mean Squre)算法
% 输入参数:
% xn 输入的信号序列(列向量)
% dn 所期望的响应序列(列向量)
% M 滤波器的阶数(标量)
% mu 收敛因子(步长) (标量) 要求大于0,小于xn的相关矩阵最大特征值的倒数
% itr 迭代次数(标量) 默认为xn的长度,M % 输出参数: % W 滤波器的权值矩阵(矩阵) % 大小为M x itr, % en 误差序列(itr x 1) (列向量) % yn 实际输出序列(列向量) % 参数个数必须为4个或5个 if nargin == 4 % 4个时递归迭代的次数为xn的长度 itr = length(xn); elseif nargin == 5 % 5个时满足M if itr>length(xn) | itr error('迭代次数过大或过小!'); end else error('请检查输入参数的个数!'); end % 初始化参数 en = zeros(itr,1); % 误差序列,en(k)表示第k次迭代时预期输出与实际输入的误差 W = zeros(M,itr); % 每一行代表一个加权参量,每一列代表-次迭代,初始为0 % 迭代计算 for k = M:itr % 第k次迭代 x = xn(k:-1:k-M+1); % 滤波器M个抽头的输入 y = W(:,k-1).' * x; % 滤波器的输出 en(k) = dn(k) - y ; % 第k次迭代的误差 % 滤波器权值计算的迭代式 W(:,k) = W(:,k-1) + 2*mu*en(k)*x; end % 求最优时滤波器的输出序列 yn = inf * ones(size(xn)); for k = M:length(xn) x = xn(k:-1:k-M+1); yn(k) = W(:,end).'* x; end 2.调用LMS算法 %function main() close all % 周期信号的产生 t=0:99; xs=10*sin(0.5*t); figure; subplot(2,1,1); plot(t,xs);grid; ylabel('幅值'); title('{输入周期性信号}'); % 噪声信号的产生 randn('state',sum(100*clock)); xn=randn(1,100); subplot(2,1,2); plot(t,xn);grid; ylabel('幅值'); xlabel('时间'); title('{随机噪声信号}'); % 信号滤波 xn = xs+xn; xn = xn.' ; % 输入信号序列 dn = xs.' ; % 预期结果序列 M = 20 ; % 滤波器的阶数 rho_max = max(eig(xn*xn.')); % 输入信号相关矩阵的最大特征值mu = rand()*(1/rho_max) ; % 收敛因子0 < mu < 1/rho [yn,W,en] = LMS(xn,dn,M,mu); % 绘制滤波器输入信号 figure; subplot(2,1,1); plot(t,xn);grid; ylabel('幅值'); xlabel('时间'); title('{滤波器输入信号}'); % 绘制自适应滤波器输出信号 subplot(2,1,2); plot(t,yn);grid; ylabel('幅值'); xlabel('时间'); title('{自适应滤波器输出信号}'); % 绘制自适应滤波器输出信号,预期输出信号和两者的误差figure plot(t,yn,'b',t,dn,'g',t,dn-yn,'r');grid; legend('自适应滤波器输出','预期输出','误差'); ylabel('幅值'); xlabel('时间'); title('{自适应滤波器}'); 3.运行结果