sym_timing.m
上传用户:gzcxg999
上传日期:2021-07-15
资源大小:190k
文件大小:2k
源码类别:

matlab例程

开发平台:

CHM

  1. function [timed_sym , err_sym_timing] = sym_timing( coarse_freq_out ,N_subc,PrefixRatio,N_sym,N_tran_sym,known_training,...
  2.     Window2 ,TimingAhead, N_Rx_ant,TurnOn )
  3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  4. % 和已知的序列求相关, 得到符号定时位置
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6. if TurnOn
  7.     
  8.     % 得到已知的训练序列的时域样点值
  9.     len_ofdm_sym = (N_subc + N_subc*PrefixRatio);
  10.     syn_frame = sqrt(N_subc) * ifft( fftshift( known_training , 1 ) );
  11.     cp = syn_frame(N_subc - N_subc*PrefixRatio + 1:N_subc ,:,:);
  12.     training_frame = [cp;syn_frame];
  13.     
  14.     % 只是单发送天线情况,多发送天线使用什么序列??
  15.     training_frame = reshape(training_frame,[1, len_ofdm_sym*N_tran_sym ]);  
  16.     
  17.     for ant = 1: N_Rx_ant
  18.         recv_tmp = coarse_freq_out(:,:,ant);
  19.         
  20.         training_timing = training_frame( 1, len_ofdm_sym + 1:len_ofdm_sym + Window2 );
  21.         
  22.         % 和已知的序列求相关,得到符号定时位置的估计
  23.         
  24.         % 搜索第二个OFDM符号, 开始搜索的位置是len_ofdm_sym*3/4, 结束搜索的位置len_ofdm_sym*5/4  
  25.         cnt = 1;
  26.         start_sample = len_ofdm_sym*3/4;
  27.         end_sample = len_ofdm_sym*5/4;
  28.         for start_idx = start_sample:end_sample      
  29.             correlation(cnt) = sum( (recv_tmp(start_idx : start_idx + Window2 - 1).*conj(training_timing)) );
  30.             cnt = cnt + 1;
  31.         end          
  32.         [max_value max_idx] = max(correlation); 
  33.         timing_idx = max_idx + start_sample - 1;    % 最佳定时值: len_ofdm_sym + 1
  34.         
  35.         idx_cnt(ant) = timing_idx - TimingAhead;         
  36.         
  37.     end
  38.     
  39.     % 计算得到多条天线的加权定时位置
  40.     idx = sum(idx_cnt)/N_Rx_ant;
  41.     
  42.     % 定时截取
  43.     timed_sym = coarse_freq_out( 1, idx :idx + (N_sym + N_tran_sym - 1)*len_ofdm_sym - 1 , :);
  44.     
  45.     % 计算定时误差的样点数
  46.     err_sym_timing = ( len_ofdm_sym + 1) - idx ;
  47.     
  48. else
  49.     
  50.     timed_sym = coarse_freq_out( 1, N_subc*(1+PrefixRatio) + 1:N_subc*(1+PrefixRatio)*(N_sym + N_tran_sym), :);
  51.     err_sym_timing = 0;
  52.     
  53. end