?? sync_acquisition_tracking_algo2_dab_receiver_nctu.m
字號:
elseif ((energy(startpos) < 50000) && mod(nn2,32) > 0) Null_start_64=startpos-2; else Null_start_64=startpos-1; endelseif (energy(2)<threshold && (energy(1)>threshold)) Null_start_64=startpos-2;else Null_start_64 = 0;end Null_start_64=Null_start_64*32; CoarseTimeOffset=Null_start_64; energy=[]; startpos=0;filter_coeffs_52 = [-0.01150520799654, 0.04662093821552, -0.03077640285271, -0.0231042241465, -0.002163312923775, 0.01228271170455, 0.01666390724314, 0.0122309962864, 0.001921130879403,-0.009613726698264, -0.01729442204924, -0.01680913678051, -0.007257038145782, 0.007988366350245, 0.02198483085216, 0.02680262904334, 0.01759370546702, -0.00420083488149, -0.03021700122233, -0.04715857424595, -0.04210323639071,-0.008325894095887, 0.05110839485772, 0.1229461387852, 0.1874927531747, 0.2256093150281, 0.2256093150281, 0.1874927531747, 0.1229461387852, 0.05110839485772,-0.008325894095887, -0.04210323639071, -0.04715857424595, -0.03021700122233, -0.00420083488149, 0.01759370546702, 0.02680262904334, 0.02198483085216, 0.007988366350245,-0.007257038145782, -0.01680913678051, -0.01729442204924,-0.009613726698264, 0.001921130879403, 0.0122309962864, 0.01666390724314, 0.01228271170455,-0.002163312923775, -0.0231042241465, -0.03077640285271, 0.04662093821552, -0.01150520799654];cos_table=[0.8090 0.3090 -0.3090 -0.8090 -1.0000 -0.8090 -0.3090 0.3090 0.8090 1.0000];sin_table=[0.5878 0.9511 0.9511 0.5878 0.0000 -0.5878 -0.9511 -0.9511 -0.5878 -0.0000];for kk=1:length(cos_table) if cos_table(kk) > 0.9999 cos_table(kk)=0.9999; end if sin_table(kk) > 0.9999 sin_table(kk)=0.9999; endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Acquisition Stage Starts%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sumchk=0; outputmag=0; timing_value=0; for toffset_resolv=0:31 Txr(1,:) = DAB_RX_Frame15(CoarseTimeOffset+1:CoarseTimeOffset+2552*4); for t = 1:length(Txr) I_stream_2048(1,t) = Txr(1,t); end t1=1; for t = 1:length(Txr) I1_stream_2048(1,t) = I_stream_2048(1,t) * cos_table(t1); Q1_stream_2048(1,t) = I_stream_2048(1,t) * sin_table(t1); if mod(t1,10) == 0 t1=1; else t1=t1+1; end end%%%%%%%%%%%%%% direct form fir decimation filter start%%%%%%%%%%%%%%%%%% y_filter_out_I(1,:) = filter(filter_coeffs_52,1,I1_stream_2048(1,:)); y_filter_out_Q(1,:) = filter(filter_coeffs_52,1,Q1_stream_2048(1,:));%%%%%%%%%%%%%% direct form fir decimation filter end %%%%%%%%%%%%%%%%%% m=1; for ii1=1:length(Txr)/4 Time_Dom_Symbol_2048_rx_G11_r(1,ii1)=y_filter_out_I(1,m); Time_Dom_Symbol_2048_rx_G11_i(1,ii1)=y_filter_out_Q(1,m); m=m+4; end for t=1:length(Time_Dom_Symbol_2048_rx_G11_r) Rx(1,t) = complex(Time_Dom_Symbol_2048_rx_G11_r(1,t), -Time_Dom_Symbol_2048_rx_G11_i(1,t)); end Txr1(1,:) = Rx(1,505-toffset_resolv:2048+504-toffset_resolv); %%%%%%%%%%%%%Coffset=>coarse frequency offset estimate%%%%%%%%% for Coffset=-20:20 mm=505; for i=1:2048 bb=mm-1; temp(i)=exp(j*6.28*(Coffset)*(bb/2048)); rx_prsC(i)= temp(i) * Txr1(1,i); mm=mm+1; end rx_prs_2048=fft(rx_prsC(1,:),2048); Autocorr11=rx_prs_2048.*conj(phase_ref_beginning); output=0; for ii=1:2048 output=Autocorr11(ii)+output; end outputmag(toffset_resolv+1,Coffset+21)=abs(output); if sumchk<=outputmag(toffset_resolv+1,Coffset+21) sumchk=outputmag(toffset_resolv+1,Coffset+21); Cooffset=Coffset; timing_value=toffset_resolv; output1=0;sumchk1=0;outputmag1=0; %%%%%%%%%%%%%f_Cooffset=>fine frequency offset estimate%%%%%%%%% for pp=0:24 Autocorr111=rx_prs_2048.*conj(phase_ref_beginning)*exp(j*2*pi*timing_value*0.04*pp/2048); for iii=1:2048 output1=Autocorr111(iii)+output1; end outputmag1(pp+1)=abs(output1); if sumchk1<=outputmag1(pp+1) sumchk1=outputmag1(pp+1); f_Cooffset=0.04*pp; metric = []; %%%%%%%%%%%%%fine timing offset estimate%%%%%%%%% for tloop = -200:200 pramp = exp(-j*2*pi*tloop*[0:2048-1]/2048)'; metric = [metric sum(abs(sum(reshape(Autocorr111.'.*pramp,64,2048/64))))]; % metric computation end plot([-200:200],metric) xlabel('fine time-offset');ylabel('Metric'); end end end endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%aad=CoarseTimeOffset+guard_interval*4-timing_value+2048*4;DAB_RX_Frame17=DAB_RX_Frame15(aad+1-10208:length(DAB_RX_Frame15));for sym = 1:76 I_stream_2048_11(sym,:) = DAB_RX_Frame17(1,(sym-1)*10208+1:(sym)*10208);endfor sym = 1:76 t1=1; for t = 1:length(I_stream_2048_11) I1_stream_2048_11(sym,t) = I_stream_2048_11(sym,t) * cos_table(t1); Q1_stream_2048_11(sym,t) = I_stream_2048_11(sym,t) * sin_table(t1); if mod(t1,10) == 0 t1=1; else t1=t1+1; end endendI_stream_2048_11=[]; %%%%%%%%%%%%%% direct form fir decimation filter start%%%%%%%%%%%%%%%%%%for sym=1:76 y_filter_out_I1(sym,:) = filter(filter_coeffs_52,1,I1_stream_2048_11(sym,:)); y_filter_out_Q1(sym,:) = filter(filter_coeffs_52,1,Q1_stream_2048_11(sym,:));end %%%%%%%%%%%%%% direct form fir decimation filter end %%%%%%%%%%%%%%%%%%for jj=1:76 m=1; for i=1:length(y_filter_out_I1)/4 Time_Dom_Symbol_2048_rx_G11_r11(jj,i)=y_filter_out_I1(jj,m); Time_Dom_Symbol_2048_rx_G11_i11(jj,i)=y_filter_out_Q1(jj,m); m=m+4; endendfor sym=1:76 for t=1:length(Time_Dom_Symbol_2048_rx_G11_r11) Rx_1(sym,t) = complex(Time_Dom_Symbol_2048_rx_G11_r11(sym,t), -Time_Dom_Symbol_2048_rx_G11_i11(sym,t)); endendI1_stream_2048_11=[];Q1_stream_2048_11=[]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% Coarse Frq Offset + fine frequency offset Compensation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%aa=Cooffset+f_Cooffset;for sym=1:76 for i=1:length(Time_Dom_Symbol_2048_rx_G11_r11) bb=i-1; temp=exp(j*6.28*aa*(bb/2048)); Time_Dom_Symbol_2048_rx_G112_track_input(sym,i)= temp * Rx_1(sym,i); endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% Removal of Guard from the Compensated FIC symbols %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%for sym=1:76 for ii=505:1:2552 Time_Dom_Symbol_2048_rx113_track_input(sym,(ii-504))=Time_Dom_Symbol_2048_rx_G112_track_input(sym,ii); endend %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% OFDM Demodulation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%for sym=1:76 Time_Dom_Symbol_2048_rx_fft(sym,:) =fft( Time_Dom_Symbol_2048_rx113_track_input(sym,:));endTime_Dom_Symbol_2048_rx113_track_input=[]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% Demapping %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%for Symbol_count = 1:75 diff_decoded_buffer(Symbol_count,:)= Time_Dom_Symbol_2048_rx_fft(Symbol_count+1,:)./Time_Dom_Symbol_2048_rx_fft(Symbol_count,:); for tt=1:1:1536 x = freq_deinterleaving_mod1(tt); freq_deinterleaved_buffer(Symbol_count,tt) = diff_decoded_buffer(Symbol_count,x); end for tt=1:1:1536 if(((real(freq_deinterleaved_buffer(Symbol_count,tt)))>=0) && ((imag(freq_deinterleaved_buffer(Symbol_count,tt)))>=0)) demapped_buffer(Symbol_count,tt) = 0; punctured_output(Symbol_count,tt) = 0; punctured_output(Symbol_count,tt+1536) = 0; elseif(((real(freq_deinterleaved_buffer(Symbol_count,tt)))>=0) && ((imag(freq_deinterleaved_buffer(Symbol_count,tt)))<0)) demapped_buffer(Symbol_count,tt) = 1; punctured_output(Symbol_count,tt) = 0; punctured_output(Symbol_count,tt+1536) = 1; elseif(((real(freq_deinterleaved_buffer(Symbol_count,tt)))<0) && ((imag(freq_deinterleaved_buffer(Symbol_count,tt)))>=0)) demapped_buffer(Symbol_count,tt) = 2; punctured_output(Symbol_count,tt) = 1; punctured_output(Symbol_count,tt+1536) = 0; else demapped_buffer(Symbol_count,tt) = 3; punctured_output(Symbol_count,tt) = 1; punctured_output(Symbol_count,tt+1536) = 1; end endendTime_Dom_Symbol_2048_rx_fft=[];punctured_output_FIB(1,:) = punctured_output(1,1:2304);punctured_output_FIB(2,:) = [punctured_output(1,2305:3072),punctured_output(2,1:1536)];punctured_output_FIB(3,:) = [punctured_output(2,1537:3072),punctured_output(3,1:768)];punctured_output_FIB(4,:) = punctured_output(3,769:3072); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% Viterbi decoding %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%NO_OF_DATA_BITS = 768;decoder_outputFIB(1,:) = Viterbi_decoder_FIC_BER(punctured_output_FIB(1,:),768);decoder_outputFIB(2,:) = Viterbi_decoder_FIC_BER(punctured_output_FIB(2,:),768);decoder_outputFIB(3,:) = Viterbi_decoder_FIC_BER(punctured_output_FIB(3,:),768);decoder_outputFIB(4,:) = Viterbi_decoder_FIC_BER(punctured_output_FIB(4,:),768); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%% Descrambling %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%for i= 1:1:4 decoder_output(i,:) = DeScrambler(decoder_outputFIB(i,:),NO_OF_DATA_BITS);endcrc_rxed_buff = zeros(1,12); % crc recieved storage buffer.crc_mismatch_counter = 0; % crc mismatch counter.crc_match_counter = 0;crc_mismatch_flag = 0;dab_mode=1; % dummy expression.if dab_mode==1 no_of_fibs=3;elseif dab_mode==2 no_of_fibs=3;elseif dab_mode==3 no_of_fibs=4;elseif dab_mode==4 no_of_fibs=6;endkk=1;decoder_output_packed = zeros([1 96*4]);for i=1:1:NO_OF_DATA_BITS/8 for j=1:8 decoder_output_packed(kk) = bitshift( decoder_output_packed(i) , 1 ); decoder_output_packed(kk) = bitor( decoder_output(1, (i-1)*8 + j ) , decoder_output_packed(kk) ); end kk=kk+1;endfor i=1:1:NO_OF_DATA_BITS/8 for j=1:8 decoder_output_packed(kk) = bitshift( decoder_output_packed(i+96) , 1 ); decoder_output_packed(kk) = bitor( decoder_output(2, (i-1)*8 + j ) , decoder_output_packed(kk) ); end kk=kk+1;endfor i=1:1:NO_OF_DATA_BITS/8 for j=1:8 decoder_output_packed(kk) = bitshift( decoder_output_packed(i+192) , 1 ); decoder_output_packed(kk) = bitor( decoder_output(3, (i-1)*8 + j ) , decoder_output_packed(kk) ); end kk=kk+1;endfor i=1:1:NO_OF_DATA_BITS/8 for j=1:8 decoder_output_packed(kk) = bitshift( decoder_output_packed(i+288) , 1 ); decoder_output_packed(kk) = bitor( decoder_output(4, (i-1)*8 + j ) , decoder_output_packed(kk) ); end kk=kk+1;end%___________________EXTRACTION OF CRC FROM FIB JUST RECEIVED___________________j=1;for i=31:32:4*32*no_of_fibs crc_rxed_buff(j)=decoder_output_packed(i); %extracting first higher byte of crc received. crc_rxed_buff(j)= bitshift(crc_rxed_buff(j),8); %left shift buffer by 8 bits. i=i+1; % incrementing fic data buffer. crc_rxed_buff(j) = bitor(crc_rxed_buff(j),decoder_output_packed(i)); j=j+1;end%_____________________CRC CALCULATION AND COMPARISON__________________________________________________j=1;for i=1:32:no_of_fibs*32*4 temph(j)=crc_calc(i,4*no_of_fibs,decoder_output_packed); if crc_rxed_buff(j) == temph(j) %higher byte crc comparison %comapre the calculated and recived crc j=j+1; crc_match_counter = crc_match_counter+1; else %if crc values doesnt match then increment counter j=j+1; crc_mismatch_counter = crc_mismatch_counter+1; % increment the mismatch counter. crc_mismatch_flag=1; % set crc mismatch flag and abort the process. % break; end i=i-1;end clc;disp(' Output ');disp('CoarseTimeOffset ');disp(CoarseTimeOffset);disp('Fine Time Offset '); disp(timing_value);disp('Coarse Freq Offset '); disp(Cooffset);disp('Fine Freq Offset '); disp(outputphase);disp('No of CRC Mismatch '); disp(crc_mismatch);if crc_mismatch>0 disp('CRC Check Failed');else disp('CRC Check passed');endprog_end = 1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -