www.gusucode.com > GPS信号捕获程序,信号源为东方联星Newstar210M采集到的中频数字信号(含GUI界面)- > sourcode/acquisitionfinal.m

    %可改变相关时间search.m performs acquisition on collected data on search7.m
%本地载波的幅度变了
clear;
clc;
% clf;
% ***** initial condition *****
disp('Initial condition');
IF=20491635;                %***IF=20Mhz
worktime=1.0;               %***工作时间是2ms
UnitTime=1.0;               %***单位时间是1s
% fs=16367667;                %***采样频率是16MHz,实验频率
    fs=16363280;
ts=(UnitTime/fs);          %***采样时间间隔是1/fs
Numpms=fix(worktime*fs/1000);            %***每ms中有多少个数据点
    if (rem(Numpms,4)~=0),
        Numpmstemp=Numpms+(4-rem(Numpms,4));    %实际的样点数可能并不为4的整数倍(每个样点用2位二进制数进行量化)
    else
        Numpmstemp=Numpms;
    end
datanum=Numpms;
num=[0:Numpms-1];                           %***数据点的数量
fo=IF-1*fs;                  %***输出频率为fo=fi-1*fs=20-1*16=4MHz,没有多普勒频移

% ***** input data file *****
disp('input data file');
% fid=fopen('C:\MATLAB701\work\GPSRawData.dat', 'r');   %**实验文件
    fid=fopen('C:\MATLAB701\work\GPSData.dat', 'r');
fseek(fid,3000*512, 'bof');               %**从某个位置开始向后读点
buffer1=fread(fid,Numpmstemp,'ubit2');%**之所以有buffer1和buffer是因为数据方向不同
buffer1=buffer1';
buffer=zeros(1,Numpms);
for counter=1:Numpmstemp,    
    switch mod(counter,4)
        case 1,
        temp0=buffer1(counter+3);
        buffer(counter)=temp0;
        case 2,
        temp3=buffer1(counter+1);
        buffer(counter)=temp3;
        case 3,
        temp2=buffer1(counter-1);
        buffer(counter)=temp2;
        case 0,
        temp1=buffer1(counter-3);
        buffer(counter)=temp1;
    end    
    switch buffer(counter)
        case 1
            inputdata(counter)=3;
        case 0
            inputdata(counter)=1;
        case 2
            inputdata(counter)=-1;
        case 3
            inputdata(counter)=-3;
    end
end
clear buffer1;
inputdata=inputdata(1:Numpms);%**按样点数截断读入的数据
finputdata=fft(inputdata);              %**得到各频率谱线
% finputdata=finputdata(1:ceil(length(finputdata)/2));    %取一半的频率值
finputdata(1)=0;                             %**消除直流成分

%******产生本地码,C/A码和RF的乘积后进行环形相关
disp('generate local code and do correlation');
for svID=1:31,
    fprintf('. ');
    CAsample=sampleCAcode(svID,fs,worktime);          %**按照fs采样CA码
    for fideta=1:1:21,                       %**fideta是多普勒频移
        fi(fideta)=fo-10*1000+(fideta-1)*1000;
        lc=CAsample.*(exp(j*2*pi*fi(fideta)*ts*num ));%生成本地载波
        lcf=fft(lc);                                %**做本地载波的fft,即本地波的频谱
%         lcf=lcf(1:ceil(length(lc)/2));    %**取本地波频谱的一半的频率
        out(fideta,:)=abs(ifft(conj(lcf).*(finputdata))); %做环形相关
    end
    [maxAmp(svID) freqshiftNo]=max(max(out'));%每颗星的21个偏移频率中产生最大相关值的那个偏移频率值
    [maxAmp(svID) startpointNo]     =max(max(out ));%每颗星的信号的8184 个频率点,在同21个频率做完相关后,能产生最大的相关值的那个起始位置点
    
  
     outnoise=out;
     outnoise(              : ,startpointNo)=[];
     outnoise(freqshiftNo ,:                 )=[];
     meanvalue=mean(mean(outnoise));
     meanpeak=maxAmp/meanvalue;

end
fprintf('\n');
stem (maxAmp, 'DisplayName', 'maxAmp', 'YDataSource', 'maxAmp'); figure(gcf)