⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main_ldpc_64k.m

📁 LDPC码在TD-SCDMA系统中的应用仿真程序
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  game is begining
    clear all;
    
    diary 64k_ldpc;
    
        % set global simulation parameters
    set_sim_consts;    
    global sim_consts;
        % init
    EbN0 = sim_consts.EbN0 ;    
       %  R = sim_consts.Ro * sim_consts.Ri ;                         % code rate
       % L_info = sim_consts.L_o - sim_consts.mo ;                   % length to passing into outer encodec
       % printf info to the screen    
    fprintf('\n-----------------------------------------------------------------\n');   
    fprintf('+ + + + Please be patient. Wait a while to get the result. + + + +\n');
    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  生成 H    
    rows=1408; 
    cols=2816; 
 %   h=gen_ldpc(rows,cols);%generates a 100 x 200 H matrix( the IG parity 
                      %check matrix) 
  %  [newh,rearranged_cols]=rearrange_cols(h); 

   % for i=1:rows 
    %   for j=1:rows 
    %      A(i,j)=newh(i,j); 
   %    end 
   % end 
   % for i=1:rows 
   %   for j=rows+1:cols 
   %     B(i,j-rows)=newh(i,j); 
   %   end 
   % end 
   % d=mul_GF2(inv_GF2(A),B); 
   % clear j;
%%%%%%%%%%%%%%%%%%%%%%%%% 生成 H 完成
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 设定 EbN0 序列 
    errs_pernEN=zeros(1,length(EbN0));
    nferr_pernEN=zeros(1,length(EbN0));
    nferr=zeros(1,length(EbN0));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  EbN0 序列   
for nEN = 1:length(EbN0)          
       snr=EbN0(nEN)-9;
       % en = 0.5*10^(snr/10);             % convert Eb/N0 from unit db to normal numbers
       errs_pernEN(nEN)=0;
       nfeer_pernEN(nEN)=0;
       nframe = 0;                                   % init counter of transmitted blocks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一个BER
       % one snr simulation start
    while ((errs_pernEN(nEN) < sim_consts.errAll) &  (nframe < sim_consts.nframeAll))
            % info block count
            nframe = nframe + 1             
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%  信息产生
          s=zeros(1,(cols-rows));
          for i=1:cols-rows 
             s(i)=round(rand); 
          end 
          x=s;
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%  信息产生完毕
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%  编码
          s=s';
   %       d=mul_GF2(inv_GF2(A),B); 
          c=mul_GF2(d,s); 
          u1=c; 
          for i=rows+1:cols 
              u1(i)=s(i-rows); 
          end 
          u=reorder_bits(u1,rearranged_cols);
          en_output=u';
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%  编码结束
     %    en_output=randint(1,2816);   % for test
               % rate match
          %     en_output(703:704) = [en_output(702) en_output(702)];
            
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%  交织
           sort_output = sorts(en_output, sim_consts.sortT);
            
           % modulation
           for kk=1:length(sort_output)/2
                s_all(kk) = (sort_output((kk-1)*2+1)*2-1) + j*(sort_output(kk*2)*2-1); 
           end              
           clear i j;  
            % through the channel 
            % spread, frame, channel, estimate, JD, deframe and despread
            r_all = zeros(1408,1);            
            for fIdx = 1:4
               s = zeros(352, 1);
               s(:) = s_all((fIdx-1)*352+1:fIdx*352);                
               r_middle= send(s,snr);   % child function, type 'help send' to see the detail
               r_all((fIdx-1)*352+1:fIdx*352) = r_middle(:);            
            end
            
            % demodulation
            for i=1:length(sort_output)/2
                r_s((i-1)*2+1) = real(r_all(i)) ;
                r_s(i*2) = imag(r_all(i)) ;
            end
            % desort
            desort_r = desorts(r_s, sim_consts.sortT);   
            %  decode field
            r = zeros(1,2816);
            r(:) = desort_r(1:2816);
            
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 译码           
            No=8/(10^(snr/10));
            amp=1;
            scale(1:length(r))=0.8862;
            
            vhat=decode_ldpc(r,No,amp,h,scale);
            final_bits=extract_mesg(vhat,rearranged_cols);
            final_bits';
            
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 译码结束
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  统计
            err = length(find(final_bits>0 ~= x)); 
            errs_pernEN(nEN)=errs_pernEN(nEN)+err;
            if err>0
               %  nferr(nEN)=nferr(nEN)+1;
             nferr_pernEN(nEN)=nferr_pernEN(nEN)+1;  
            end
         %   nferr_pernEN(nEN)=nferr_pernEN(nEN)+nferr(nEN);
            %    Count frame errors for the current iteration
            %    for i = 1:sim_consts.niter
            %    fprintf( '%8.4e    ', ber( nEN, i ) );
            %    fprintf( '\n ' );
    
     end
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     fprintf(  '************** Eb/N0 = %5.2f db **************\n', EbN0(nEN) );
  %   bits_in=(cols-rows)*nframe;
 %    errs_pernEN(nEN)=errs_pernEN(nEN);
 %    nferr_pernEN(nEN)=nferr_pernEN(nEN);
     ber(nEN) = errs_pernEN(nEN)/((cols-rows)*nframe); 
     fer(nEN) = nferr_pernEN(nEN) / nframe; 
    
  end 
        fprintf('***** ber *****\n');
      fprintf('%6.2e  ', ber(:));
      fprintf('\n');
      fprintf('***** fer *****\n');
      fprintf('%6.2e  ',fer(:));
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  EbN0 序列结束
    semilogy(EbN0,ber,'*-');
    hold on;
    semilogy(EbN0,fer,'o-');
    xlabel('Eb/No in dB');
    ylabel('BER');
    legend('N=2816,R=1/2',3);
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  game is over
    diary off;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -