www.gusucode.com > ZBLAST算法仿真源码程序 > ZBLAST算法仿真源码程序/131014135Pro/vblastpic13.m

    % vblast接收机 QPSK调制,ML检测 慢衰落信道 2发2收以及4发4收(帮houpk:houpk123@126.com)
% Zhaidewei 2007.5.17 
% Email:zeal0502@yahoo.com.cn
% qq:402731924
%初始化====================================================================
clear,clc
tx=2;rx=2;L=50;
Modulation='QPSK';
EbN0=[0:2:10];
B=30000;Ts=1/24300;
% 建立EbN0与SNR之间的换算关系
SNR=EbN0-10*log10(Ts*B);
% 信源A
A=randint(2*tx*L,1);  
% 经过QPSK调制的V-Blast发射矩阵X
%                                             |     a=0   a=1
%  未调制比特ab,QPSK调制星座图选取: sqrt(1/2)*|b=0  1+i  -1+i
%                                             |b=1  1-i  -1-i                                                             
X=zeros(tx,L);
AI=A(1:2:end);
AQ=A(2:2:end);
for k=1:tx
X(k,:)=sqrt(.5)*((-1).^(AI(k:tx:end)+1)+i*((-1).^(AQ(k:tx:end)+1)));
end
% Table
table=[1;1;-1;-1]+i*[1;-1;1;-1];
% 快衰落Rayleigh信道H
H=sqrt(1/2)*(randn(rx,tx)+i*randn(rx,tx));
% 均值为0方差为1的高斯白噪声n
n=sqrt(1/2)*(randn(rx,L)+i*randn(rx,L));
% 未叠加噪声的接收信号R
R=zeros(rx,L);
for k=1:L
    R(:,k)=H*X(:,k);
end
% tx=2,rx=2,MMSE-SIC(ordered)=======================================================
'MMSE-SIC'
 berms2=[];
  for m=SNR
      m
      snr=10^(m/10);
      R_noised=R+sqrt(1/snr)*n;
      x=[];
      for t=1:L
          r=R_noised(:,t);
          HH=H;
          G=pinv(HH);
          S=[1:tx];
          xtemp=zeros(tx,1);
          for k=1:tx
              [wki,ki]=minnorm(G);
              w=inv(HH'*HH+(1/snr)*eye(tx-k+1))*HH';
              y=w(ki,:)*r;
              xtemp(S(ki))=(real(y)>=0)-(real(y)<0)+0+i*((imag(y)>=0)-(imag(y)<0)+0);
              r=r-sqrt(1/2)*xtemp(S(ki))*H(:,S(ki));
              HH(:,ki)=[];
              S(ki)=[];
              G=pinv(HH);
          end
          x=[x,xtemp];
      end
      xi=real(x);
      xq=imag(x);
      ai=zeros(tx,L);
      aq=zeros(tx,L);
      for k=1:tx
          ai(k:tx:end)=(xi(k:tx:end)+1)/2;
          aq(k:tx:end)=(xq(k:tx:end)+1)/2;
      end
      a=zeros(2*tx*L,1);
      a(1:2:end)=ai;
      a(2:2:end)=aq;
      [errbit,temp_ber]=biterr(A,a);
      berms2=[berms2,temp_ber];
  end
  figure
  semilogy(EbN0,berms2,'s- b'),grid on
%tx=2rx=2 ML=================================================================
'ML'
 berml2=[];
  for m=SNR
      m
      snr=10^(m/10);
      R_noised=R+sqrt(1/snr)*n;
      x=[];
      for t=1:L
          r=R_noised(:,t);
          xtemp=zeros(tx,1);
              for p = 1:4
                  for q = 1:4
                      temp((p-1)*4+q) = norm(r-H*sqrt(1/2)*[table(p);table(q)]);
                  end
              end
              [val,ind] = min(temp);
              p = floor((ind-1)/4)+1;
              q = ind-4*(p-1);
              xtemp = [table(p);table(q)];
              x=[x,xtemp];
      end
      xi=real(x);
      xq=imag(x);
      ai=zeros(tx,L);
      aq=zeros(tx,L);
      for k=1:tx
          ai(k:tx:end)=(xi(k:tx:end)+1)/2;
          aq(k:tx:end)=(xq(k:tx:end)+1)/2;
      end
      a=zeros(2*tx*L,1);
      a(1:2:end)=ai;
      a(2:2:end)=aq;
      [errbit,temp_ber]=biterr(A,a);
      berml2=[berml2,temp_ber];
  end
  hold on
  semilogy(EbN0,berml2,'^- k')
  %tx=4,rx=4===============================================================

%初始化====================================================================
tx=4;rx=4;
% 信源A
A=randint(2*tx*L,1);  
% 经过QPSK调制的V-Blast发射矩阵X
%                                             |     a=0   a=1
%  未调制比特ab,QPSK调制星座图选取: sqrt(1/2)*|b=0  1+i  -1+i
%                                             |b=1  1-i  -1-i                                                             
X=zeros(tx,L);
AI=A(1:2:end);
AQ=A(2:2:end);
for k=1:tx
X(k,:)=sqrt(.5)*((-1).^(AI(k:tx:end)+1)+i*((-1).^(AQ(k:tx:end)+1)));
end
% Table
table=[1;1;-1;-1]+i*[1;-1;1;-1];
% 慢衰落Rayleigh信道H
H=sqrt(1/2)*(randn(rx,tx)+i*randn(rx,tx));
% 均值为0方差为1的高斯白噪声n
n=sqrt(1/2)*(randn(rx,L)+i*randn(rx,L));
% 未叠加噪声的接收信号R
R=zeros(rx,L);
for k=1:L
    R(:,k)=H*X(:,k);
end
%tx=4rx=4,MMSE-SIC=========================================================
% MMSE-SIC(ordered)=======================================================
 berms4=[];
 'MMSE-SIC'
  for m=SNR
      m
      snr=10^(m/10);
      R_noised=R+sqrt(1/snr)*n;
      x=[];
      for t=1:L
          r=R_noised(:,t);
          HH=H;
          G=pinv(HH);
          S=[1:tx];
          xtemp=zeros(tx,1);
          for k=1:tx
              [wki,ki]=minnorm(G);
              w=inv(HH'*HH+(1/snr)*eye(tx-k+1))*HH';
              y=w(ki,:)*r;
              xtemp(S(ki))=(real(y)>=0)-(real(y)<0)+0+i*((imag(y)>=0)-(imag(y)<0)+0);
              r=r-sqrt(1/2)*xtemp(S(ki))*H(:,S(ki));
              HH(:,ki)=[];
              S(ki)=[];
              G=pinv(HH);
          end
          x=[x,xtemp];
      end
      xi=real(x);
      xq=imag(x);
      ai=zeros(tx,L);
      aq=zeros(tx,L);
      for k=1:tx
          ai(k:tx:end)=(xi(k:tx:end)+1)/2;
          aq(k:tx:end)=(xq(k:tx:end)+1)/2;
      end
      a=zeros(2*tx*L,1);
      a(1:2:end)=ai;
      a(2:2:end)=aq;
      [errbit,temp_ber]=biterr(A,a);
      berms4=[berms4,temp_ber];
  end
  hold on
  semilogy(EbN0,berms4,'s- r')
%tx=4,rx=4,ML=====================================================================
 berml4=[];
 'ML'
  for m=SNR
      m
      snr=10^(m/10);
      R_noised=R+sqrt(1/snr)*n;
      x=[];
      for t=1:L
          r=R_noised(:,t);
          xtemp=zeros(tx,1);
              for p = 1:4
                  for q = 1:4
                      for pp=1:4
                          for qq=1:4
                          temp((p-1)*64+(q-1)*16+(pp-1)*4+qq) = norm(r-H*sqrt(1/2)*[table(p);table(q);table(pp);table(qq)]);
                          kk=kk+1;
                          end
                      end
                  end
              end
              [val,ind] = min(temp);
              p=floor((ind-1)/64)+1;
              q=floor(((ind-64*(p-1))-1)/16)+1;
              pp=floor(((ind-64*(p-1)-16*(q-1))-1)/4)+1;
              qq=ind-64*(p-1)-16*(q-1)-4*(pp-1);
              xtemp = [table(p);table(q);table(pp);table(qq)];
              x=[x,xtemp];
      end
      xi=real(x);
      xq=imag(x);
      ai=zeros(tx,L);
      aq=zeros(tx,L);
      for k=1:tx
          ai(k:tx:end)=(xi(k:tx:end)+1)/2;
          aq(k:tx:end)=(xq(k:tx:end)+1)/2;
      end
      a=zeros(2*tx*L,1);
      a(1:2:end)=ai;
      a(2:2:end)=aq;
      [errbit,temp_ber]=biterr(A,a);
      berml4=[berml4,temp_ber];
  end
  hold on
  semilogy(EbN0,berml4,'s- g'),grid on
  xlabel('EbN0(dB)');
 ylabel('误比特率');
 title('Vblast ML检测')
 legend('tx=2,rx=2,MMSE-SIC','tx=2,rx=2,ML','tx=4,rx=4,MMSE-SIC','tx=4,rx=4,ML')