204 lines
5.3 KiB
Matlab
204 lines
5.3 KiB
Matlab
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 %%%%%%%%%
|
||
|