📄 main.asv
字号:
%该程序是加入注水和旋转矩阵的闭环V-BLAST的性能仿真、4发4收、16QAM调制、采用CL和ZF-VBLAST两种解码;
clc;
clear;
ss=[-3,-1,1,3];
%ss = [-1,1];
%16QAM的符号集;
maxlen=length(ss);
c=5000000000;
m = 4;
signal_power=10*m;
%signal_power=2*m;
nT=m;
nR=m;
Lm=input('请输入短帧数: ');
%SNR_num=input('请输入信噪比的取值个数: ');
for ii=1:maxlen
for jj=1:maxlen
x((ii-1)*maxlen+jj)=ss(ii)+ss(jj)*j;
a((ii-1)*maxlen+jj,:)=dec2bin((ii-1)*maxlen+jj-1,maxlen);
end;
end;
%旋转矩阵
M4 = [0.2012 0.3255 -0.4857 -0.7859;-0.3255 0.2012 0.7859 -0.4857;0.4857 0.7859 0.2012 0.3255;-0.7859 0.4857 -0.3255 0.2012];
for pp=1:Lm %确定短帧数
%随机生成输入符号
for jj=1:m
n1=1+floor(maxlen*rand);
n2=1+floor(maxlen*rand);
x_symbol(jj,pp)=ss(n1)+ss(n2)*j;
end;
%随机生成信道特征矩阵
M(:,:,pp)=randn(nR,nT)/sqrt(2)+j*randn(nR,nT)/sqrt(2);
M_size1=size(M,1)
M_size2=size(m,2)
[U,S,V] = svd(M(:,:,pp));
%计算注水系数
p(:,:,pp) = waterfilling4x4(Lm,8, M, pp, 4);
q(:,:,pp) = sqrt(p(:,:,pp))
%DAST编码
for ii = 1:size(M(:,:,pp),1)
M_in1((ii-1)*size(M(:,:,pp),2)+1:ii*size(M(:,:,pp),2),:,pp) = diag(M(ii,:,pp));
end;
M_in2(:,:,pp)=M_in1(:,:,pp);%等价信道矩阵
[u,s,v]=svd(M_in2(:,:,pp));
%开环的信道模型
y(:,pp)=M(:,:,pp)*x_symbol(:,pp);
%闭环的等效信道模型
WM2(:,:,pp) = M(:,:,pp)*V*q(:,:,pp)*M4;
Wy2(:,pp) = WM2(:,:,pp)*x_symbol(:,pp);
%加入DAST编码的闭环信道模型
WM3(:,:,pp)=M_in2(:,:,pp)*v*q(:,:,pp)*M4;
Wy3(:,pp) = WM3(:,:,pp)*x_symbol(:,pp);
end;
%星座映射
x_bit=symbol2bit(x_symbol,x,a);
%--------------------解码部分--9--------------
h1=waitbar(0,'please wait for decoding in one SNR...');
%加白噪声
%kk为信噪比取值
kk = 8;
snr=(kk-1)*2;
%snrf(kk)=snr(kk)+10*log10(2);
snr_lin=10^(snr/10);
noise_power=signal_power/snr_lin;
noise_std=sqrt(0.5*noise_power);
%randn('state',11);
noise1=(randn(4*m,Lm)+j*randn(4*m,Lm))*noise_std;
noise=(randn(m,Lm)+j*randn(m,Lm))*noise_std;
r_in=y+noise; %开环系统的接收信号
W2r_in = Wy2 + noise; %闭环系统的接收信号
W3r_in = Wy3 + noise1; %加入DAST信道编码的接收信号
%v-blast decode
for pp=1:Lm
uu1(pp,:)=VBLAST(r_in(:,pp),M(:,:,pp),m,ss); %开环系统ZF-VBLAST解码
u1(pp,:)=CL_complex(r_in(:,pp),M(:,:,pp),ss,c); %开环系统CL解码
u2(pp,:)=CL_complex(W2r_in(:,pp),WM2(:,:,pp),ss,c); %闭环系统解码
%uu2(pp,:)=VBLAST(W2r_in(:,pp),WM2(:,:,pp),m,ss);
u3(pp,:)=CL_complex(W3r_in(:,pp),WM3(:,:,pp),ss,c); %加入DAST编码的闭环系统解码
end;
%u1 = mean(u1,1);
%u2 = mean(u2,1);
%u3 = mean(u3,1);
%三种情况的误比特率
err1=err_count(u1,x,a,x_bit)
%err1=err_count(uu1,x,a,x_bit)
err2=err_count(u2,x,a,x_bit)
err3=err_count(u3,x,a,x_bit)
%waitbar(kk/SNR_num);
%end;
close(h1);
%semilogy(snr,err1,'gs-');
%hold on;
%semilogy(snr,err2,'r*-');
hold on;
%semilogy(snr,err3,'b*-');
xlabel('符号信噪比');
ylabel('误比特率');
title('16QAM k=4');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -