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

    % 论文仿真原型程序,仿真四种(ZF,ZF-SIC,MMSE,MMSE-SIC) Vblast接收机的检测性能,绘制误比特率~信噪比曲线。
% Zhaidewei 2007.4.18 (2007-5-20修正版)
% Email:zeal0502@yahoo.com.cn
% qq:402731924

% 发端初始化===============================================================

% 发射天线数tx,接收天线数rx,发射矩阵长度L(帧长)
tx=2;rx=2;L=4000;
Modulation='BPSK';
SNR=[0:2:20];
A=randint(tx*L,1);
X=zeros(tx,L);
for k=1:tx
X(k,:)=(-1).^(A(k:tx:end)+1);
end

% 信道传输=================================================================

% 快衰落Rayleigh信道H
H=sqrt(1/2)*(randn(rx,tx,L)+i*randn(rx,tx,L));
% 均值为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)=sqrt(1/tx)*H(:,:,k)*X(:,k);
end

% 检测=====================================================================

%ZF========================================================================
disp('berz');
berz=[];
  % 在不同的信噪比下计算ZF接收机误比特率berz
  for m=SNR
      m
      % 每个子信道的平均信噪比为snr的接受信号R_noised
      snr=10^(m/10);
      R_noised=R+sqrt(1/snr)*n;
      x=[];
      a=zeros(tx*L,1);
      % 逐时隙对接收符号矢量进行检测,合并得到一帧发射矩阵X的估计x
      for t=1:L
          r=R_noised(:,t);
          % 迫零矩阵G
          G=pinv(H(:,:,t));
          y=G*r;
          xtemp=(y>=0)-(y<0)+0;
          x=[x,xtemp];
      end
      % 从x求A的估计a
      for k=1:tx
          a(k:tx:end)=(x(k:tx:end)+1)/2;
      end
      % 比较A和a计算错值率temp_ber
      [errbit,temp_ber]=biterr(A,a);
      berz=[berz,temp_ber];
  end
  figure
  semilogy(SNR,berz,'o- b')
 
% ZF-SIC(ordered)==========================================================
disp('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
              [wki,ki]=minnorm(G);
              y=wki*r;
              xtemp(S(ki))=1*(y>=0)-1*(y<0)+0;
              r=r-sqrt(1/tx)*xtemp(S(ki))*H(:,S(ki),t);
              HH(:,ki)=[];
              S(ki)=[];
              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
  hold on
  semilogy(SNR,berzs,'o- g')

 % MMSE====================================================================
 disp('MMSE')
  berm=[];
  berpl={};
  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);
          xtemp=zeros(tx,1);
          w=inv(HH'*HH+(1/snr)*eye(tx))*HH';
          y=w*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);
      berm=[berm,temp_ber];
  end
  semilogy(SNR,berm,'*- r')
 % MMSE-SIC(ordered)=======================================================
 disp('MMSE-SIC')
 berms=[];
  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=[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))=(y>=0)-(y<0)+0;
              r=r-sqrt(1/tx)*xtemp(S(ki))*H(:,S(ki),t);
              HH(:,ki)=[];
              S(ki)=[];
              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);
      berms=[berms,temp_ber];
  end
  semilogy(SNR,berms,'s- m'),grid on
  %理论Rayleigh============================================================
 B=30000;Ts=1/24300;SNR+10*log10(Ts*B); 
 ebn0=10.^((SNR+10*log10(Ts*B))/10);
  ber_bpsk_rayleigh=1/2*(1-sqrt(ebn0./(1+ebn0)));
  hold on,semilogy(SNR,ber_bpsk_rayleigh,'x- c')
  %标记====================================================================
 legend('ZF','ZF-SIC','MMSE','MMSE-SIC','Rayleigh fading');
 xlabel('SNR(dB)');
 ylabel('误比特率');
 title('tx=2,rx=2时ZF,ZF-SIC,MMSE,MMSE-SIC接收机性能比较')