www.gusucode.com > MIMO系统中ZF破零均衡仿真源码程序 > MIMO系统中ZF破零均衡仿真源码程序/ZF_DFE.m
%-------------------------------------------------------------------------- %Author: Le Phu Thanh lephuthanh@gmail.com %-------------------------------------------------------------------------- %References: %-- Jing Liu,Jian-Kang Zhang,and Kon Max Wong,On the Design of Minimum BER %Linear Space-Time Block Codes for MIMO Systems Equipped With MMSE %Receivers" IEEE TRANS. Sinal Processing, VOL.54, NO.8,AUGUST 2006 %-------------------------------------------------------------------------- %NOTE: %-------------------------------------------------------------------------- clear all; tic mTx=2; %Number of transmit antennas nRx=2; %Number of receive antennas T=1; %Number of time slots N=500; %Number of trials at a given noise level L=mTx*T; nsymb=L*N; %Number of symbol stream No_uncode = T*N; %4QAM Modulation Mary=4; partition = [0]; xcodebook = [-1,1]; %Mary=16; %partition=[ -2,0,2 ]; %xcodebook=[-3,-1,1,3 ]; ycodebook = xcodebook; %Finish 4QAM modulation Es = 2*sum(xcodebook * xcodebook')/size(xcodebook,2); % average symbol energy per antenna snr=0:2:20; for bi=1:length(snr) errZF=0; errZF_DFE=0; ro=10^(snr(bi)/10); for n=1:No_uncode S_out=[]; % Symbol stream output_estimate S_in = randsrc(mTx,1,xcodebook)+ i*(randsrc(mTx,1,ycodebook)); % Symbol stream input S_in1=S_in/sqrt(Es); noise=(randn(nRx,1)+i*randn(nRx,1))/sqrt(2);%Get noise %noise=(randn(nRx,1)+i*randn(nRx,1))*sqrt(Es/2); uncode_H=(randn(nRx,mTx)+i*randn(nRx,mTx))/sqrt(2);%Get Rayleigh channel y=sqrt(ro/mTx)*uncode_H*S_in1 + noise; % At receiver %Demodulate via ZF Equalizer G_ZF = sqrt(mTx/ro)*pinv(uncode_H); S_out=sqrt(Es)*G_ZF*y; % Symbol out of equalizer % Decoder for ii=1:mTx % detector [o,a(ii)]=quantiz(real(S_out(ii)),partition,xcodebook); [o,b(ii)]=quantiz(imag(S_out(ii)),partition,ycodebook); end S_out_dec = a + i*b; err_real= sum (real(S_out_dec)~=real(S_in.')); err_imag= sum (imag(S_out_dec)~=imag(S_in.')); errZF=errZF+err_real+err_imag; %End ZF only %ZF-DFE or V-Blast ---------------------------------------------------------------- H=uncode_H; r=sqrt(Es)*y; G=sqrt(mTx/ro)*pinv(H); for j=1:mTx %i loop for J=1:mTx n(J)=(norm(G(J,:)))^2; end for t=1:j-1 n(k(t))= Inf; end [ Y,I]=min(n); k(j)=I; w=G(I,:); yy=w*r; [ o,n1]=quantiz(real(yy),partition,xcodebook); [ o,n2]=quantiz(imag(yy),partition,ycodebook); b(I)=n1+i*n2; r=r-sqrt(ro/mTx)*H(:,I)*b(I); H(:,I)=0; G=sqrt(mTx/ro)*pinv(H); end % end i loop err_real= sum (real(b)~=real(S_in.')); err_imag= sum (imag(b)~=imag(S_in.')); errZF_DFE=errZF_DFE+err_real+err_imag; end % End ZF-DFE BER(bi)=errZF/(L*N*log2(Mary)); BER_DFE(bi)=errZF_DFE/(L*N*log2(Mary)); end semilogy(snr,BER,'-ob'); hold on; semilogy(snr,BER_DFE,'-*m'); xlabel('SNR(dB)'); ylabel('Bit Error Rate'); legend('ZF','ZF-DFE'); title('Uncode for MIMO system Equipped with ZF/ZF-DFE receivers'); grid on; toc