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

📄 main.m

📁 Woven码在TD-SCDMA中的应用仿真程序
💻 M
字号:
    % main
    % to simulation the performance of woven codec under case3  with
    % JD
    
    clear all;
       
    % Write display messages to a text file
    diary woven_sova.txt
    
    % 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');
    
    for nEN = 1:length(EbN0)
        snr=EbN0(nEN) - 13.8;                              % 13.8 is get 10*lg for  C/I = (Eb/No)*((Rc*lg..M)/(B*Q*Tc)),   see 25928-401  P.94
                        % note:  here the snr is refer to Ec/No means chip
                        % and noise radio. All the intercell interference
                        % is modeled as gaussian white noise.
        
        en = 0.5*10^(snr/10);                                           % convert Eb/N0 from unit db to normal numbers
        L_c = 4 * sim_consts.a * en * R; 	                            % reliability value of the channel   
        
        % init parameter in each simulation of one snr
        errs(nEN, 1:sim_consts.niter)  = zeros(1, sim_consts.niter) ;
        nferr(nEN, 1:sim_consts.niter) = zeros(1, sim_consts.niter) ;
        nframe = 0;                                                     % init counter of transmitted blocks
        
        % one snr simulation start
        while (1)
            % info block count
            nframe = nframe + 1 ;                 
            
            % source
            x = randint(1, L_info*sim_consts.enco.k*sim_consts.Lo);  % Random data                  
            
            % woven encodec
            [ en_output alpha]= ...
                woven(x, sim_consts.Lo, sim_consts.Go, sim_consts.Li, sim_consts.Gi);  % encoder output (+1/-1)                          
            
            % rate match
            L_b = 88*sim_consts.cNumber*sim_consts.tsNumber*sim_consts.subFrames;
            en_output(size(en_output,2)+1:L_b) = en_output(size(en_output,2))*ones(1,L_b-size(en_output,2));
            clear L_b;
            
            % interleave 
            sort_output = sorts(en_output, sim_consts.sortT);            
            clear en_output;
            
            % modulation
            for kk=1:length(sort_output)/2
                s_all(kk) = sort_output((kk-1)*2+1) + j*sort_output(kk*2) ;
            end
            clear sort_output;
            
            % through the channel 
            % spread, frame, channel, estimate, JD, deframe and despread       
            L_f = 44*sim_consts.cNumber*sim_consts.tsNumber*sim_consts.subFrames;
            L_sf = 44*sim_consts.cNumber*sim_consts.tsNumber;
            r_all = zeros(L_f,1);
            for fIdx = 1:sim_consts.subFrames                
                s = zeros(L_sf, 1);
                s(:) = s_all((fIdx-1)*L_sf+1:fIdx*L_sf);                
                r_middle= send(s,snr);   % child function, type 'help send' to see the detail
                r_all((fIdx-1)*L_sf+1:fIdx*L_sf) = r_middle(:);  
                clear s r_middle;
            end
            clear L_sf;
            
            % demodulation
            for i=1:L_f
                r_s((i-1)*2+1) = real(r_all(i)) ;
                r_s(i*2) = imag(r_all(i)) ;
            end
            clear L_f;
            
            % deinterleave 
            desort_r = desorts(r_s, sim_consts.sortT);   
            
            % woven decode field
            r = zeros(1,sim_consts.L_o*sim_consts.enco.k*sim_consts.Lo/R);
            r(:) = desort_r(1:sim_consts.L_o*sim_consts.enco.k*sim_consts.Lo/R);
            
            yi = reshape(r, sim_consts.Li, size(r,2)/sim_consts.Li);
            mmm(alpha') = extract(r, sim_consts.Gi, sim_consts.Li);
            yo = reshape( mmm, sim_consts.Lo, sim_consts.L_o * sim_consts.enco.n);
            clear mmm;
       
      %      yo = reshape(extract(r, sim_consts.Gi, sim_consts.Li), sim_consts.Lo, sim_consts.L_o * sim_consts.enco.n);            
            lle_o = zeros(sim_consts.Lo, sim_consts.L_o*sim_consts.enco.n);
            lle_i = zeros(sim_consts.Li, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n/sim_consts.Li);
            ll_i  = zeros(sim_consts.Li, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n/sim_consts.Li);
            ll_o  = zeros(sim_consts.Lo, sim_consts.L_o*sim_consts.enco.n);            
            for iter = 1:sim_consts.niter                
                ll_i(1: sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n) = lle_o(:);
                for num = 1:sim_consts.Li
                    [output_i(num, :)  lle_i(num, :) ] = sovaI(yi(num, :), ll_i(num, :), sim_consts.ti, sim_consts.win, L_c);                     % inner sova decoder
                end
                
                mmm(alpha') = reshape(lle_i, 1, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n);
                lle_i = reshape(mmm,sim_consts.Li, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n/sim_consts.Li);
                clear mmm ;
                ll_o(:) = lle_i(1: sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n); 
                for num = 1:sim_consts.Lo
                    [output_o(num, :)  lle_o(num, :) ] = sovaO(yo(num, :), ll_o(num, :), sim_consts.win );        % outer sova decoder
                end
                mmm = reshape(lle_o,1, sim_consts.Lo*sim_consts.L_o*sim_consts.enco.n);
                lle_o = reshape(mmm(alpha'),sim_consts.Lo, sim_consts.L_o*sim_consts.enco.n);
                clear mmm;
                
                % record the error bit info and error frame bit of each
                % iteraction
                final_bits = zeros(1, L_info*sim_consts.enco.k*sim_consts.Lo);
                final_bits(:) = output_o(1:L_info*sim_consts.enco.k*sim_consts.Lo) ;
                % Number of bit errors in current iteration
                err(iter) = length(find(final_bits>0 ~= x)) ;
                % Count frame errors for the current iteration
                if err(iter) > 0
                    nferr(nEN, iter) = nferr(nEN, iter) + 1 ;
                end   
            end           
            
            % Total number of bit errors for all iterations
            errs(nEN, 1:sim_consts.niter) = errs(nEN, 1:sim_consts.niter) + err(1:sim_consts.niter) ;            
            
            % print the middle simulation info to screen
            if rem(nframe, 3) == 0 | nferr(nEN, sim_consts.niter) == sim_consts.ferrlim | nframe > sim_consts.nframeAll                
                ber(nEN, 1:sim_consts.niter) = errs(nEN, 1:sim_consts.niter)/(L_info*sim_consts.enco.k*sim_consts.Lo*nframe) ;   % Bit error rate                
                fer(nEN, 1:sim_consts.niter) = nferr( nEN, 1:sim_consts.niter ) / nframe ;              % Frame error rate
                
                % Display intermediate results in process  
                fprintf(  '************** Eb/N0 = %5.2f db **************\n', EbN0(nEN) );
                fprintf( 'Frame size = %d  \n', L_info );
                fprintf( '%d frames transmitted, %d frames in error.\n', nframe, nferr( nEN, sim_consts.niter ) );
                fprintf( 'Bit Error Rate (from iteration 1 to iteration %d):\n', sim_consts.niter );
                for i = 1:sim_consts.niter
                    fprintf( '%8.4e    ', ber( nEN, i ) );
                end
                fprintf( '\n' );
                fprintf( 'Frame Error Rate (from iteration 1 to iteration %d):\n', sim_consts.niter ) ;
                for i = 1:sim_consts.niter
                    fprintf( '%8.4e    ', fer( nEN, i ) );
                end
                fprintf( '\n ' );
                fprintf( '***********************************************\n\n' );
                
       %        Save intermediate results 
                save woven_sova EbN0 ber fer
                
                if  errs(nEN, sim_consts.niter) > sim_consts.errAll | nferr(nEN, sim_consts.niter) == sim_consts.ferrlim | nframe > sim_consts.nframeAll 
                    break;
                end                
            end   
            
        end
    end    
    diary off

⌨️ 快捷键说明

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