自适应均衡器的原理与实现

您所在的位置:网站首页 均衡器和滤波器的区别是什么 自适应均衡器的原理与实现

自适应均衡器的原理与实现

2024-07-17 09:14| 来源: 网络整理| 查看: 265

前言:在数字通信系统中插入一种参数可调的滤波器,以校正和补偿系统特性,减少码间干扰的影响,这种起补偿作用的滤波器称为均衡器。

目录

一、自适应均衡器的原理

1、LMS算法

2、LMS算法的原理

3、符号LMS算法

二、自适应均衡器实现

1、matlab仿真

2、产生测试数据

3、定点数在FPGA中的运算

4、自适应均衡器的verilog实现

三、仿真测试结果

一、自适应均衡器的原理

在无线通信系统中,由于通信的信道存在多径效应、信道带宽有限及信道特性本身的不完善等因素,导致数据通过信道时将不可避免地产生码间干扰,从而降低系统的性能,影响通信的质量。自适应均衡器是基于自适应均衡技术的装置,能够基于对信道特性的测量随时调整自身的系数,以适应信道特性的变化,消除码间干扰。

在实现自适应均衡器之前需要了解自适应算法。

1、LMS算法

LMS算法(Least Mean Square)根据均方误差准则设计的一种有效算法,它要求均方估计误差达到最小,即

\varepsilon _{n} = E[e_{n}^{2}] = min

式中,e_{n} = y_{dn} - \hat{y}_{dn} = y_{dn} - f(X)

2、LMS算法的原理

LMS算法可以用下面一组公式递推来表示:

                                                ​​​​​​​        ​​​​​​​        y(n) = W^{H}(n)X(n)

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        e(n) = d(n) - y(n)

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​W(n+1) = W(n) + 2uX(n)e^{*}(n)

式中,W(n)为滤波器系数向量,也称权值;X(n)是输入信号组成的一组向量;y(n)是输出信号;d(n)是期望信号;e(n)是误差信号;u是加权向量更新时的步长因子,u越大,算法收敛越快,但同时收敛后的误差信号也越大;u越小,则算法的收敛速度越慢,但同时收敛后的误差信号也相应减小,稳态性能更好。

图1 LMS算法的一般实现结构

如果所有运算均串行执行,则完成一次权值更新需要2N次乘法运算、2N+1次加减法运算和N次移位运算。又因为LMS算法本身是严格的闭环系统,每次权值更新均需要在一个数据周期内完成,因此FPGA的系统时钟频率需要远高于数据速率,这对FPGA的时钟要求很高。

3、符号LMS算法

LMS算法的步骤虽然不能减少,但对滤波器系数更新的运算可以简化。符号LMS算法只给出梯度迭代的方向,而不具体给出数值,即:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        y(n) = W^{H}(n)X(n)

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        e(n) = d(n) - y(n)

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        W(n+1) = W(n) + uX(n)sign[e^{*}(n)]

在性能上不如LMS算法稳定,且误差相对较大,但运算速度增加、运算量减小并节约了硬件资源。

二、自适应均衡器实现 1、matlab仿真

自适应均衡器的性能仿真主要分为两个方面:相同多径干扰条件下信噪比与系统性能改善情况,以及相同信噪比条件下多径干扰与系统性能改善情况。

Matlab代码如下:

len = 20000;    Tlen = 2000;    step = 1/128;   s = zeros(1,len);   s1 = zeros(1,len);  x = zeros(1,N);     w = ones(1,N);     s = randsrc(1,len); s1(2:len) = s(1:len-1); p = 0.1; SNR = [0:10]; for db = 1:length(SNR)     s2 = sqrt(1-p)*s + sqrt(p)*s1;         s3 = awgn(s2,db,'measured');     for i=N:len         x(1:N) = s3(i:-1:i-N+1);            y(i) = x*w';                       e(i) = s(i-3) - y(i);               w = w + 2*step*sign(x)*e(i)';         if y(i)>0             y1(i) = 1;         else             y1(i) = -1;         end         if s3(i)>0             y2(i) = 1;         else             y2(i) = -1;         end     end    errornum1 = sum(y1(Tlen:end)~=s(Tlen-3:end-3));     errornum2 = sum(y2(Tlen:end)~=s(Tlen:end));    ber1(db) = errornum1/(len-Tlen);    ber2(db) = errornum2/(len-Tlen); end subplot(121); semilogy(SNR,ber1,'+-',SNR,ber2,'-'); xlabel('信噪比(SNR)');ylabel('误码率');title('信噪比与误码率的关系(P=0.1)'); legend('有均衡器','无均衡器'); db=10; p=[0:0.05:1]; for m=1:length(p)     s2=sqrt(1-m*0.05)*s+sqrt(m*0.05)*s1;     s3=awgn(s2,db,'measured');     for i=N:len         x(1:N)=s3(i:-1:i-N+1);         y(i)=x*w';        e(i)=s(i-3)-y(i);         w=w+2*step*sign(x)*e(i)';         if y(i)>0             y1(i)=1;         else             y1(i)=-1;         end         if s3(i)>0             y2(i)=1;         else             y2(i)=-1;         end     end     errornum1=sum(y1(Tlen:end)~=s(Tlen-3:end-3));     errornum2=sum(y2(Tlen:end)~=s(Tlen:end));     ber3(m)=errornum1/(len-Tlen);     ber4(m)=errornum2/(len-Tlen); end subplot(122); semilogy(p,ber3,'+-',p,ber4,'-'); xlabel('多径损耗(P)');ylabel('误码率');title('多径损耗因子与误码率的关系 (SNR=10dB)'); legend('有均衡器 ','无均衡器');

图2 自适应均衡器对系统性能改善关系图

2、产生测试数据

首先用matlab产生测试数据,将数据保存进txt文件中,利用modelsim仿真读取测试数据,再将仿真结果写入外部文件中,最后再matlab中对比FPGA结果和仿真结果。

Matlab代码如下:

len = 2000;        step = 1/128;      N = 7;             B = 16;      p = 0.1;            SNR = 10;          s = randsrc(1,len); s1 = zeros(1,len);  s1(2:len) = s(1:len-1); s2 = sqrt(1-p)*s + sqrt(p)*s1;  s3 = awgn(s2,SNR,'measured');  maxs3 = max(abs(s3));   maxs = max(abs(s)); m = max(maxs3,maxs)*1; s3 = s3/m; s = s/m; x = zeros(1,N);  w = ones(1,N);     Mw = 0;Me = 0;    for i=N:len     x(1:N) = s3(i:-1:i-N+1);     y(i) = x*w';     e(i) = s(i-3) - y(i);     w = w + 2*step*sign(e(i)')*x;     if max(abs(w))>Mw         Mw = max(abs(w));          end     if max(abs(e))>Me         Me = max(abs(e));          end end fid =fopen('D:matlab\s_in.txt','w');   for k=1:length(s_16)     s_16_Bin = dec2bin(s_16(k) + (s_16(k)


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3