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

📄 total_sim_adaptive_blind.m

📁 可實現MIMO-OFDM系統的adaptive_blind功能
💻 M
字号:

%
%  SISO-OFDM Subcarrier-Adaptive
%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [ber, per, throughput, mean_SNRdB, Mode_err] = ...
    total_sim_adaptive_blind(info_byte, Cycle, Coding_Rate, SNR, Model, Doppler_Speed, SNR_Th, sub_in_group, Blind_Detection)

%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%/ %%%%%%%%%%%%%%%%%%%%%

rand('state',0);

sub_per = 0;
sub_mean_SNRdB = zeros(1,Cycle);
sub_ber = zeros(1,Cycle);
sub_CBPS = zeros(1,Cycle);
sub_DBPP = zeros(1,Cycle);
packet_Mode_err = 0;
Num_trans_packet = Cycle;

act_sym = 6; 
MAC_header = MAC_head; % LLC


v0_kmh = Doppler_Speed;
CarrierFrequency_Hz = 5.25e9;
Wavelength_m = 3e8/CarrierFrequency_Hz;
v0_ms        = v0_kmh/3.6;
f_D_Hz       = v0_ms/Wavelength_m;

fid = fopen('mode_est_error.txt','w');
fclose(fid);

  switch(Model)
      case 0          
        Multipath_Delay = 0;
        Multipath_Gain  = 0;
      case 1
        Multipath_Delay = [0 10 20 30 40 50 60 70 80 90 110 140 170 200 240 290 340 390] * 10^(-9);
        Multipath_Gain =   [0.0 -0.9 -1.7 -2.6 -3.5 -4.3 -5.2 -6.1 -6.9 -7.8 -4.7 -7.3 -9.9 -12.5 -13.7 -18.0 -22.4 -26.7];
      case 2
         Multipath_Delay = [0 10 20 30 50 80 110 140 180 230 280 330 400 490 600 730 880 1050] * 10^(-9);
         Multipath_Gain =   [-3.3 -3.6 -3.9 -4.2 0.0 -0.9 -1.7 -2.6 -1.5 -3.0 -4.4 -5.9 -5.3 -7.9 -9.4 -13.2 -16.3 -21.2];
      case 3
          Multipath_Delay = [0 10 20 40 70 100 140 190 240 320 430 560 710 880 1070 1280 1510 1760] * 10^(-9);
          Multipath_Gain =   [-4.9 -5.1 -5.2 -0.8 -1.3 -1.9 -0.3 -1.2 -2.1 0.0 -1.9 -2.8 -5.4 -7.3 -10.6 -13.4 -17.4 -20.9];
      otherwise
          error('Not prepared for this channel model.');
  end
  

ch = rayleighchan(1/(80*10^6), f_D_Hz, Multipath_Delay, Multipath_Gain);
ch.ResetBeforeFiltering = 0;

% ------------ Mode --------------

