UWBIns/lib/gnss/rinexe.m

204 lines
5.3 KiB
Matlab
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

function iono = rinexe(ephemerisfile, outputfile)
%RINEXE Reads a RINEX Navigation Message file and
% reformats the data into a matrix with 23s
% rows and a column for each satellite.
% The matrix is stored in outputfile
%Typical call: rinexe('pta.96n','pta.nav')
%Kai Borre 04-18-96
%Copyright (c) by Kai Borre
%$Revision: 1.0 $ $Date: 1997/09/24 $
% Units are either seconds, meters, or radians
fide = fopen(ephemerisfile);
head_lines = 0;
iono = zeros(8,1);
%read the header
header_end = [];
while (isempty(header_end))
head_lines = head_lines+1;
%read the line and search the ionosphere labels
lin = fgetl(fide);
vers_found = ~isempty(strfind(lin,'RINEX VERSION / TYPE'));
iono_found = (~isempty(strfind(lin,'ION ALPHA')) || ~isempty(strfind(lin,'IONOSPHERIC CORR')));
%if the ionosphere parameters label was found
if (vers_found)
version = str2num(lin(1:9));
end
%if the ionosphere parameters label was found
if (iono_found)
%change flag
% ioparam = 1;
%save the 8 ionosphere parameters
data = textscan(lin(5:end),'%f%f%f%f%*[^\n]');
if ~isempty(data(4))
iono(1) = data{1};
iono(2) = data{2};
iono(3) = data{3};
iono(4) = data{4};
lin = [];
while isempty(lin)
lin = fgetl(fide);
end
data = textscan(lin(5:end),'%f%f%f%f%*[^\n]');
if ~isempty(data(4))
iono(5) = data{1};
iono(6) = data{2};
iono(7) = data{3};
iono(8) = data{4};
else
iono = zeros(8,1);
end
end
end
header_end = strfind(lin,'END OF HEADER');
end
head_lines = head_lines + 1;
noeph = -1; %初始化星历数目
while 1
noeph = noeph+1;
line = fgetl(fide);
if line == -1, break; end
end;
noeph = noeph/8 % 卫星星历数 = 去掉文件头之后的文件行数 / 8
% 每颗卫星星历行数是8行
% 下面两行作用是回到文件头结束的地方
frewind(fide);
for i = 1:head_lines, line = fgetl(fide); end;
% Set aside memory for the input
% 为星历中每个参数产生1行noeph列的0矩阵
% 每一列对应该星历文件中的一个PRN
noeph = fix(noeph);
svprn = zeros(1,noeph);
weekno = zeros(1,noeph);
t0c = zeros(1,noeph);
tgd = zeros(1,noeph);
aodc = zeros(1,noeph);
toe = zeros(1,noeph);
af2 = zeros(1,noeph);
af1 = zeros(1,noeph);
af0 = zeros(1,noeph);
aode = zeros(1,noeph);
deltan = zeros(1,noeph);
M0 = zeros(1,noeph);
ecc = zeros(1,noeph);
roota = zeros(1,noeph);
toe = zeros(1,noeph);
cic = zeros(1,noeph);
crc = zeros(1,noeph);
cis = zeros(1,noeph);
crs = zeros(1,noeph);
cuc = zeros(1,noeph);
cus = zeros(1,noeph);
Omega0 = zeros(1,noeph);
omega = zeros(1,noeph);
i0 = zeros(1,noeph);
Omegadot = zeros(1,noeph);
idot = zeros(1,noeph);
accuracy = zeros(1,noeph);
health = zeros(1,noeph);
fit_interval = zeros(1,noeph);
% 将所有卫星的星历参数存入上面定义的矩阵中
for i = 1:noeph
line = fgetl(fide); % 从该组星历中第一颗卫星的星历的第一行开始
svprn(i) = str2num(line(1:2)); % 存入卫星PRN
year = line(3:6);
month = line(7:9);
day = line(10:12);
hour = line(13:15);
minute = line(16:18);
second = line(19:22);
af0(i) = str2num(line(23:41));
af1(i) = str2num(line(42:60));
af2(i) = str2num(line(61:79));
line = fgetl(fide); % 读下一行
IODE = line(4:22);
crs(i) = str2num(line(23:41));
deltan(i) = str2num(line(42:60));
M0(i) = str2num(line(61:79));
line = fgetl(fide); % 读下一行
cuc(i) = str2num(line(4:22));
ecc(i) = str2num(line(23:41));
cus(i) = str2num(line(42:60));
roota(i) = str2num(line(61:79));
line=fgetl(fide); % 读下一行
toe(i) = str2num(line(4:22));
cic(i) = str2num(line(23:41));
Omega0(i) = str2num(line(42:60));
cis(i) = str2num(line(61:79));
line = fgetl(fide); % 读下一行
i0(i) = str2num(line(4:22));
crc(i) = str2num(line(23:41));
omega(i) = str2num(line(42:60));
Omegadot(i) = str2num(line(61:79));
line = fgetl(fide); % 读下一行
idot(i) = str2num(line(4:22));
codes = str2num(line(23:41));
weekno = str2num(line(42:60));
L2flag = str2num(line(61:79));
line = fgetl(fide); % 读下一行
svaccur = str2num(line(4:22));
svhealth(i) = str2num(line(23:41));
tgd(i) = str2num(line(42:60));
iodc = line(61:79);
line = fgetl(fide); % 读下一行
if length(line)>= 41
tom(i) = str2num(line(4:22));
fit_interval(i) = str2num(line(23:41));
else
tom(i) = str2num(line(4:22));
fit_interval(i) = 0;
end
% spare = line(42:60);
% spare = line(61:79);
end
status = fclose(fide)
% Description of variable eph.
% 把上面存好的各参数再转存到一个大矩阵“eph”中该矩阵每行代表一种参数
% 每列代表一颗卫星
eph(1,:) = svprn;
eph(2,:) = af2;
eph(3,:) = M0;
eph(4,:) = roota;
eph(5,:) = deltan;
eph(6,:) = ecc;
eph(7,:) = omega;
eph(8,:) = cuc;
eph(9,:) = cus;
eph(10,:) = crc;
eph(11,:) = crs;
eph(12,:) = i0;
eph(13,:) = idot;
eph(14,:) = cic;
eph(15,:) = cis;
eph(16,:) = Omega0;
eph(17,:) = Omegadot;
eph(18,:) = toe;
eph(19,:) = af0;
eph(20,:) = af1;
eph(21,:) = toe;
eph(22,:) = fit_interval;
eph(23,:) = svhealth;
fidu = fopen(outputfile,'w');
count = fwrite(fidu,[eph],'double');
fclose all
%%%%%%%%% end rinexe.m %%%%%%%%%