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

    % QR 算法
% Zhaidewei 2007.4.18 
% Email:zeal0502@yahoo.com.cn
% qq:402731924

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

% 发射天线数tx,接收天线数rx,发射矩阵长度L(帧长)
tx=4;rx=4;L=10000;
Modulation='BPSK';
SNR=[0:2:20];
% 信源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=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========================================================================
'ZF'
berz=[];tic
% 在不同的信噪比下计算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,toc
  figure
  semilogy(SNR,berz,'o- b')
  %QR====================================================================
'QR'
berq=[];tic
  for m=SNR
      m
      snr=10^(m/10);
      R_noised=R+sqrt(1/snr)*n;
      x=[];
      a=zeros(tx*L,1);
      y=zeros(tx,1);
      for t=1:L
          [q r]=qr(H(:,:,t));
          rr=q'*R_noised(:,t);
          
          xtemp=zeros(tx,1);
          for k=[tx:-1:1]
              S=0;
              for i=(k+1):tx
                  S=S+r(k,i)*sqrt(1/tx)*xtemp(i);
              end
              y(k)=(rr(k)-S)/r(k,k);
              xtemp(k)= (y(k)>=0)-(y(k)<0)+0;
          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);
      berq=[berq,temp_ber];
  end,toc
  hold on
  semilogy(SNR,berq,'o- r'),grid on
  title('tx=4,rx=4,Vblast QR分解检测')
  legend('ZF','QR');
 xlabel('SNR(dB)');
 ylabel('误比特率');