GPS软件接收机matlab程序学习笔记(一)

  • Post author:
  • Post category:其他


clear all;clc;cla;close all;
format longg; %%15位有效数
%% 一、  设定GPS数据文件参数 %%%%%%%%%%%%%%
gps_bd = 0; % 0:gps, 1:bd
n_mean_count = 200; %bias count 
if gps_bd == 0
    % 这个中频数据是 bit8
    filename = '.\data\GPS_sim_5mfs_if1.42m.txt';% 相对路径 当前工程文件夹下的data文件夹下的GPS_sim_5mfs_if1.42m.txt文件
    fs = 5e6; % 采样率★书本260页实际采样在5E6
    fc = 1.42e6;% 采样数据中频★
    sv = 1:32;% 要捕获跟踪的卫星号 若不知道有哪些星可以设置为 sv=1:32 但这样处理速度会比较慢★
    Readtype = 'bit8';%数据读取位宽,要注意 不同的中频信号采样位是否一致,有符号采样时,高位为符号位,低位为幅值位

%     filename = 'D:\9.WorkInTheLab\0.Project\0.GNSS_SignalQualityMonitor\1.data\2771\data\GPSL1_8bit_fs16.369M_fc3.996M.bin';
%     fc = 3.996e6;
%     fs = 16.369e6;
%     sv = 28;
%     Readtype = 'bit8';

%     filename = 'C:\MATLAB7\work\BDSB1-8bit-PwrSpectAbnorm-202006172224.bin';
%     fc = 3.996e6;
%     fs = 16.369e6;
%     sv = 1:32;
%     Readtype = 'bit8';
    
    disp 'gps acq'
else
    filename = 'C:\MATLAB7\work\usbdata.bin';
    fc = 3.999875e6;
    fs = 16.369e6;
    sv = 1:32;
    Readtype = 'bit8';
    disp 'bd acq'
end
%% 二、  任务配置 %%%%%%%%%%%%%%
task_AcqOnly= 0  ;             %捕获标志,为1时只进行捕获,为0时则进行捕获跟踪
task_Acq_Track=1;              %捕获跟踪标志,为1 - 则进行捕获、跟踪;为 0 则调用以前结果进行NAV定位
track_acqresultsName='capture_test.mat';%%捕获跟踪后生成的数据保存名字,task_Acq_Track = 0 时则直接调用此数据进行定位解算。注意每次用不同的中频数据时取不同的名字,以免覆盖。
task_frameFindChk=  1    ;      %找子帧标志, 1则找子帧,其他则不进行                            0
task_nav = 1           ;        %定位解算标志 1则参与定位解算,其他则不进行                      0
plotAcq_AND_Channel=  1  ;      %捕获通道画图标志,1则画图,其他则不进行
plot_Acq_ACF= 1        ;        %捕获三维图和相关累加画图标志,1则画图,其他则不进行
if task_Acq_Track==1            %捕获跟踪标志,为1 - 则进行捕获、跟踪;为 0 则调用以前结果进行NAV
    task_load_results= 0   ;
else
    task_load_results=  0 ; 
end
%% 三、  捕获、跟踪参数设置 %%%%%%%%%%%%%%
% file_sec=0.400;              %跟踪时间★,单位为秒,理论上大于30秒后方可能定位解算,一般取33来验证,也可长时间跑看定位效果  %%!!!!!!注意如果有时数据长度不够的话,会报错。如此时的数据GPS_sim_5mfs_if1.42m.txt用36s就会报错,用33则不会。
file_sec=33;                    %跟踪时间要这么长?★
channels=8;                     %通道数设置★8-12书上,但后面真正用到的不一定是8,可能<8
acq_th=2.5;                       %捕获门限★
K=1;                            %非相干累加次数★
fc_lo=fc-5000;fc_hi=fc+5000;step=100;%doppler bin★
nav_interval=0.001;             %导航定位解算时间间隔,单位为秒★
ts=1/fs;                        %采样时间★
n=fs/1000;   n_mli=n;           %1ms的采样点数 ★                    
nn=0:n-1;                       %采样点范围 ★
num_sec=0.011;                  %读取文件中的长度设置,★
n_samples=fs*num_sec;           %读取文件中的采样点个数,如当前设置为10ms采样数据
plot_acq_bar_par = [];          %捕获柱状画图卫星SNR计数

%% 四、  读取 真实采集数据或调用以前的处理结果%%%%%%%%%%%%%%%%%%%%%
if task_Acq_Track==1    
    fid = fopen(filename,'rb');          %打开filename路径读取文件 
    skipNumberOfBytes = fs * 3;            %为什么是3?
    fseek(fid,skipNumberOfBytes, 'bof');
    data_sum=fread(fid,n_samples,Readtype);     %以Readtype为文件格式,以n_samples为 数据长度已读取文件保存到data中
    fclose(fid);                            %关闭文件      
    data_sum=data_sum';%%%对读取数据进行处理,目的是把数据的值缩小一半缩小计算量,也可不处理拿来直接用
    n=4;
    data=data_sum;
    [data_bias,mean_data] = bias_control(data,n_mean_count);
    data = data_bias;
    plotPSD(data,fs);grid on;                    %功率画图
    xlabel('频率/MHz'); ylabel('功率谱密度/dB·Hz');
    title ('信号功率谱密度');
end
%%%%%%%%*********.load 以前的结果进行定位解算. .**********%%%%%%%%
if task_load_results==1
    load(track_acqresultsName);             %导入捕获跟踪存储的数据直接用来导航定位解算
end

%% 五、  ★捕获%%%%%%%%%%%%%%%%%%%%
if task_Acq_Track==1
    disp '1..Acqisiting.!----'
    acq=[];                 %acq初始化
    j=1;                    %捕获卫星个数变量,用于保存捕获通道参数指向路径
    fprintf('(');
    for i=1:length(sv)      %捕获设定的卫星编号
        svnum=sv(i);        %当前捕获的卫星编号        
        if gps_bd == 0
            % 输入参数:中频数据,卫星编号,采样频率,频率搜索起点,频率搜索步长,频率搜索截止点,非相干累加次数,捕获门限
            % 输出参数:捕获成功标志,捕获的载波频率,捕获的码相位,非相干累加值,非相干累加值峰均比
%             [acqOK,f,ph,acf,PAR]=GPSacquisition(data,svnum,fs,fc_lo,step,fc_hi,K,acq_th);
            [acqOK,f,ph,acf,PAR] = GPSacquisition_s(data,svnum,fs,fc_lo,step,fc_hi,K,acq_th);
        else
            [acqOK,f,ph,acf,PAR]=BDacquisition(data,svnum,fs,fc_lo,step,fc_hi,K,acq_th);
        end
        plot_acq_bar_par(i)=PAR;
        % ★捕获成功时,缓存捕获信息:非相干累加值,卫星编号,牵引载波频率,码相位
        % 画捕获三维图和非相干累加值图
        if acqOK  
            figure;
            acfhandler=mesh(acf);set(acfhandler,'EdgeColor','none','Facecolor','interp');
            text=sprintf('SV %i',svnum);title(text);  xlabel('码相位');ylabel('载波多普勒');
            [m fbin]=max(max(acf'));% 行号即是载波多普勒   
            [m ccn]=max(max(acf));% 列号即是码相位 
%             figure; plot(abs(acf(:,ccn)),'-o');
%             xlabel('多普勒');ylabel('非相干积分值');
%             figure; plot(abs(acf(fbin,:)),'-o');
%             xlabel('码相位');ylabel('非相干积分值');
%             [f_pull,dfreq]=gps_pvt_fpullin(data,svnum,f,fs,ph); % 5hz 高分辨率
            acq(j,1)=PAR;                   
            acq(j,2)=sv(i);                 %卫星编号
            acq(j,3)=f;  
            acq(j,4)=ph;                    %码相位
            j=j+1;                          %每捕获一颗星,通道号+1
            fprintf('%d,', sv(i));         %捕获成功是则输出卫星号      
        else
            fprintf('.');                  %未捕获成功时则输出"."
        end 
    end
    fprintf(')\n');  
    if isempty(acq)
        disp '---acq is failed---';
        return;
    else
        plot_acq_bar(plot_acq_bar_par,acq_th); %捕获柱状画图       
        disp '2..Configure channels for track: '
        disp ' _______________________________________________________'
        disp '|  CH | PRN | Frequency  | Doppler | CodePhase | PAR    |';
        channel_num=min(channels,size(acq,1));                          %取决于初始通道数和捕获卫星数
        if plotAcq_AND_Channel==1
            for i=1 : channel_num
                fprintf('| %2d  | %2d  | %6.2f |  %6.0f |  % 6d   |  %2.2f  | \n',...
                i, ...                  %显示通道号                
                acq((i),2), ...         %显示卫星编号
                acq((i),3), ...         %载波频率
                acq((i),3) - fc, ...    %多普勒频移 
                acq((i),4),...          %码相位
                acq((i),1));            %非相干累加幅值
            end
        end
        disp '  --end of  Acqisition!AND Sort acqresults by PAR-----';
        [acq_SNRdescend]=gps_SoftReceiver_sort_acqdescending(acq);%把捕获的结果按SNR的顺序由大到小重新排列
        acq=acq_SNRdescend; 
    end
end
%% 六、★跟踪并处理、保存结果
if task_AcqOnly==0    %到本脚本的结束位置       
    if (task_Acq_Track==1&&task_AcqOnly==0)
        %%6.1---跟踪初始化 % %
        disp '3..Tracking.!----'
        length_ms=file_sec*1000;                            %跟踪时间长度
        Ips=zeros(channel_num,length_ms);                   %I路信号初始化
        Qps=zeros(channel_num,length_ms);                   %Q路信号初始化
        code_shifts=zeros(channel_num,length_ms);           %码相位偏移初始化
        navidatas=zeros(channel_num,length_ms/20+2);        %电文数据比特长度初始化
        navdata_indexs=zeros(channel_num,length_ms/20+2);   %电文数据比特长度深度初始化 
        carr_Freqs=zeros(channel_num,length_ms);            %载波频率初始化
        carr_remPhases=zeros(channel_num,length_ms);        %载波角频率初始化
        code_Freqs=zeros(channel_num,length_ms);            %码频率初始化
        code_remPhases=zeros(channel_num,length_ms);        %码角频率初始化
        %%6.2******跟踪-输出导航电文  +  数据解调+1-1 并主意这里的跟踪相位*%%%%%%%%%
        Bit_sync_OK =0;
        Bit_sync =zeros(channel_num,length_ms); 
        for i=1:channel_num
            fprintf('  %d ',i)                              %输出当前跟踪通道
            phase=acq((i),4);                               %码相位
            %函数:gps_pvt_track_beijingNCO  跟踪环
            % 输入:[路径文件名,卫星号,采样频率,捕获载波频率,捕获码相位,跟踪时间,读取数据位宽,捕获通道总数,当前通道号]
            % 输出:[I路数据,Q路数据,码相位偏移地址,EPL功率值,包含多普勒频移载波频率,载波角相位,码频率,码角相位] 
 [Ip,Qp,code_ph_shift,acf_EPL,carr_Freq,carr_remPhase,code_Freq,code_remPhase]=gpsTracking(filename,acq((i),2),fs,acq((i),3),phase,file_sec,Readtype,skipNumberOfBytes,channel_num,i);

%             Ips(i,1:length(Ip))=Ip;                                         %Ip路数据
%             Qps(i,1:length(Qp))=Qp;                                         %Qp路数据
%             code_shifts(i,1:length(code_ph_shift))=code_ph_shift;           %码相位偏移地址
%             carr_Freqs(i,1:length(carr_Freq))=carr_Freq;                    %包含多普勒频移的载波频率
%             carr_remPhases(i,1:length(carr_remPhase))=carr_remPhase;        %载波角相位
%             code_Freqs(i,1:length(code_Freq))=code_Freq;                    %码NCO
%             code_remPhases(i,1:length(code_remPhase))=code_remPhase;        %码角相位
        end
%         save (track_acqresultsName, 'channel_num', 'navidatas','code_shifts', 'Qps', 'Ips', ...
%             'navdata_indexs','Bit_sync','acf_EPL' ,'acq','fs','carr_Freqs','carr_remPhases','code_Freqs','code_remPhases','fc');%注意每次保存后更改data的名字 以免覆盖
%         fprintf('\n');
        disp '..End of Track AND track_acqresults saved!----'
    else
        disp 'task_track=0'
    end
    figure; subplot(2,1,1),plot(Ips,'-o');
    subplot(2,1,2), plot(Qps,'-*');
end
%



版权声明:本文为LWN7321原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。