自适应均衡器的原理与实现 |
您所在的位置:网站首页 › 均衡器和滤波器的区别是什么 › 自适应均衡器的原理与实现 |
前言:在数字通信系统中插入一种参数可调的滤波器,以校正和补偿系统特性,减少码间干扰的影响,这种起补偿作用的滤波器称为均衡器。 目录 一、自适应均衡器的原理 1、LMS算法 2、LMS算法的原理 3、符号LMS算法 二、自适应均衡器实现 1、matlab仿真 2、产生测试数据 3、定点数在FPGA中的运算 4、自适应均衡器的verilog实现 三、仿真测试结果 一、自适应均衡器的原理在无线通信系统中,由于通信的信道存在多径效应、信道带宽有限及信道特性本身的不完善等因素,导致数据通过信道时将不可避免地产生码间干扰,从而降低系统的性能,影响通信的质量。自适应均衡器是基于自适应均衡技术的装置,能够基于对信道特性的测量随时调整自身的系数,以适应信道特性的变化,消除码间干扰。 在实现自适应均衡器之前需要了解自适应算法。 1、LMS算法LMS算法(Least Mean Square)根据均方误差准则设计的一种有效算法,它要求均方估计误差达到最小,即 式中, 2、LMS算法的原理LMS算法可以用下面一组公式递推来表示: 式中,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算法只给出梯度迭代的方向,而不具体给出数值,即: 在性能上不如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 |