www.pudn.com > blast_detection_simulation.rar > bd.m


% 论文仿真原型程序,仿真四种(ZF,ZF-SIC,MMSE,MMSE-SIC) Vblast接收机的检测性能,绘制误比特率~信噪比曲线。 
% Zhaidewei 2007.4.18  
% Email:zeal0502@yahoo.com.cn 
% qq:402731924 
 
% 发端初始化=============================================================== 
% 发射天线数tx,接收天线数rx,发射矩阵长度L(帧长) 
tx=2;rx=2;L=50000; 
Modulation='BPSK'; 
EbN0=[0:1:20]; 
B=30000;Ts=1/24300; 
% 建立EbN0与SNR之间的换算关系 
SNR=EbN0-10*log10(Ts*B); 
% 信源A 
A=randint(tx*L,1); 
% 经过BPSK调制的V-Blast发射矩阵X 
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=randn(rx,L); 
% 未叠加噪声的接收信号R 
R=zeros(rx,L); 
for k=1:L 
    R(:,k)=H(:,:,k)*X(:,k); 
end 
 
% 检测 
 
%ZF======================================================================== 
 
berz=[]; 
% 在不同的信噪比下计算ZF接收机误比特率berz 
  for m=SNR 
      % 每个子信道的平均信噪比为snr的接受信号R_noised 
      snr=10^(m/10); 
      R_noised=R+sqrt(tx/(rx*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(EbN0,berz,'o-- b') 
  
% ZF-SIC(ordered)========================================================== 
berzs=[]; 
  for m=SNR 
      snr=10^(m/10); 
      R_noised=R+sqrt(tx/(rx*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];% S表示一个时隙内还未检测的符号的序号的集合 
          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-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 
  hold on 
  semilogy(EbN0,berzs,'o- r') 
 
 % MMSE==================================================================== 
  berm=[]; 
  for m=SNR 
      snr=10^(m/10); 
      R_noised=R+sqrt(tx/(rx*snr))*n; 
      x=[]; 
      a=zeros(tx*L,1); 
      for t=1:L 
          r=R_noised(:,t); 
          HH=H(:,:,t); 
          xtemp=zeros(tx,1); 
          % MMSE的检测矩阵w 
          w=inv(HH'*HH+(tx/(rx^2*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(EbN0,berm,'s-- k') 
 % MMSE-SIC(ordered)======================================================= 
 berms=[]; 
  for m=SNR 
      snr=10^(m/10); 
      R_noised=R+sqrt(tx/(rx*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,S); 
              S(ki)=0; 
              w=inv(HH'*HH+(tx/(rx^2*snr))*eye(tx))*HH'; 
              y=w(ki,:)*r; 
              xtemp(ki)=1*(y>=0)-1*(y<0)+0; 
              r=r-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); 
      berms=[berms,temp_ber]; 
  end 
  semilogy(EbN0,berms,'s- m'),grid on 
 legend('ZF','ZF-SIC','MMSE','MMSE-SIC'); 
 xlabel('EbN0(dB)'); 
 ylabel('误比特率'); 
 title('blast检测比较')