MATLAB 环境下ISI 信道仿真及自适应均衡器设计程序说明
一、系统模型
二、ISI 信道仿真及LSM 算法自适应均衡器原理
1、发送端和接收端滤波器的级联和在采样瞬间时的信道可用等效的离散时间FIR 信道滤波器来表示,Xn={0.05 -0.063 0.088 -0.126 -0.25 0.9047 0.25 0 0.126 0.038 0.088},n={-5,-4,…,5}。
2、基于MSE (均方准则)的均衡器抽头系数的自适应算法为:
^^1k k k k c c e y +=+∆
其中^
k c 代表抽头系数向量的估值,∆为迭代过程中的步长参数,k e 为误差信号,k y 代表在瞬时k 包含均衡器中2k+1接收信号值的行向量。
误差信号k e 表示为:k k k e a z =-;k z 为均衡器输出,k a 为已知信号序列。
最初用一已知伪随机序列{k a }在信道上将这个自适应均衡器进行训练。
在解调器端,均衡器用这个已知序列去调整它的系数,一旦初始调节完成,自适应均衡器就从一个训练模式切换到直接判决模式,这时:^k k k e a z =-,式中^k a 是检测器的输出。
为了确保收敛 和 在慢变化信道中好的跟踪能力,选择步长参数的一种经验公式是
15(21)R k P ∆=+ 式中R P 代表接收到的信号加噪声的功率,它可以从接收信号中估计出。
三、仿真结果图
四、结论分析
从结果图中我们可以看出,在信噪比逐渐增大的过程中,未经均衡器均衡的差错率没有明显改善,可知系统中始终存在码间干扰造成的误码;经均衡器均衡后的差错率则有明显改善。
但我们同时也可以看到在信噪比较低情况下,均衡器均衡之后的误码率并没有明显改善,甚至没有未均衡的差错率低,这主要是因为噪声为随机信号,功率大时对源信号影响较大,而且均衡器不易跟踪;当我们把均衡器的步长调低后,跟踪能力增强,差错率降低。
附源程序代码:
main_plot.m
clear;
clc;
echo off;
close all;
N=10000; %指定信号序列长度
info=random_binary(N); %产生二进制信号序列
SNR_ in _dB=8:1:18; %AWGN信道信噪比
for j=1:length(SNR _in_ dB)
[y, len ]=channel(info, SNR _in _dB(j)); %通过既有码间干扰又有白噪声信道
numoferr=0; %初始误码统计数
for i=len+1:N+len, %从第len个码元开始为真实信元
if (y(i)<0), %判决译码
decis=-1;
else
decis=1;
end;
if (decis~=info(i-5)), %判断是否误码,统计误码码元个数
numoferr=numoferr+1;
end;
end;
Pe(j)=numoferr/N; % 未经均衡器均衡,得到的误码率
end;
semilogy(SNR_in_dB,Pe,'red*-'); %未经均衡器,误码率结果图
hold on;
delta_1=0.11; %指定自适应均衡器的步长
delta_2=0.09; %指定自适应均衡器的步长
for j=1:length(SNR_in_dB)
y=channel(info,SNR_in_dB(j)); %通过信道
z=lms_equalizer(y,info,delta_1); %通过自适应均衡器,并设置步长为0.11 numoferr=0;
for i=1:N,
if (z(i)<0),
decis=-1;
else
decis=1;
end;
if (decis~=info(i)),
numoferr=numoferr+1;
end;
end;
Pe(j)=numoferr/N; % 经自适应均衡器均衡后,得到的误码率
end;
semilogy(SNR _in _ dB, Pe ,'blacko-'); %自适应均衡器均衡之后,误码率结果图 hold on;
for j=1:length(SNR_in_dB)
y=channel(info,SNR_in_dB(j)); %通过信道
z=lms_equalizer(y,info,delta_2); %通过自适应均衡器,并设置步长为0.09 numoferr=0;
for i=1:N,
if (z(i)<0),
decis=-1;
else
decis=1;
end;
if (decis~=info(i)),
numoferr=numoferr+1;
end;
end;
Pe(j)=numoferr/N; % 经自适应均衡器均衡后,得到的误码率
end;
semilogy(SNR_in_dB,Pe,'blue.-'); %自适应均衡器均衡之后,误码率结果图
hold on;
xlabel('SNR in dB');
ylabel('Pe');
title('ISI信道自适应均衡系统仿真');
legend('未经均衡器均衡','经自适应均衡器均衡,步长detla=0.11',...
'经自适应均衡器均衡,步长detla=0.09');
random_binary.m
%产生二进制信源随机序列
function [info]=random_binary(N)
if nargin == 0, %如果没有输入参数,则指定信息序列为10000个码元
N=10000;
end;
for i=1:N,
temp=rand;
if (temp<0.5),
info(i)=-1; % 1/2的概率输出为-1
else
info(i)=1; % 1/2的概率输出为1
end
end;
channel.m
%模拟既有码间干扰又有高斯白噪声的信道
function [y,len]=channel(x,snr_in_dB)
SNR=exp(snr_in_dB*log(10)/10); %信噪比真值转换
sigma=1/sqrt(2*SNR); %高斯白噪声的标准差
%指定信道的ISI参数,可以看出此信道质量还是比较差的
actual_isi=[0.05 -0.063 0.088 -0.126 -0.25 0.9047 0.25 0 0.126 0.038 0.088];
len_ actual _isi=(length(actual_isi)-1)/2;
len=len_actual_isi;
y=conv(actual_isi,x); %信号通过信道,相当于信号序列与信道模型序列作卷积
%需要指出,此时码元序列长度变为N+len-1,译码时我们从第len个码元开始到N+len个结束
for i=1:2:size(y,2),
[noise(i) noise(i+1)]=gngauss(sigma); %产生噪声
end;
y=y+noise; %叠加噪声
gngauss . m
%产生高斯白噪声
function [gsrv1,gsrv2]=gngauss(m,sgma)
if nargin == 0, %如果没有输入实参,则均方为0,标准差为1
m=0; sgma=1;
elseif nargin == 1, %如果输入实参为1个参数,则标准差为输入实参,均值为0 sgma=m; m=0;
end;
u=rand;
z=sgma*(sqrt(2*log(1/(1-u))));
u=rand;
gsrv1=m+z*cos(2*pi*u);
gsrv2=m+z*sin(2*pi*u);
lm _equalizer .m
%LSM算法自适应滤波器实现
function [z]=lms_equalizer(y,info,delta)
estimated_c=[0 0 0 0 0 1 0 0 0 0 0]; %初始抽头系数
K=5;
for k=1:size(y,2)-2*K,
y_k=y(k:k+2*K); %获取码元,一次11个
z_k=estimated_c*y_k'; %各抽头系数与码元相乘后求和
e_k=info(k)-z_k; %误差估计
estimated_c=estimated_c+delta*e_k*y_k; %计算校正抽头系数
z(k)=z_k; %均衡后输出的码元序列
end;。