📄 lms64qam.m
字号:
%在数字通信中使用自适用滤波器实现均衡功能。由于收发信端之间信道的复杂性,
%由于频率选择性和信号的散射性,通常接收端会出现码间干扰(ISI)。本程序中所有的信号
%都用基带信号,在分析系统性能时,通常先分析基带传输性能,然后在分析频带传输时的性能。
%传输信号为16-QAM,combinations of {-3, -1, 1, 3} + j*{-3, -1, 1, 3},绘出该信号的星座图。
%function [lmsber,lmsbertrain]=lms64qam(snr);
function lmsber = lms64qam(snr);
%snr=20;
ntr = 5000;
j = sqrt(-1);
%randn(M,N):产生M行N列个随机数,随机数服从正态分布,均值为零,方差为1。
%sign:如果大于零,为1,如果小于0,为-1,0则为0!
%s = sign(randn(1,ntr)).*(2+sign(randn(1,ntr)))+j*sign(randn(1,ntr)).*(2+sign(randn(1,ntr)));
s = sign(randn(1,ntr)).*(4+2*sign(randn(1,ntr))+sign(randn(1,ntr)))+j*sign(randn(1,ntr)).*(4+2*sign(randn(1,ntr))+sign(randn(1,ntr)));
%plot(s,'o');
%axis([-8 8 -8 8]);
%axis('square');
%xlabel('Re\{s(n)\}');
%ylabel('Im\{s(n)\}');
%title('Input signal constellation');
%信道的模拟。同时考虑信道的频率选择性和散射性,以及噪声,SNR=30db,以脉冲响应表示信道
b = [1 0.7 0.4];
%b = exp(j*pi/5)*[1 0.707 0.4];
a = [1];
% Transmission channel filter
channel = dfilt.df2t(b,a);
% Impulse response
%hFV = fvtool(channel,'Analysis','impulse');
%legend(hFV, 'Transmission channel');
%set(hFV, 'Color', [1 1 1]);
%绘出上述信道的频率响应。
%set(hFV, 'Analysis', 'freq');
%接收信号:信源信号通过信道后,在叠加上高斯噪声
%sig = sqrt(1/16*(4*18+8*10+4*2))/sqrt(1000)*norm(impz(channel));
snrqt=sqrt(10^(snr/10));
sig = sqrt(1/64*(4*2+4*18+4*50+4*98+8*10+8*26+8*50+8*34+8*74))/snrqt*norm(impz(channel));
v = sig*(randn(1,ntr) + j*randn(1,ntr))/sqrt(2);
x = filter(channel,s) + v;
%plot(x,'.');
%xlabel('Re\{x[n]\}');
%ylabel('Im\{x[n]\}');
%axis([-15 15 -15 15]);
%axis('square');
%title('Received signal x[n]');
%set(gcf, 'Color', [1 1 1]);
%训练码,该码收发两端都应该知道。
d = [zeros(1,10) s(1:ntr-10)];
%训练均衡,为了快速收敛,使用传统的最小均方误差(LMS)算法。只使用前面2000个抽样
%值用来估计。当输出信号以16QAM信号为中心时,均衡完成!
%P0 = 100*eye(20);
%lam = 0.99;
%t=cputime;
h = adaptfilt.lms(20,0.0008);%此处必须为20,因为d = [zeros(1,10) s(1:ntr-10)];前面为10个零!
ntrain = 1:2000;
[y,e] = filter(h,x(ntrain),d(ntrain));
%plot(y(1001:2000),'.');
%xlabel('Real');
%ylabel('Image');
%axis([-10 10 -10 10]);
%axis('square');
%title('LMS Equalized signal');
%set(gcf, 'Color', [1 1 1])
%绘出误差信号图,可以看出RLS算法可以有很快的收敛性,并且在第60个抽样时就以及收敛
%semilogy(ntrain,abs(e).^2);
%xlabel('Number ofsamples');
%ylabel('|e[n]|^2')
%title('LMS 训练误差的幅度平方值');
%set(gcf, 'Color', [1 1 1]);
%Decision-directed adaptation(DDA):决策值导向自适用。一旦均衡器收敛了,当没有训练码时,
%对实际数据信号进行Decision-directed判决。
e = [e(1:500) zeros(1,4500)];
h.PersistentMemory = true;%为真则滤波器系数Coefficients在每次滤波后恢复为上一次状态;负责系数保持!
for n=501:5000
yhat = h.Coefficients*[x(n);h.States];%h.states是一个(l-1)*1的矩阵,与x(n)构成一个l*1矩阵
ydd = round((yhat+1+j)/2)*2-1-j;%round返回最近的整数;复数仍然返回复数!
%根据滤波器上一次的状态算出现在时刻的均衡结果,然后再把此时的结果整数化!
%%处理结果:如果0<=a<2,则判为1;如果2<=a<4,则判为3;如果-2<=a<0,则判为-1
if (abs(real(ydd))>7)
ydd = 7*sign(real(ydd)) + imag(ydd);
end
if (abs(imag(ydd))>7)
ydd = real(ydd) + 7*sign(imag(ydd));
end
e(n) = d(n) - yhat;
[yhat,edd] = filter(h,x(n),ydd);%x(n)为输入值,ydd为参考标准值;所以ydd必须为整数
end
%比较一直有训练码下的均衡和训练码/DDA两种情况下的误码率,可以看出一直有训练码方式下的
%性能要优于训练码/DDA方式。但是后一种情况下误码率通常会逐渐的衰减,
%所以总体来讲,两种方式下系统性能相似。
reset(h);
[ytrain,etrain] = filter(h,x,d);
%eetrain=etrain(1:3000);
%n = 1:3000;
%semilogy(n,abs(e),n,abs(eetrain));
%xlabel('number of samples');
%ylabel('|e[n]|^2');
%title('LMS训练与直接判决情况比较');
%legend('训练-直接判决','训练');
%set(gcf, 'Color', [1 1 1]);
%sumtime=cputime-t;
sum=0;
sumtrain=0;
for n=200:5000
%if (abs(berr(n))>=1)
if (abs(e(n))>=1)
sum=sum+1;
end
%if (abs(etrain)>=1)
% sumtrain=sumtrain+1;
%end
end
lmsber=sum/4800;
%lmsbertrain=sumtrain/4800;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -