📄 coarse_sync_block.m
字号:
function [coarse_sync_index, corr_overlap] = coarse_sync_block(rx_down,corr_overlap,corr_template,thld,... blocks_per_code_symbol,N,PLOT_DEBUG)% %generate sequence to correlate with% blocks_per_code_symbol = L * TC / (T_INT * N_INT );% corr_template = reshape( ... % repmat(abs(len31_preamble_code(CODE_ID)),blocks_per_code_symbol, 1), ...% 1,31*blocks_per_code_symbol);% % %repeat correlation template G times% corr_template = repmat(corr_template,1,G);corr_tmpl_len = length(corr_template);%do the correlationcorr = conv(rx_down, fliplr(corr_template));%cut out the piece that is usablecorr = corr(corr_tmpl_len:end-corr_tmpl_len+1);%pad the overlap from the last runcorr = [corr_overlap corr];overlap_len = length(corr_overlap);%store the overlap for the next run%determine start of overlapblcl = blocks_per_code_symbol * 31;corr_len = length(corr);overlap_start = max(1,(floor(corr_len/blcl)-(N-1))*blcl+1);corr_overlap = corr(overlap_start:end);%coarse synchronization% %analytical calculation of thld and noise floor, in a real system the noise% %comes from our components, so we know the noise_var and can thus always compute% %these thresholds% noise_floor = noise_var * T_INT * 2 * RX_BW * N_INT * G * ...% blocks_per_code_symbol * 16; %16 is due to the fact that out of the 31 code% %symbols 16 are non-zero% thld = noise_var * chi2inv(THLD_PROBA, (T_INT * 2* RX_BW) * N_INT * G * ...% blocks_per_code_symbol * 16);%downsample correlation for coarse synccorr_sampled = downsample(corr,blocks_per_code_symbol);%pad the end with zeros so that we can do the reshapeif(~isempty(corr_sampled)) corr_sampled = zero_pad_reshape(corr_sampled,31); corr_sampled_mat = reshape(corr_sampled,31,length(corr_sampled)/31); %check against threshold, set values lower than thld to zero corr_sampled_mat(corr_sampled_mat < thld) = 0; [m max_slots] = max(corr_sampled_mat); clear corr_sampled_mat; %free memory %find N consecutive identical values (and make sure they don't correspond to a %slot that was below the thld i.e. that are zero) test_slot_no = -1; %this is to remember which of the 31 slots created the last max no_consecutive = 0; %how many consecutive maxes do we have for this slot corr_sampled_coarse_sync_index = 0;%index into corr_sampled of the sync point for i=1:length(max_slots) current_slot_no = max_slots(i); if(m(i)~= 0) %is not zero if(test_slot_no == current_slot_no) no_consecutive = no_consecutive + 1; else test_slot_no = current_slot_no; no_consecutive = 1; end if(no_consecutive == N) corr_sampled_coarse_sync_index = (i-1)*31 + test_slot_no; break; end else test_slot_no = -1; no_consecutive = 0; end end %coarse sync index is now 0 if not successful, otherwise equals number of %128ns block of starting point in corr_sampled %corr_sampled_coarse_sync_indexelse corr_sampled_coarse_sync_index = 0;endif(corr_sampled_coarse_sync_index ~= 0) %find the corresponding index into corr (the one not sampled) corr_coarse_sync_index = ... (corr_sampled_coarse_sync_index-1)*blocks_per_code_symbol+1; %find the corresponding index into the received signal coarse_sync_index = corr_coarse_sync_index-overlap_len;% - (length(corr_template)-1); if(PLOT_DEBUG) figure plot(corr_sampled) hold on %plot(noise_floor*ones(1,length(corr)),'r') plot(thld*ones(1,length(corr_sampled)),'m') line([corr_sampled_coarse_sync_index corr_sampled_coarse_sync_index],[0 max(corr_sampled)],'Color','y') figure plot(corr) hold on %plot(noise_floor*ones(1,length(corr)),'r') plot(thld*ones(1,length(corr)),'m') line([corr_coarse_sync_index corr_coarse_sync_index],[0 max(corr)],'Color','y') end else coarse_sync_index = 0;end return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -