gusucode.com > matlab通信工程仿真源码(张德丰等编著)程序书籍 > matlab_code/matlab通信工程仿真源码(张德丰等编著)/第10章/IS_95.m

    %数据速率 = 9600 KBps 
clear all
global Zi Zq Zs show R Gi Gq 
show = 0; SD = 0;         % 选择软/硬判决接收 
%主要的仿真参数设置	
BitRate = 9600; ChipRate = 1228800;  
N = 184;  MFType = 1;	 % 匹配滤波器类型升余弦
R = 5;	
%Viterbi生成多项式
G_Vit = [1 1 1 1 0 1 0 1 1; 1 0 1 1 1 0 0 0 1]; 
K = size(G_Vit, 2);L = size(G_Vit, 1); 		
%Walsh矩阵代码
WLen = 64; 
Walsh = reshape([1;0]*ones(1, WLen/2), WLen , 1); 
%Walsh = zeros(WLen ,1); 
%扩频调制PN码的生成多项式
Gi_ind = [15, 13, 9, 8, 7, 5, 0]'; 
Gq_ind = [15, 12, 11, 10, 6, 5, 4, 3, 0]';  
Gi = zeros(16, 1); 
Gi(16-Gi_ind) = ones(size(Gi_ind)); 
Zi = [zeros(length(Gi)-1, 1); 1];    
% I路信道PN码生成器的初始状态 
Gq = zeros(16, 1); 
Gq(16-Gq_ind) = ones(size(Gq_ind)); 
Zq = [zeros(length(Gq)-1, 1); 1]; 	 
% Q路信道PN码生成器的初始状态
%扰码生成多项式
Gs_ind = [42, 35, 33, 31, 27, 26, 25, 22, 21, 19, 18, 17, 16, 10, 7, 6, 5, 3, 2, 1, 0]'; 
Gs = zeros(43, 1); 
Gs(43-Gs_ind) = ones(size(Gs_ind)); 
Zs = [zeros(length(Gs)-1, 1); 1];  		
% 长序列生成器的初始状态
%AWGN信道 
EbEc = 10*log10(ChipRate/BitRate); 
EbEcVit = 10*log10(L); 
EbNo = [-2 : 0.5 : 6.5]; 		%仿真信噪比范围(dB)  
%实现主程序
ErrorsB = []; ErrorsC = []; NN = []; 
if (SD == 1) 
   fprintf('\n SOFT Decision Viterbi Decoder\n\n'); 
else 
   fprintf('\n HARD Decision Viterbi Decoder\n\n'); 
end  
for i=1:length(EbNo) 
   fprintf('\nProcessing %1.1f (dB)', EbNo(i)); 
   iter = 0;	ErrB = 0; ErrC = 0; 
   while (ErrB <300) & (iter <150) 
      drawnow;        
      %+发射机实现
      TxData = (randn(N, 1)>0);        
      % 速率为19.2Kcps
      [TxChips, Scrambler] = PacketBuilder(TxData, G_Vit, Gs); 
      % 速率为1.2288Mcps
      [x PN MF] = Modulator(TxChips, MFType, Walsh);      
      %实现信道代码
      noise = 1/sqrt(2)*sqrt(R/2)*( randn(size(x)) + j*randn(size(x)))*...
10^(-(EbNo(i) - EbEc)/20); 
      r = x+noise;      
      %实现接收机代码 
      RxSD = Demodulator(r, PN, MF, Walsh); %软判决,速率为19.2 Kcps 
      RxHD = (RxSD>0); 		                % 定义接收码片的硬判决
      if (SD)  
        [RxData Metric]= ReceiverSD(RxSD, G_Vit, Scrambler); %软判决
      else 
        [RxData Metric]= ReceiverHD(RxHD, G_Vit, Scrambler); %硬判决
      end     
      if(show) 
         subplot(311); plot(RxSD, '-o'); title('Soft Decisions'); 
         subplot(312); plot(xor(TxChips, RxHD), '-o'); title('Chip Errors'); 
         subplot(313); plot(xor(TxData, RxData), '-o');  
         title(['Data Bit Errors. Metric = ', num2str(Metric)]); 
       end                 
      if(mod(iter, 50)==0) 
         fprintf('.'); 
         save TempResults ErrB ErrC N iter 
      end        
      ErrB = ErrB + sum(xor(RxData, TxData));   
      ErrC = ErrC + sum(xor(RxHD, TxChips));  	  
      iter = iter+ 1; 
   end     
   ErrorsB = [ErrorsB; ErrB]; 
   ErrorsC = [ErrorsC; ErrC]; 
   NN = [NN; N*iter]; 
   save SimData * 
end  
%实现误码率计算 
PerrB = ErrorsB./NN; PerrC = ErrorsC./NN; 
Pbpsk= 1/2*erfc(sqrt(10.^(EbNo/10))); 
PcVit= 1/2*erfc(sqrt(10.^((EbNo-EbEcVit)/10))); 
Pc =   1/2*erfc(sqrt(10.^((EbNo-EbEc)/10))); 
%实现性能仿真显示代码
figure;  
semilogy(EbNo(1:length(PerrB)), PerrB, 'b-*'); hold on; 
xlabel('信噪比/dB'); 
ylabel('误码率');
grid on;