for Z=0:Cycle

    %Mapping decision
    if Z == 0
        Mode = 3*ones(1,480); % 
        Num_ofdm_sym = cal_symbol_adaptive(info_byte, Mode, Coding_Rate);
    else
        [Mode, SNRdB_each] = criterion2_group(feed_back_CSI, pwr_n, SNR_Th, sub_in_group);
        sub_mean_SNRdB(Z) = mean(SNRdB_each);
        Num_ofdm_sym = cal_symbol_adaptive(info_byte, Mode, Coding_Rate);
    end
   
   
    if ((Num_ofdm_sym >= 1) && (Num_ofdm_sym <= 70))
        source_dat = source_generator_adaptive_code(info_byte, MAC_header, Num_ofdm_sym, Mode, Coding_Rate);
    else
        
        source_dat(1,1) = 'n';
    end

    if char(source_dat(1,1)) == 'n'
        demap_dat = 110*ones(1,Num_ofdm_sym);
        trans_dat = [];
        Num_trans_packet = Num_trans_packet - 1;
    else

       
        coded_dat = conv_encord_adaptive(source_dat, Coding_Rate);


       
        inter_dat = interleave_adaptive_new(coded_dat, Mode);%cmdadd


     
        for I=1:Num_ofdm_sym
            map_dat(:,I) = mapping_adaptive(inter_dat(:,I), Mode);
        end
       
        pilot_add=[zeros(1,Num_ofdm_sym);  ...
            map_dat(1:22,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(23:44,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(45:66,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(67:88,:); ...
            -ones(1,Num_ofdm_sym); ...
            map_dat(89:110,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(111:132,:); ...
            -ones(1,Num_ofdm_sym); ...
            map_dat(133:154,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(155:176,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(177:198,:); ...
            -ones(1,Num_ofdm_sym); ...
            map_dat(199:220,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(221:240,:); ...
            zeros(11,Num_ofdm_sym); ...
            map_dat(241:260,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(261:282,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(283:304,:); ...
            -ones(1,Num_ofdm_sym); ...
            map_dat(305:326,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(327:348,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(349:370,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(371:392,:); ...
            -ones(1,Num_ofdm_sym); ...
            map_dat(393:414,:); ...
            -ones(1,Num_ofdm_sym); ...
            map_dat(415:436,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(437:458,:); ...
            ones(1,Num_ofdm_sym); ...
            map_dat(459:480,:)];



        ifft_dat = ifft(pilot_add, 512);

   
        gi_add = [ifft_dat(449:512,:); ifft_dat];

        trans_dat = reshape(gi_add,576*Num_ofdm_sym,1);

    end






    if (Multipath_Delay==0)
        multipath_add = trans_dat;
    else
        multipath_add = filter(ch, trans_dat);  
    end

  
    signal_power = mean(abs(trans_dat) .* abs(trans_dat)); 
    SNR0 = SNR -10*log10(512/480); 
    noise_add = awgn(multipath_add, SNR0, 10*log10(signal_power), 'dB');
    

       
        gi_rem = synchro_dat(65:576,:);

        
        fft_dat = fft(gi_rem, 512);
        
      
        pilot_rem = rem_pilot(fft_dat);
        rec_pilot = ex_pilot(fft_dat);

    end

    
    
    rec_pream_fft1=fft(noise_add(288+1:800), 512);
    rec_pream_fft2=fft(noise_add(800+1:1312), 512);
    rec_pream_fft_ave = (rec_pream_fft1 + rec_pream_fft2) ./2;


    source_pream_fft=fft(long_pre(128+1:640), 512);


    data_shift = rec_pream_fft_ave ./ (source_pream_fft + 10^(-12));
    feed_back_CSI = rem_pilot(data_shift);
    pilot_h = ex_pilot(data_shift);
    h = feed_back_CSI;

    pwr_n = mean(abs(rec_pream_fft1-rec_pream_fft2).^2)/2;
    

    
    if Z>=1 && char(source_dat(1,1)) ~= 'n'
        Mode_est = mode_estimator_rev2(pilot_rem, h, sub_in_group, act_sym, Mode, SNR_Th, Blind_Detection);
    end

    
  
    if Z>=1 && char(source_dat(1,1)) ~= 'n'
        temp_Mode_err = 0;
        for I=1:480
            if Mode_est(I) ~= Mode(I)
                temp_Mode_err = temp_Mode_err + 1; 
            end
        end

        if sum(temp_Mode_err) == 0
            for I=1:Num_ofdm_sym
                equ_dat(:,I) = pilot_rem(:,I)./h; 
            end

          
            for I = 1:Num_ofdm_sym
                demap_dat(:,I) = soft_demap_adaptive_fast_CSI(equ_dat(:,I), Mode, h, pwr_n);
            end


            deinter_dat = deinterleave_adaptive_new(demap_dat,Mode);

  
            for I=1:Num_ofdm_sym
                viterbi_dat(:,I)=soft_viterbi_adaptive_fast(deinter_dat(:,I), Mode, Coding_Rate);
            end


            sub_ber(Z) = ber_calc(viterbi_dat, source_dat);



            if(sub_ber(Z) ~= 0)
                sub_per = sub_per + 1;
               
           
            end
            
        else % In case of Mode Estimation Error
            packet_Mode_err = packet_Mode_err + 1;
            sub_ber(Z) = 0.5;
          
            sub_per = sub_per + 1;
   
        end
    end

    y_ = filter(ch, ones(1,2000));
    clear source_dat coded_dat inter_dat map_dat synchro_dat equ_dat demap_dat fading_add deinter_dat viterbi_dat;
end

if Num_trans_packet >= 1
    Mode_err = packet_Mode_err/Num_trans_packet;
    ber = sum(sub_ber)/Num_trans_packet;
    per = sub_per/Num_trans_packet;
    CBPS = sum(sub_CBPS)/Num_trans_packet;
    DBPS = Coding_Rate * CBPS;
    throughput = sum(sub_DBPP)/((Num_ofdm_sym*Num_trans_packet*7.2+Cycle*16.4)*10^(-6));  % Mbps 僽儔僀儞僪偺偨傔僔僌僫儖僔儞儃儖側偟
    mean_SNRdB = sum(sub_mean_SNRdB)/Cycle;
else
    Mode_err = 1;
    ber = 1;
    per = 1;
    DBPS = 0;
    throughput = 0;
    mean_SNRdB = sum(sub_mean_SNRdB)/Cycle;
end







⌨️ 快捷键说明

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