![上期讲到PSS阶段频偏估计,包括整数倍频偏估计和小数倍频偏估计,但是未用MATLAB给大家实现,本期用MATLAB实现:function[freq_offet,N_ID_2,frameHead]=PSS_det(rxSig_init,params)%%%%pssThr=25;N=128;root_s...](/templets/3_zixun/picture/199.jpg)
上期讲到PSS阶段频偏估计,包括整数倍频偏估计和小数倍频偏估计,但是未用MATLAB给大家实现,本期用MATLAB实现:function[freq_offet,N_ID_2,frameHead]=PS......
上期讲到PSS阶段频偏估计,包括整数倍频偏估计和小数倍频偏估计,但是未用MATLAB给大家实现,本期用MATLAB实现:
function[freq_offet,N_ID_2,frameHead]=PSS_det(rxSig_init,params)
%
%
%
%
pssThr=25;
N=128;
root_set=[252934];
segL=N/_segNum;
cs_sample_rate=1.92e6;%30.72
IntCFO_set=[-101]*;
corr_result=zeros(3,3,_combin_num,_search_window_len,_segNum);
%%firstcorrwithlocalpsssignal
forIntIdx=1:3
rxSig=rxSig_init.*exp(2*pi*1i*IntCFO_set(IntIdx)*(1:length(rxSig_init))/cs_sample_rate);
forN_ID_2_idx=1:3
pss_local_ifft128=pss_gen(root_set(N_ID_2_idx));
forcombin_idx=1:_combin_num
rxSig_temp=rxSig((combin_idx-1)*5*1920+1:combin_idx*6*1920);
fori_sample=1:_search_window_len
forseg_idx=1:_segNum
rx_temp=rxSig_temp(i_sample+(seg_idx-1)*segL:i_sample-1+seg_idx*segL);
corr_result(IntIdx,N_ID_2_idx,combin_idx,i_sample,seg_idx)=corr_result(IntIdx,N_ID_2_idx,combin_idx,i_sample,seg_idx)+rx_temp*pss_local_ifft128((seg_idx-1)*segL+1:seg_idx*segL)';
%%calpower
corr_result_abs=zeros(3,3,_search_window_len);
forIntIdx=1:3
forN_ID_2_idx=1:3
forcombin_idx=1:_combin_num
fori_sample=1:_search_window_len
corrPower=0;
forseg_idx=1:_segNum
corrPower=corrPower+abs(corr_result(IntIdx,N_ID_2_idx,combin_idx,i_sample,seg_idx));
corrPower=corrPower^2;
corr_result_abs(IntIdx,N_ID_2_idx,i_sample)=corr_result_abs(IntIdx,N_ID_2_idx,i_sample)+corrPower;
%%parposcal
par=zeros(3,3);
pos=zeros(3,3);
maxPower=zeros(3,3);
avgPower=zeros(3,3);
forIntIdx=1:3
forN_ID_2_idx=1:3
sumPower=0;
maxValue=0;
posCurrNID=0;
fori_sample=1:_search_window_len
sumPower=sumPower+corr_result_abs(IntIdx,N_ID_2_idx,i_sample);
ifcorr_result_abs(IntIdx,N_ID_2_idx,i_sample)maxValue
maxValue=corr_result_abs(IntIdx,N_ID_2_idx,i_sample);
posCurrNID=i_sample;
pos(IntIdx,N_ID_2_idx)=posCurrNID;
sumPower=sumPower-maxValue;
avgPowerTemp=sumPower/(_search_window_len-1);
par(IntIdx,N_ID_2_idx)=maxValue/avgPowerTemp;
maxPower(IntIdx,N_ID_2_idx)=maxValue;
avgPower(IntIdx,N_ID_2_idx)=avgPowerTemp;
%%integralmultiplefreqoffsetestimations
parTemp=par.';
[~,p]=max(parTemp(:));
IntIdx=ceil(p/3);
inteFreqOffset=IntCFO_set(IntIdx);
parMaxInt=par(IntIdx,:);
pos=pos(IntIdx,:);
%%calframehead
forN_ID_2_idx=1:3
ifparMaxInt(N_ID_2_idx)pssThr
N_ID_2=N_ID_2_idx;
%%fractionalfreqoffsetestimation
freq_offset_est=0;
_segNum==2
forcombin_idx=1:_combin_num
phase_corr=angle(corr_result(IntIdx,N_ID_2,combin_idx,pos(N_ID_2),1)*corr_result(IntIdx,N_ID_2,combin_idx,pos(N_ID_2),2)');
freq_offet=phase_corr/pi*15e3;
freq_offset_est=freq_offset_est+freq_offet;
freq_offset_est=freq_offset_est/_combin_num;
_segNum==1_combin_num1
forcomidx=1:floor(_combin_num/2)
phase_corr=angle(corr_result(IntIdx,N_ID_2,2*comidx-1,pos(N_ID_2),1)*corr_result(IntIdx,N_ID_2,2*comidx,pos(N_ID_2),1)');
freq_offet=phase_corr/pi*15e3;
fprintf('donotsupportotherpss_segNum%d\n',_segNum);
%%reult
freq_offet=freq_offset_est+inteFreqOffset;
frameHead=(pos(N_ID_2)-1)*16-144-(160+2048+(144+2048)*5)+1;
N_ID_2=N_ID_2-1;
%fprintf('findpss%d%d%f\n',N_ID_2,frameHead,freq_offet);
%a=0;