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

    % vblastpic10.m
%比较ZF-PIC和ZF-OSIC的性能
tx=2;rx=2;L=30000;Modulation='BPSK';
SNR=[20:2:30];
A=randint(tx*L,1);
X=zeros(tx,L);
for k=1:tx
X(k,:)=(-1).^(A(k:tx:end)+1);
end
H=sqrt(1/2)*(randn(rx,tx,L)+i*randn(rx,tx,L));
n=sqrt(1/2)*(randn(rx,L)+i*(randn(rx,L)));
R=zeros(rx,L);
for k=1:L
    R(:,k)=sqrt(1/tx)*H(:,:,k)*X(:,k);
end
%ZF-PIC===================================================================
berzp1=[];
berzp2=[];
  for m=SNR
      m
      snr=10^(m/10);
      R_noised=R+sqrt(1/snr)*n;
      x=[];
      a=zeros(tx*L,1);
      %第一遍检测
      for t=1:L
          r=R_noised(:,t);
          G=pinv(H(:,:,t));
          y=G*r;
          xtemp=(y>=0)-(y<0)+0;
          x=[x,xtemp];
      end
   for k=1:tx
          a(k:tx:end)=(x(k:tx:end)+1)/2;
      end
      [errbit,temp_ber]=biterr(A,a);
      berzp1=[berzp1,temp_ber];   
      %第二遍PIC检测
      xx=[];
      for t=1:L
          r=R_noised(:,t);
          G=pinv(H(:,:,t));
          for k=1:tx
          y(k)=H(:,k,t)'*(r-sqrt(1/tx)*H(:,:,t)*x(:,t)+sqrt(1/tx)*x(k,t)*H(:,k,t));
          end
          xxtemp=(y>=0)-(y<0)+0;
          xx=[xx xxtemp];
      end
      for k=1:tx
          a(k:tx:end)=(xx(k:tx:end)+1)/2;
      end
      [errbit,temp_ber]=biterr(A,a);
      berzp2=[berzp2,temp_ber];
  end
  %ZF-SIC=================================================================
  berzs=[];
  for m=SNR
      m
      snr=10^(m/10);
      R_noised=R+sqrt(1/snr)*n;
      x=[];
      a=zeros(tx*L,1);
      for t=1:L
          r=R_noised(:,t);
          HH=H(:,:,t);
          G=pinv(HH);
          % S表示一个时隙内还未检测的符号的序号的集合
          S=[1:tx];
          xtemp=zeros(tx,1);
          % 逐发射天线进行检测
          for k=1:tx
              % G的在序号集合S的非零元素集合内范数最小的行是wki,它是G的第ki行
              [wki,ki]=minnorm(G,S);
              % 已经检测过的序号清零
              S(ki)=0;
              % 判决统计量y
              y=wki*r;
              % BPSK判决
              xtemp(ki)=1*(y>=0)-1*(y<0)+0;
              % SIC串行干扰抵消
              r=r-sqrt(1/tx)*xtemp(ki)*H(:,ki,t);
              % 将已经检测的信号对应的信道矩阵的列清零
              HH(:,ki)=zeros(rx,1);
              G=pinv(HH);
          end
          x=[x,xtemp];
      end
      for k=1:tx
          a(k:tx:end)=(x(k:tx:end)+1)/2;
      end
      [errbit,temp_ber]=biterr(A,a);
      berzs=[berzs,temp_ber];
  end
  %==========================================================
  figure
  semilogy(SNR,berzp1,'o- b'),hold on
  semilogy(SNR,berzp2,'s- r')
  semilogy(SNR,berzs,'p- g'),grid on
  legend('ZF','ZF-PIC','ZF-SIC')
  xlabel('SNR(dB)');
  ylabel('误比特率');
  title('tx=2,rx=2,ZF-PIC,ZF-OSIC检测性能')