⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pn_phase_trace.m

📁 包括载波跟踪和伪码相位跟踪
💻 M
字号:
%
% 本程序用于实现扩频系统信号跟踪中,码相位的跟踪
% 输入信号为,载波锁定之后的多普勒频率和码相位
% 目前实际多普勒频率1000,相位952
function Catched = PN_Phase_Trace(fd_estimate, Correl_Peak_location_real)

% 获取系统参数
[code_cycle,SNR,Ts,T,T_interp,fi,M,N,fd,f0,delay_time,fd_estimate_init,sigma_n,fs,Bandwidth,dot_insert,coef,coef_mod,B,A1]=set_parameter;

%%%%产生接受中频信号伪码,抽头为1,8
code_phase=[1,8];
[inputcode]=code_gen(code_phase);   % 1023大小的GOLD伪码
%%%%本地伪码
native_code=inputcode;
inputcode_2=[native_code,native_code];
EmulateIndex = 0;
k = 0;

half_dot_insert = dot_insert/2;

ThisPN = zeros(1, N);   % 本次即时码
EarlyPN2 = zeros(1, N); % 超前码
LagPN2 = zeros(1, N);   % 滞后码
const4 = fix(N/(4*1023));      % 超前、滞后1/4,需要移动的抽样点
const8 = fix(N/(8*1023));      % 超前、滞后1/8,需要移动的抽样点,当采样为5808点时,无法采用

Correl_Peak_location_real = Correl_Peak_location_real*5808/1023;

while (1)

    % 模拟输入的中频信号
    EmulateIndex = EmulateIndex + 1;
    [signal,signal_noise]=SignalGenerator(EmulateIndex,inputcode,fs,Ts,fi,delay_time,fd,SNR,Bandwidth,code_cycle,sigma_n,f0,N);

    IF_signal(1:N)=signal(1:N);
    IF_signal_noise(1:N)=signal_noise(1:N);
%     % 绘制信号及噪声
%     figure(1);
%     plot(IF_signal, 'b');  % 绘制生成的信号(含噪声)
%     hold on;
%     plot(IF_signal_noise, 'r');  % 信号的噪声
%     hold off;

    % 当前的载波NCO ××× fd_estimate在不断调整
    [NCO_I_Quanti,NCO_Q_Quanti]=Nco_gen(Ts,fi,fd_estimate,N);
    
    % 下变频
	Rece_Signal_Quan_down_I = IF_signal(1:N).* NCO_I_Quanti;
	Rece_Signal_Quan_down_Q = IF_signal(1:N).* NCO_Q_Quanti;
	Rece_Signal_Quan_down_I_noise=IF_signal_noise.*NCO_I_Quanti;
	Rece_Signal_Quan_down_Q_noise=IF_signal_noise.*NCO_Q_Quanti;

    %%%%经过低通滤波器,截止频率为1.023MHz
    [signal_I,signal_Q,signal_I_noise,signal_Q_noise]=LP_filter(N,N+1,code_cycle,fs,Rece_Signal_Quan_down_I,Rece_Signal_Quan_down_Q,Rece_Signal_Quan_down_I_noise,Rece_Signal_Quan_down_Q_noise,EmulateIndex);       %进过低通滤波器
    
%     % 绘制比较,低通滤波器的作用
%     figure(2);
%     plot(Rece_Signal_Quan_down_I, 'b'); % 原始
%     hold on
%     plot(signal_I, 'r');    % 
%     hold off

    % 这次不再内插成4096个点,而是保持5808个抽样点,表示一个码字长度的值
    ThisPN = PN2Generator(inputcode,Correl_Peak_location_real,N);

    % 相关间隔1/2
    % 超前码1/4
    EarlyPN2 = [ThisPN((const4+1):N) ThisPN(1:const4)];
    % 滞后码
    LagPN2 = [ThisPN((N-const4):N) ThisPN(1:(N-const4-1))];

    % 相关间隔1/4
    % 超前码1/8
    EarlyPN4 = [ThisPN((const8+1):N) ThisPN(1:const8)];
    % 滞后码
    LagPN4 = [ThisPN((N-const8):N) ThisPN(1:(N-const8-1))];
    
    k = k+1;
    % 积分器,算出I.Q
    Ips(k) = sum(ThisPN.*Rece_Signal_Quan_down_I);
    Qps(k) = sum(ThisPN.*Rece_Signal_Quan_down_Q);

    Ies2(k) = sum(EarlyPN2.*Rece_Signal_Quan_down_I);
    Qes2(k) = sum(EarlyPN2.*Rece_Signal_Quan_down_Q);

    Ils2(k) = sum(LagPN2.*Rece_Signal_Quan_down_I);
    Qls2(k) = sum(LagPN2.*Rece_Signal_Quan_down_Q);
    
%     Ies4(k) = sum(EarlyPN4.*Rece_Signal_Quan_down_I);
%     Qes4(k) = sum(EarlyPN4.*Rece_Signal_Quan_down_Q);
% 
%     Ils4(k) = sum(LagPN4.*Rece_Signal_Quan_down_I);
%     Qls4(k) = sum(LagPN4.*Rece_Signal_Quan_down_Q);

    % 伪码相位误差
    % 归一化点积鉴项器-斜率2
    EC1(k) = ((Ies2(k)-Ils2(k))*Ips(k) + (Qes2(k)-Qls2(k))*Qps(k))/(Ips(k)*Ips(k) + Qps(k)*Qps(k));%
  
%     if(EC1(k) > 2)
%         EC1(k) = 2;
%     end;
%     if (EC1(k) < -2)
%     	EC1(k) = -2;
%     end;
    % 归一化超前减滞后功率鉴项器-斜率4
%    EC2(k) = (Ies4(k)*Ies4(k)+Qes4(k)*Qes4(k)-Ils4(k)*Ils4(k)-Qls4(k)*Qls4(k))/(Ies4(k)*Ies4(k)+Qes4(k)*Qes4(k)+Ils4(k)*Ils4(k)+Qls4(k)*Qls4(k));
    
    % 计算相位差
    diff1 = EC1(k)*5808/1023/2;
    DiffFilter(k) = EC1(k)*5808/1023/2;
    if(k > 128)
        DiffFilter(k) = sum(DiffFilter(k-127:k))/128;
        if(DiffFilter(k) < 1/24)
            Catched = 1;
            disp('码相位已经跟踪并锁定');
            Correl_Peak_location_real
            %break;
        end;
    end;
%    diff2 = EC2(k)/4;
    
% 使用滤波
    if(abs(DiffFilter(k)) < 1)
        PhaseQueue(k) = Correl_Peak_location_real;
    else
        PhaseQueue(k) = Correl_Peak_location_real+round(DiffFilter(k));
        if(PhaseQueue(k) >= 5808)
            PhaseQueue(k) = mod(PhaseQueue(k),5808) + 1;%*1023
        end;
    end;
    
% % 未加滤波    
%     if(abs(diff1) < 1)
%         PhaseQueue(k) = Correl_Peak_location_real;
%     else
%         PhaseQueue(k) = Correl_Peak_location_real+round(diff1);
%         if(PhaseQueue(k) >= 5808)
%             PhaseQueue(k) = mod(PhaseQueue(k),5808) + 1;%*1023
%         end;
%     end;
    
    Correl_Peak_location_real = PhaseQueue(k);
    PhaseQueue(k) = fix(PhaseQueue(k)*1023/5808);
%Correl_Peak_location_real = mod(Correl_Peak_location_real +1,1023) + 1;

    %    if abs(diff1+diff2)/2 < 0.
%     end;
    
    if(mod(length(PhaseQueue),200)==0)
        % 绘制伪码相位跟踪的结果
        figure(91);
        plot(PhaseQueue);
    end;
    
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -