当前位置:   article > 正文

LMS自适应均衡器---从理论仿真到FPGA实现_lms均衡

lms均衡

引言

       最小均方误差算法(LMS)作为一种自适应均衡和滤波算法,在通信与信号处理中具有广泛的应用,可以有效地滤除信道噪声,获取很好的通信质量。本文针对该算法进行了理论分析,Matlab仿真与FPGA实现。

1、理论分析

       在前面的博文中我们对常见的几种MIMO均衡算法(CMA,LMS,RLS)理论进行了详细介绍,这里不再赘述,见链接:MIMO均衡算法(CMA,LMS,RLS)原理介绍

       这里主要介绍一下LMS算法的主要流程:

  • 初始化滤波器长度,权值,遗忘因子
  • 执行卷积,计算输出值
  • 计算输出值与参考值之间的误差
  • 进行权值更新

2、Matlab仿真

       根据如前所述的算法原理,我们利用Matlab算法仿真工具对该算法进行了仿真,相应代码及注释如下:

  1. % 最小均方误差(LMS)
  2. function [e,w,y]=LMS(mu,M,x,d)
  3. %% 参数定义
  4. % 输出参数:
  5. % e: 误差输出
  6. % w: 最终滤波器系数 M*1维
  7. % y: 输出信号
  8. % 输入参数:
  9. % mu: 因子
  10. % M:滤波器长度
  11. % x: 输入信号,N*1维
  12. % d: 目标信号
  13. %%
  14. %step1: 算法初始化
  15. % 滤波器系数
  16. w=zeros(M,1);
  17. % 输入向量长度
  18. N=length(x);
  19. % 执行LMS
  20. for n=M:N
  21. % 倒序输入
  22. filter_in = x(n:-1:n-M+1);
  23. % 计算输出
  24. y(n) = w'*filter_in;
  25. % 误差计算
  26. e(n) = d(n)- y(n);
  27. % 滤波器系数更新
  28. w = w + mu*filter_in*e(n);
  29. end
  1. clc;
  2. clear;
  3. %% 产生待滤波信号
  4. Fs = 20000; %采样频率
  5. N = 2^12; %采样点数
  6. t = 0:1/Fs:N/Fs-1/Fs;%时间跨度
  7. s = sin(2000*2*pi*t) + sin(6000*2*pi*t) + sin(9000*2*pi*t);%待滤波波形
  8. % 归一化
  9. s = (s - min(s))/(max(s) - min(s));
  10. %% 通过高斯信道
  11. noise=0.05*randn(1,length(s));
  12. s_addnoise = s + noise;
  13. % %% RLS
  14. % lambda = 1;
  15. % M = 15;
  16. % delta = 1e-7;
  17. % [e,w,y]=RLS(lambda,M,s_addnoise',s',delta);
  18. %% LMS
  19. M = 15;
  20. mu = 0.0234;
  21. [e,w,y]=LMS(mu,M,s_addnoise',s');
  22. % %% NLMS
  23. % M = 15;
  24. % mu = 0.05;
  25. % a = 1e-4;
  26. % [e,w,y]=NLMS(mu,M,s_addnoise',s',a);
  27. %% 时域波形
  28. figure(1);
  29. subplot(3,1,1);
  30. plot(t,s,'r','LineWidth',1.2);
  31. axis([1500/Fs,1600/Fs,0,1]);
  32. title('滤波前时域波形');
  33. subplot(3,1,2);
  34. plot(t,s_addnoise,'r','LineWidth',1.2);
  35. axis([1500/Fs,1600/Fs,0,1]);
  36. title('加噪声后时域波形');
  37. subplot(3,1,3);
  38. plot(t,y,'r','LineWidth',1.2);
  39. axis([1500/Fs,1600/Fs,0,1]);
  40. title('自适应滤波后时域波形');
  41. %% 误差曲线
  42. figure(2);
  43. plot(abs(e),'r','LineWidth',1.2);
  44. title('误差曲线');

       如下所示为LMS算法对应的误差曲线,迭代次数为 500次的时候误差基本已经收敛。

3、FPGA实现

     一种算法要想在实际应用中产生实际效果,就必须研究其具体的实现方式,FPGA作为一种并行处理器,在通信及信号处理领域应用比较广泛,因此,本文还研究了该算法的FPGA实现。该算法应用流水线的思想进行实现,流水线处理思想增大了数据吞吐量,降低了数据的处理延时,可以使得该算法能应用于高速度的通信场合。

  • 卷积模块(conv.v):该模块主要执行输入数据与滤波器权值数据的卷积操作,实现滤波数据输出
  1. `timescale 1ns/1ps
  2. module conv(
  3. // system signals
  4. input clk ,
  5. input rst_n ,
  6. // 输入待滤波数据
  7. input signed [15:0]data_in ,
  8. // 权值数据
  9. input signed [15:0]w0 ,
  10. input signed [15:0]w1 ,
  11. input s
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/787164
推荐阅读
相关标签
  

闽ICP备14008679号