119 lines
3.1 KiB
Matlab
119 lines
3.1 KiB
Matlab
function [time, dt, sats, eof] = fepoch_0(fid)
|
||
% FEPOCH_0 Finds the next epoch in an opened RINEX file with
|
||
% identification fid. From the epoch line is produced
|
||
% time (in seconds of week), number of sv.s, and a mark
|
||
% about end of file. Only observations with epoch flag 0
|
||
% are delt with.
|
||
|
||
%Kai Borre 09-14-96; revised 03-22-97; revised Sept 4, 2001
|
||
%Copyright (c) by Kai Borre
|
||
%$Revision: 1.0 $ $Date: 1997/09/22 $
|
||
%fide = fopen(fid,'rt');
|
||
|
||
% 该函数只返回o文件中一个历元的以下参数:
|
||
|
||
% time:周内秒
|
||
% dt:接收机钟差(该参数为可选项,不一定所有的o文件中都有)
|
||
% sats:当前历元所观测到的卫星
|
||
% eof:是否到文件末尾
|
||
|
||
global sat_index;
|
||
time = 0;
|
||
dt = 0;
|
||
sats = [];
|
||
NoSv = 0;
|
||
eof = 0;
|
||
|
||
%循环读取o文件的每一行
|
||
while 1
|
||
lin = fgets(fid); % earlier fgetl 先读一行
|
||
|
||
if (feof(fid) == 1); % 若到文件末尾,则结束
|
||
eof = 1;
|
||
break
|
||
end;
|
||
|
||
% 跳过空行
|
||
if length(lin) <= 1
|
||
continue;
|
||
end
|
||
|
||
% answer = findstr(lin,'COMMENT'); % 判断该行中是否有字符串“COMMENT”
|
||
%
|
||
% if ~isempty(answer); % 若有“COMMENT“,则继续读下一行
|
||
% lin = fgetl(fid);
|
||
% end;
|
||
|
||
% 如果该行数据第29个字符不为0(0代表改历元正常),
|
||
% 或者总长度只有29(也就是没有后面的卫星PRN数据),
|
||
% 则结束。
|
||
% if ((strcmp(lin(29),'0') == 0) & (size(deblank(lin),2) == 29))
|
||
% eof = 1;
|
||
% break
|
||
% end; % We only want type 0 data
|
||
|
||
% 如果该行第二个字符是1,或者第29个字符是0,则说明
|
||
% 这一行是某一历元的开始行,接下来就可以从该行中提取时间、PRN等参数
|
||
if ((strcmp(lin(2),'1') == 1) & (strcmp(lin(29),'0') == 1))
|
||
ll = length(lin)-2;
|
||
if ll > 60, ll = 60; end;
|
||
linp = lin(1:ll);
|
||
%fprintf('%60s\n',linp);
|
||
|
||
%使用strtok函数获得间隔符前面的字符串,
|
||
% 首先是获得当前时间
|
||
[nian, lin] = strtok(lin);
|
||
% year;
|
||
|
||
[month, lin] = strtok(lin);
|
||
% month;
|
||
|
||
[day, lin] = strtok(lin);
|
||
% day;
|
||
|
||
[hour, lin] = strtok(lin);
|
||
% hour
|
||
|
||
[minute, lin] = strtok(lin);
|
||
% minute
|
||
|
||
[second, lin] = strtok(lin);
|
||
% second
|
||
|
||
[OK_flag, lin] = strtok(lin);
|
||
% OK_flag就是第29个字符,如果是0,则该历元正常
|
||
|
||
%将时间转成数值型,然后再计算出GPS周和周内秒
|
||
h = str2num(hour)+str2num(minute)/60+str2num(second)/3600;
|
||
jd = julday(str2num(nian)+2000, str2num(month), str2num(day), h);
|
||
[week, sec_of_week] = gps_time(jd);
|
||
time = sec_of_week;
|
||
|
||
%获得该历元卫星数
|
||
[NoSv, lin] = strtok(lin,'G');
|
||
|
||
%储存该历元每颗卫星的PRN
|
||
for k = 1:str2num(NoSv)
|
||
[sat, lin] = strtok(lin,'G');
|
||
prn(k) = str2num(sat);
|
||
end
|
||
|
||
% prn是1行NoSv列的矩阵,sats是其转置
|
||
sats = prn(:);
|
||
|
||
% 接收及钟差,有的o文件中没有该参数
|
||
dT = strtok(lin);
|
||
if isempty(dT) == 0 %如果dT不为0,则将其记录
|
||
dt = str2num(dT);
|
||
end
|
||
|
||
break % 跳出while循环
|
||
|
||
end
|
||
|
||
end;
|
||
|
||
% datee=[str2num(nian) str2num(month) str2num(day) str2num(hour) str2num(minute) str2num(second)];
|
||
|
||
%%%%%%%% end fepoch_0.m %%%%%%%%%
|