?? tracksignal.m
字號:
function [diata_dll,diata_fll]=tracksignal(iniphcode,inifd,iniph,snr,Code_Method_flag,Carrier_Method_flag,codew,codeb,carrierw,carrierfllb,carrierpllb)
svnum = 10; %衛(wèi)星號
iniphcode = 120; %生成信號源的碼相位
inifd = 4600; %生成信號源的載波多普勒頻率
iniph = 0; %生成信號源的載波初相位
snr = 0; %生成信號源的信噪比
global time_unit; % 數(shù)據(jù)跳變時間單位
global time; % 數(shù)據(jù)發(fā)送時間
global time_cyc;% 一個完整擴頻碼周期
global fs; % 采樣率
global nn; % 一個完整擴頻周期采樣點數(shù)
global kk; % 數(shù)據(jù)總采樣點
global F_if; % 載波中頻
global CA_freq; % PN碼速率
global tc;
global CA ; % 擴頻碼基瑪
global F_Carrier; % L1波段載波頻率
%%%%%%%%%%%%%%%%%%%%%%%%參數(shù)設(shè)置%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
time = 100*(10^(-3));
time_unit = 20*(10^(-3));
time_cyc = 1*(10^(-3));
fs = 5*(10^6);
nn = time_cyc*fs;
kk = (time/time_cyc)*nn;
F_if = 1.25*(10^6);
F_Carrier = 1575.42*(10^6);
CA_freq = 1.023*(10^6);
%%%%%%%%%%%生成C/A以供使用%%%%%%%%%%
PN = codegen(svnum);
CA = [];
k = 5;
for n = 1:length(PN)
CA((1+k*(n-1)):k*n) = PN(n)*ones(1,k);
end
tc = 1/(k*CA_freq);
loop_time = time/time_cyc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%生成信號源 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Signal_Source是生成的信號源, buffer_bit_data是隨機生成的數(shù)據(jù)位,用于與最后解調(diào)的數(shù)據(jù)進行比對
[Signal_Source,Phase_signal,buffer_bit_data]=CreateSource(iniphcode,inifd,iniph,snr);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%捕獲%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[fd_ac,f_ac_code] = acqu(Signal_Source);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%定義跟蹤中用到的參數(shù)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
IPSum_old = 0.01;
QPSum_old = 0.01;
%%%%%%%%%%碼跟蹤環(huán)濾波器參數(shù)設(shè)置%%%%%%%%%%%%%%
Code_Method_flag=2; %碼跟蹤環(huán)鑒相法選擇標志
diffoffside = 0.5; %碼鑒相時,正負偏移半個碼片
k0 =10^(-6); %碼跟蹤環(huán)鑒相器增益
k1=10^(-3); %碼跟蹤環(huán)NCO增益
%k1 = 50/k0; %碼跟蹤環(huán)NCO增益
codew = 20 %自然圓頻率
codeb = 2 %阻尼系數(shù)
offside = f_ac_code;
theta_code_old = 0;
offside_old = f_ac_code;
CodeErr_old = 0;
Bk_DLL = [];
Track_Code_Buffer =[];
%%%%%%%%%%%載波跟蹤環(huán)濾波器參數(shù)設(shè)置%%%%%%%%%%
Last_Phase = 0;
Control_Buffer = [];
ts = 1/fs; %采樣時間間隔
Carrier_Method_flag =3; %fll,pll,fll->pll的方法選擇標志
dem_flag = 0; %fll->pll的切換標志
add = 0; %fll->pll的切換過程中用到的變量
carrierw = 20 %自然圓頻率
carrierfllb = 0.707 %阻尼系數(shù)
carrierpllb = 0.706
Track_Freq_Buffer = [];
track_dopplar_old = 0;
%FLL環(huán)參數(shù)
FLLinput_old=0;
FLLoutput_old=0;
track_freq_fll = 0;
Sita_fll = 0;
Bk_FLL = [];
%PLL環(huán)參數(shù)
PLLinput_old=0;
PLLoutput_old=0;
track_freq_pll = 0;
Sita_pll = 0;
Bk_PLL = [];
Buffer_Data =[];
adj_buffer = [];
ALL_Buffer_Data = [];
count_buffer = [];
Demodulate_I = [];
Local_Ph_Buffer = [];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%跟蹤循環(huán)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i = 1:1:loop_time
% =================part signal source========= %
Signal = Signal_Source((i-1)*nn+1:i*nn);
% Signalph= Phase_signal((i-1)*nn+1:i*nn);
%==============Local carrier===================%
t = [0:nn-1]*ts;
track_dopplar = fd_ac+track_freq_fll+track_freq_pll;
Track_Freq_Buffer = [Track_Freq_Buffer track_dopplar];
Local_I = cos(2*pi*(F_if+track_dopplar)*t + Last_Phase);
Local_Q = sin(2*pi*(F_if+track_dopplar)*t + Last_Phase);
Iph = 2*pi*(F_if+track_dopplar)*t + Last_Phase;
Local_Ph_Buffer = [Local_Ph_Buffer Iph];
Last_Phase = Last_Phase + 2*pi*(F_if+track_dopplar)*time_cyc; %%上一次積分結(jié)束點的相位
Carrier_I = Local_I;
Carrier_Q = Local_Q;
% =================Create Localcode============== %
ph_code_p = offside;
fd_code_p = track_dopplar;
CA_Code_p = CAcode(ph_code_p,fd_code_p,i);
lc_p = CA_Code_p.*Signal;
ph_code_e = offside+diffoffside;
fd_code_e = track_dopplar;
CA_Code_e = CAcode(ph_code_e,fd_code_e,i);
lc_e = CA_Code_e.*Signal;
ph_code_l = offside-diffoffside;
fd_code_l = track_dopplar;
CA_Code_l = CAcode(ph_code_l,fd_code_l,i);
lc_l = CA_Code_l.*Signal;
% ==========================multiply================================ %
Local_P_I = lc_p.*Carrier_I;
Local_P_Q = lc_p.*Carrier_Q;
Local_E_I = lc_e.*Carrier_I;
Local_E_Q = lc_e.*Carrier_Q;
Local_L_I = lc_l.*Carrier_I;
Local_L_Q = lc_l.*Carrier_Q;
% ========================integration============================= %
IPSum = sum(Local_P_I);
QPSum = sum(Local_P_Q);
IESum = sum(Local_E_I);
QESum = sum(Local_E_Q);
ILSum = sum(Local_L_I);
QLSum = sum(Local_L_Q);
% =======================Code Control==================================
if Code_Method_flag==1
%鑒想器
theta_code = k0*((IESum.^2+QESum.^2)-(ILSum.^2+QLSum.^2));
%碼環(huán)路濾波器
[CodeErr] = CodeloopFilter(codew,codeb,theta_code,theta_code_old,CodeErr_old); %CodeErr是經(jīng)過濾波器輸出的碼相位誤差的估計值
%碼環(huán)NCO
offside=offside_old+60*k1*CodeErr; %碼NCO的輸出
theta_code_old = theta_code; %將當前結(jié)果保存,用于下一個循環(huán)的碼跟蹤
CodeErr_old = CodeErr; %將當前結(jié)果保存,用于下一個循環(huán)的碼跟蹤
offside_old = offside; %將當前結(jié)果保存,用于下一個循環(huán)的碼跟蹤
Bk_DLL = [Bk_DLL theta_code]; %記錄跟蹤過程中的碼環(huán)鑒想器的輸出
Track_Code_Buffer = [Track_Code_Buffer offside]; %記錄跟蹤過程中的碼環(huán)NCO的數(shù)出
elseif Code_Method_flag==2
%鑒想器
theta_code = ((IESum.^2+QESum.^2)-(ILSum.^2+QLSum.^2))/((IESum.^2+QESum.^2)+(ILSum.^2+QLSum.^2));
theta_code =10.^(-3)*(1-sqrt(1-theta_code.^2))/(2*theta_code);
%碼環(huán)路濾波器
[CodeErr] = CodeloopFilter(codew,codeb,theta_code,theta_code_old,CodeErr_old); %CodeErr是經(jīng)過濾波器輸出的碼相位誤差的估計值
%碼環(huán)NCO
offside=offside_old+500*CodeErr; %碼NCO的輸出
theta_code_old = theta_code; %將當前結(jié)果保存,用于下一個循環(huán)的碼跟蹤
CodeErr_old = CodeErr; %將當前結(jié)果保存,用于下一個循環(huán)的碼跟蹤
offside_old = offside; %將當前結(jié)果保存,用于下一個循環(huán)的碼跟蹤
Bk_DLL = [Bk_DLL theta_code]; %記錄跟蹤過程中的碼環(huán)鑒想器的輸出
Track_Code_Buffer = [Track_Code_Buffer offside]; %記錄跟蹤過程中的碼環(huán)NCO的數(shù)出
end
% ====================Carrier control=============================%
if Carrier_Method_flag == 1 %%%%%%%%%%%%%%% fll跟蹤環(huán)路
%鑒想器
real_Q = IPSum_old*QPSum-QPSum_old*IPSum;
real_I = IPSum_old*IPSum+QPSum_old*QPSum;
a=real_Q/real_I;
theta_fll = atan(real_Q/real_I);
Bk_FLL = [Bk_FLL theta_fll];
FLLinput = theta_fll/(2*pi*time_cyc);
%環(huán)路濾波器
FLLoutput = CarrierLoopFilter(carrierw,carrierfllb/2,FLLinput,FLLinput_old,FLLoutput_old);
%FLL環(huán)NCO
Sita_fll = Sita_fll+FLLoutput;
track_freq_fll = -Sita_fll; %FLL環(huán)跟蹤到的多普勒頻率 (由于反正切主值區(qū)間造成的)
FLLinput_old=FLLinput; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
FLLoutput_old=FLLoutput; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
IPSum_old = IPSum; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
QPSum_old = QPSum; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
elseif Carrier_Method_flag == 2 %%%%%%%%%%%%%%%%%%%%%%%costa跟蹤環(huán)路
theta_pll = atan(QPSum/IPSum);
PLLinput = theta_pll/(2*pi*time_cyc);
Bk_PLL = [Bk_PLL theta_pll];
%LoopFilter
PLLoutput = CarrierLoopFilter(carrierw,carrierpllb/2,PLLinput,PLLinput_old,PLLoutput_old);
track_freq_pll = -PLLoutput;
PLLinput_old=PLLinput; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
PLLoutput_old=PLLoutput; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
elseif Carrier_Method_flag == 3 %%%%%%%%%%%%%%%%%%%%fll跟蹤環(huán)路->costa
if dem_flag == 0
real_Q = IPSum_old*QPSum-QPSum_old*IPSum;
real_I = IPSum_old*IPSum+QPSum_old*QPSum;
theta_fll = atan(real_Q/real_I);
FLLinput = theta_fll/(2*pi*time_cyc);
Bk_FLL = [Bk_FLL theta_fll];
%LoopFilter
FLLoutput = CarrierLoopFilter(carrierw,carrierfllb/2,FLLinput,FLLinput_old,FLLoutput_old);;
%NCO
Sita_fll = Sita_fll+FLLoutput;
track_freq_fll = -Sita_fll;
FLLinput_old=FLLinput; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
FLLoutput_old=FLLoutput; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
IPSum_old = IPSum; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
QPSum_old = QPSum; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
elseif dem_flag == 1
theta_pll = atan(QPSum/IPSum);
PLLinput = theta_pll/(2*pi*time_cyc);
Bk_PLL = [Bk_PLL theta_pll];
%LoopFilter
PLLoutput = CarrierLoopFilter(carrierw,carrierpllb/2,PLLinput,PLLinput_old,PLLoutput_old);
track_freq_pll = -PLLoutput;
PLLinput_old=PLLinput; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
PLLoutput_old=PLLoutput; %將當前結(jié)果保存,用于下一個循環(huán)的載波跟蹤
end
end
adj_flag = track_dopplar - track_dopplar_old; %相鄰兩次跟蹤到的多普勒頻率值之差,用以判斷是否FLL跟蹤的頻率已經(jīng)足夠精確,從而轉(zhuǎn)入PLL
track_dopplar_old = track_dopplar;
adj_buffer = [adj_buffer adj_flag];
outdata = sign(real(IPSum));
ALL_Buffer_Data = [ALL_Buffer_Data outdata];
if adj_flag < 1 %看相鄰兩次跟蹤到的多普勒頻率之差是否小于1Hz
add = add+1;
else
add = 0;
end
if add >= 2 %看是否有連續(xù)兩次跟蹤到的多普勒頻率之差小于1Hz,若有,則認為頻率跟蹤已很穩(wěn)定而精確,可以轉(zhuǎn)入PLL
dem_flag = 1;
end
if dem_flag == 1
count_time = i;
count_buffer = [count_buffer count_time];
Buffer_Data = [Buffer_Data outdata]
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%位同步與數(shù)據(jù)解調(diào)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Buffer_Data_out = framecheck2(Buffer_Data,count_buffer); %位同步
l_i_d = time/time_unit;
l_o_d = length(Buffer_Data_out);
l_zeros = l_i_d - l_o_d;
Buffer_Data_out = [zeros(1,l_zeros) Buffer_Data_out];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%計算跟蹤精度%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Track_Code_Buffer;
Track_Freq_Buffer;
l_dll = length(Track_Code_Buffer);
l_fll = length(Track_Freq_Buffer);
diata_dll = sqrt(sum((Track_Code_Buffer(40:l_dll)-iniphcode).^2)/length(Track_Code_Buffer(40:l_dll))); %碼跟蹤環(huán)跟蹤精度
diata_fll = sqrt(sum((Track_Freq_Buffer(40:l_fll)-inifd).^2)/length(Track_Freq_Buffer(40:l_fll))); %載波跟蹤環(huán)的跟蹤精度
%Track_Ph_Buffer = Local_Ph_Buffer-Phase_signal;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%畫圖顯示跟蹤結(jié)果%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(1,2,1);
plot(Track_Code_Buffer);
xlabel('時間(ms)');
ylabel('碼相位跟蹤值');
title('碼跟蹤結(jié)果');
grid on
subplot(1,2,2);
plot(Track_Freq_Buffer);
xlabel('時間(ms)');
ylabel('多普勒頻率跟蹤結(jié)果(Hz)')
title('載波跟蹤結(jié)果');
grid on
figure;
plot([1:length(buffer_bit_data)],buffer_bit_data,'b*',[1:length(Buffer_Data_out)],Buffer_Data_out,'ro');
set(gca,'xtick',[1:1:5]);
set(gca,'xticklabel',{'1','2','3','4','5'});
set(gca,'ytick',[-1:1:1]);
set(gca,'yticklabel',{'-1','0','1'});
xlabel('數(shù)據(jù)位');
ylabel('解調(diào)結(jié)果')
title('數(shù)據(jù)解調(diào)輸出結(jié)果');
legend('數(shù)據(jù)','解調(diào)輸出數(shù)據(jù)');
grid on
% figure;
% plot(Bk_DLL);
% title('Track Code 輸入控制')
% grid on
% figure;
% plot(Track_Ph_Buffer);
% title('Track differ Phase')
% grid on
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -