Главная страница
Навигация по странице:

  • Функция week_GLONAS_gps

  • 5.2 Декодирование данных альманаха спутников GPS

  • Формат данных альманаха RAWALM

  • Цель лабораторной работы

  • ALM_ProPakG2_My, RAW_ALM_BIN_DAT, RAW_ALM_BIN_ALM. 2. Скопируйте в папку ALM_ProPakG2_My из ALM_ProPakG2 папку

  • RAW_ALM_PRG

  • Задание.

  • RAW_ALM_PRG Файл Raw_Alm.m

  • Спутниковые системы навигации. Учебное пособие. Учебное пособие ( Лабораторный практикум на компьютере ) Київ 2008 1


    Скачать 4.49 Mb.
    НазваниеУчебное пособие ( Лабораторный практикум на компьютере ) Київ 2008 1
    Дата12.04.2023
    Размер4.49 Mb.
    Формат файлаpdf
    Имя файлаСпутниковые системы навигации. Учебное пособие.pdf
    ТипУчебное пособие
    #1057965
    страница10 из 14
    1   ...   6   7   8   9   10   11   12   13   14

    Функция gln_a
    function [ ] = gln_a(A_PZ90_KM, ns, n0, ti_current, time_s0, alm_gln, timeUTC_leap, fid);
    %Имя функции:gln_a
    %Функция формирует альманах ГЛОНАСС в формате YUMA. Данные альманаха ГЛОНАСС соот- ветствуют
    %данным альманаха ГЛОНАСС, записанным приемником СН 4701 и преобразованным в строгом со- ответствии
    %интерфейсному контрольному документу ГЛОНАСС
    %Постоянные:
    I_MID = 1.0995574287564; %(double)(PI * 63.0 / 180.0). I_MID - Mean value of an inclination of a plane of orbit of a satellite
    T_DR_MID = 43200.0; %Mean value a dragon of cycle time of a satellite
    MU = 398600.44; % (Km^3/cek^2) гравитационная постоянная (constant of a gravitational)
    OMEGA_Z = 0.7292115e-4; %(рад/cek)- Угловая скорость вращения Земли (Angular speed of rotation of the Earth )
    SEC_IN_RAD = 7.2722052166430e-005; %(PI / 43200.0 ) Number radian in second of time
    2*PI/(24*3600)=PI/43200
    HALF_PI = pi / 2;
    D7_3 = 7.0 / 3.0;
    D7_4 = 7.0 / 4.0;
    D7_6 = 7.0 / 6.0;
    D7_24 = 7.0 / 24.0;
    D49_72 = 49.0 / 72.0; nn = fix(ti_current / 86400); ti = ti_current - nn * 86400;%время в секундах i_incl = I_MID + alm_gln(ns).deltai; %наклонение орбиты спутника ГЛОНАСС с номером ns
    156
    ecc2_1 = 1.0 - alm_gln(ns).ecc * alm_gln(ns).ecc;
    % t_dr = T_DR_MID + alm_gln(ns).Tdr; % GG24 t_dr = alm_gln(ns).Tdr; %драконический период спутника ГЛОНАСС (данные приемника СН 4701) n_dr = pi * 2 / t_dr;
    %1. Вычисление полуоси a_n: a_n = semi_axis( A_PZ90_KM, t_dr, i_incl, alm_gln(ns).ecc, alm_gln(ns).omegan); alm_gln(ns).a = a_n;
    %2. Вычисление t_lambda_k - время пересечения восходящего узла орбиты спутника ГЛОНАСС sin_i = sin(i_incl); cos_i = cos(i_incl); sin_i2 = sin_i * sin_i; cos_i2 = cos_i * cos_i; v = - alm_gln(ns).omegan; % omega_n - angle of a perigee
    J = -0.00162393855 ; % J = 3/2 *C20; C20=1082.6257 * 10-6; ae_a = A_PZ90_KM / a_n; ae_a2 = ae_a * ae_a; j_ae_a2 = J * ae_a2; omega1 = j_ae_a2 * n_dr * cos_i / (ecc2_1 * ecc2_1); n0_na = (n0 - alm_gln(ns).Na) ; tz = ti - alm_gln(ns).TLambdaN + 86400.0 * n0_na; wk = tz / t_dr; wi = fix(wk); wi2 = wi * wi; t_lambda_kk = alm_gln(ns).TLambdaN + t_dr * wi + alm_gln(ns).dTdr * wi2; t_lambda_k = t_lambda_kk - n0_na * 86400.0 ; lambda_k = alm_gln(ns).LambdaN + (omega1 - OMEGA_Z) * (wi * t_dr + alm_gln(ns).dTdr * wi2) ;
    %time_s0 - a true sidereal time to Greenwich midnight of date n0 to which time ti concerns
    %time_s0 - истинное звездное время в текущий момент обсервации time_s0 = 0; time_s = time_s0 * SEC_IN_RAD + OMEGA_Z * t_lambda_k ; omega_0 = lambda_k + time_s;
    % Auxiliary values: d1 = 1.0 - 1.5 * sin_i2; j_ae_a2_d1 = j_ae_a2 * d1; j_ae_a2_d = j_ae_a2 * (1.0 - 1.5 * sin_i); j_ae_a2_sin_i = j_ae_a2 * sin_i; j_ae_a2_sin_i2 = j_ae_a2 * sin_i2; j_ae_a2_cos_i2 = j_ae_a2 * cos_i2;
    % 3. Calculation of constants: tau = 0;
    157
    l = cos(alm_gln(ns).omegan) * alm_gln(ns).ecc; h = alm_gln(ns).ecc * sin(alm_gln(ns).omegan); dop_x = (sqrt(1.0 - alm_gln(ns).ecc) * tan( v / 2.0)); dop_y = sqrt(1.0 + alm_gln(ns).ecc); ee = 2.0 * atan2(dop_x, dop_y ); ma = ee - alm_gln(ns).ecc * sin(ee); ll = ma + alm_gln(ns).omegan;
    % for (j = 0; j <= 1; j++) for ( j= 1 : 2) sin_l = sin(ll); sin_2l = sin(2 * ll); sin_3l = sin(3 * ll); sin_4l = sin(4 * ll); cos_l = cos(ll); cos_2l = cos(2 * ll); cos_3l = cos(3 * ll); cos_4l = cos(4 * ll); l_cosl = l * cos_l; delta_a(j) = 2.0 * a_n * j_ae_a2_d1 * l_cosl +... j_ae_a2 * sin_i * (0.5 * h * sin_l - 0.5 * l_cosl +... cos(2.0 * alm_gln(ns).LambdaN) + 3.5 * l * cos_3l + 3.5 * h * sin_3l); delta_h(j) = j_ae_a2_d1 * (l * n_dr * tau + sin_3l +...
    1.5 * l * sin_2l - 1.5 * h * cos_2l) -...
    0.25 * j_ae_a2_sin_i2 * (sin_l - D7_3 * sin_3l +...
    5.0 * l * sin_2l - 8.5 * l * sin_4l +...
    8.5 * h * cos_4l + h * cos_2l) + j_ae_a2_cos_i2 *...
    (tau * l * n_dr - 0.5 * l * sin_2l); delta_l(j) = j_ae_a2_d1 * ( - tau * h * n_dr + cos_l +...
    1.5 * l * cos_2l + 1.5 * h * sin_2l) -...
    0.25 * j_ae_a2_sin_i2 * ( - cos_l - D7_3 * cos_3l -...
    5.0 * h * sin_2l - 8.5 * l * cos_4l -...
    8.5 * h * sin_4l + l * cos_2l) + j_ae_a2_cos_i2 *...
    ( - tau * h * n_dr + 0.5 * h * sin_2l); d_omega(j) = j_ae_a2 * cos_i * (tau * n_dr + 3.5 * l * sin_l -...
    3.5 * h * cos_l - 0.5 * sin_2l - D7_6 * sin_3l + ...
    D7_6 * h * cos_3l); delta_i(j) = 0.5 * j_ae_a2_sin_i * cos_i * ( - l * cos_l +... h * sin_l + cos_2l + D7_3 * l * cos_3l + D7_3 * h * sin_3l); delta_ll(j) = 2.0 * j_ae_a2_d *... %
    2.0 * j_ae_a2_d1 *
    (tau * n_dr + D7_4 * l * sin_l -...
    158

    D7_4 * h * cos_l) + 3 * j_ae_a2_sin_i *...
    ( - D7_24 * h * cos_l - D7_24 * l * sin_l -...
    D49_72 * h * cos_3l + D49_72 * l * sin_3l +...
    0.25 * sin_2l) + j_ae_a2 * cos_i *...
    (tau * n_dr + 3.5 * l * sin_l - 2.5 * h * cos_l -...
    0.5 * sin_2l - D7_6 * l * sin_3l + D7_6 * h * cos_3l); tau = ti - t_lambda_k; ll = ma + alm_gln(ns).omegan + n_dr * tau; end;
    % 4. Corrections to orbit elements of a satellite by second zone harmonic J20
    % influence at the moments of time ti dda = delta_a(2) - delta_a(1); ddh = delta_h(2) - delta_h(1); ddl = delta_l(2) - delta_l(1); dd_omega = d_omega(2) - d_omega(1); ddi = delta_i(2) - delta_i(1); dd_ll = delta_ll(2) - delta_ll(1);
    % 5. calculation of influenced elements of orbits at the moment of ti time ai = a_n + dda; hi = h + ddh; li = l + ddl;
    % ecc_i = alm_gln[ns].ecc; ecc_i = sqrt(hi * hi + li * li); if (ecc_i == 0) w_i = 0; else if (li == ecc_i) w_i = HALF_PI; else if (li == - ecc_i) w_i = - HALF_PI; else if (li

    = 0) w_i = atan2(hi,li); else w_i = HALF_PI; end; end; end; end;
    159
    omega_i = omega_0 + dd_omega; ii_incl = i_incl + ddi; ll_z = ma + alm_gln(ns).omegan + n_dr * tau + dd_ll;
    % ll_z = ma + alm_gln(ns).omegan + n_dr * (ti - t_lambda_k) + dd_ll; mm_i = ll_z - w_i;
    %--------------------------------------------------
    %timeUTC_leap
    Na = alm_gln(ns).Na;
    [wGPS,weekday] = week_GLONAS_gps(Na, timeUTC_leap);
    Yuma(ns).week = wGPS;% - 1024 ;%варианты записи недели
    Yuma(ns).id = alm_gln(ns).ID + 37;
    %Запись альманаха ГЛОНАСС в формате YUMA
    %Заголовок альманаха ГЛОНАСС. В заголовок вынесен номер (литера) частоты- Hn fprintf(fid,'GLO*Week %i almanac for prn-%i NAUHn-%i***** \n',Yuma(ns).week,
    Yuma(ns).id,alm_gln(ns).Hn);
    %Номер спутника ГЛОНАСС 1...24. В заголовке номера спутников ГЛОНАСС 38...61. fprintf(fid,'ID: %i\n',Yuma(ns).id-37);% для Planning
    %fprintf(fid,'ID: %i\n',Yuma(ns).id);% вариант записи номера спутника
    %Здоровье спутников ГЛОНАСС: 000- здоров
    Yuma(ns).Health = alm_gln (ns).Health ; if (Yuma(ns).Health > 100) fprintf(fid,'Health: %i\n', Yuma(ns).Health); else if (Yuma(ns).Health > 10) fprintf(fid,'Health: 0%i\n', Yuma(ns).Health); else fprintf(fid,'Health: 00%i\n', Yuma(ns).Health); end; end;
    %Ексцентриситет орбиты спутника strdop = e_norm( alm_gln(ns).ecc, 9); fprintf(fid,'Eccentricity: %s \n', strdop);
    %Время, к которому относятся данные орбита спутника ГЛОНАСС, приведенное к началу недели
    GPS.
    %При необходимости нужно учесть поправку смещения времени GPS от UTC (в 2006 году- 14 се- кунд) strdop = e_norm((alm_gln(ns).TLambdaN + 86400 * (weekday)),9); fprintf(fid,'Time of Applicability(s): %s \n',strdop);
    %Наклонение орбиты спутника ГЛОНАСС
    Yuma(ns).inc = alm_gln(ns).deltai;
    160
    fprintf(fid,'Orbital Incluation(rad): %11.9e \n',Yuma(ns).inc);
    %Скорость изменения восходящего узла орбиты спутника ГЛОНАСС strdop = e_norm(omega1,9); fprintf(fid,'Rate of Right Ascen(r/s): %s\n', strdop);
    %Корень квадратный из большой полуоси орбиты спутника ГЛОНАСС
    Yuma(ns).sqrt_a = sqrt(a_n * 1000); fprintf(fid,'SQRT(A) (m^1/2): %11.6f \n',Yuma(ns).sqrt_a);
    %Долгота восходящего узла орбиты спутника ГЛОНАСС strdop = e_norm(omega_i,9); fprintf(fid,'Right Ascen at Week(rad): %s\n', strdop);
    %Аргумент перигея орбиты спутника ГЛОНАСС strdop = e_norm(w_i,9); fprintf(fid,'Argument of Perigee(rad): %s\n',strdop);
    %Средняя аномалия спутника ГЛОНАСС strdop = e_norm(mm_i,9); fprintf(fid,'Mean Anom(rad): %s\n', strdop);
    %Коэффициенты полинома для учета поправок времени strdop = e_norm(alm_gln(ns).tau_n,9); fprintf(fid,'Af0(s): %s\n', strdop);
    Yuma(ns).Af1 = 0.0; fprintf(fid,'Af1(s/s): %11.9e\n', Yuma(ns).Af1);
    %Номер недели fprintf(fid,'week: %i \n\n',Yuma(ns).week);
    %Номер дня от начала недели, к которому относятся данные альманаха
    Yuma(ns).day = weekday;
    Функция week_GLONAS_gps
    function [wGPS,weekday] = week_GLONAS_gps(Na, timeUTC)
    % Имя функции: week_GLONAS_gps
    % Функция вычисляет :
    % Выходные данные: wGPS, weekday.
    %wGPS -номер GPS- недели,
    % weekday - день недели (0 - воскресенье, 1 - понедельник, 2 - вторник, 3 - среда,
    %4 - четверг, 5 - пятница, 6 - суббота.
    % Входные данные:
    %Na- номер суток, к которым относятся данные альманаха спутника ГЛОНАСС, отсчитываемые от
    %ближайшего високосного года
    % timesUTC -время UTC c начала текущей недели (секунда),
    %Используемые константы:
    % сдвиг времени между UTC и системным временем GPS на начало 2004 года
    %diff_UTC_GPS = 13;(до конца 2005 года) diff_UTC_GPS = 14;%(с 2006 года)
    161

    %количество дней в месяцах
    DnMon = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    % юлианский день начала отсчета недели GPS на ноль часов UTC c 5 на 6
    % января 1980 года: wGPS_0 = 2444244.5;
    % Расчет номеров юлианского дня и дня года, от которого отсчитываются дни ГЛОНАСС
    [JD, day_year] = JD_data(timeUTC);
    %Сдвиг на ноль часов UTC на гривчском меридиане
    JD = JD - 0.5;
    %Расчет номера GPS неделе стандартной функцией MatLab "floor" wGPS = floor((JD + Na - wGPS_0) / 7);
    %Расчет дня недели стандартной функцией MatLab "mod" weekday = mod((JD+Na - wGPS_0) , 7);
    Функция semi_axis
    function [a_npp] = semi_axis(A_PZ90_KM, t_dr, i_incl, ecc, omega_n);
    %Имя функции:semi_axis
    %Функция вычисляет радиус орбиты спутника ГЛОНАСС в соответствии с интерфейсным контроль- ным
    %документом ГЛОНАСС
    % A_WGS84 = 6378.1370 ; %km
    %A_PZ90_KM = A_WGS84;
    % A_PZ90_KM = 6378.136; %(Km) Equatorial radius of the Earth
    J20 = -1082625.7e-9; % Factor at the second zone harmonicm
    % B_PZ90_KM = 6356.75136174571344; % AP_LAND (Km) Polar radius of the Earth */
    %a_npp = 1;
    MU = 398600.44; % (Km^3/cek^2) constant of a gravitational epsilon = 1.0e-3; sin_i = sin(i_incl); sin_i2 = sin_i * sin_i; v = -omega_n;% omega_n - angle of a perigee ecc2_1 = 1.0 - ecc * ecc; b1 = 2.0 - 2.5 * sin_i2; b2 = sqrt(ecc2_1 * ecc2_1 * ecc2_1 ); b3 = 1.0 + ecc * cos(omega_n); b3 = b3 * b3; b4 = 1.0 + ecc * cos(v); b5 = b4 * b4 * b4 / ecc2_1; b = b1 * b2 / b3 + b5; t_ock = t_dr;
    162
    tock_2pi = t_ock /(pi * 2); p1_3 = 1.0 / 3.0; a_dop = MU * tock_2pi * tock_2pi; a_n = a_dop^(1/3);
    % a_n = pow(a_dop, p1_3); nn = 0; dda = epsilon + 1; while ( (dda > epsilon) & (nn < 50) ) p = a_n * ecc2_1; % Focal parameter ae_p = A_PZ90_KM / p; b0 = 1.0 + (1.5 * J20 * ae_p * ae_p) * b; t_ock = t_dr / b0; tock_2pi = t_ock / (pi * 2); a_dop = MU * tock_2pi * tock_2pi; a_npp = a_dop^(1/3); dda = abs(a_n - a_npp); a_n = a_npp; nn = nn + 1; end;
    Функция JD_epohi
    function jden = JD_epohi(epoha)
    %Имя: JD_epohi
    %Фукция JD_epohi(epoha) рассчитывает номер юлианского дня
    %до начала года (epoha) на 12h, 0 день, январь.
    %Входные данные: epoha, размерность-год
    %Выходные данные:
    % jden- номер юлианского дня на 12h, 0 день, январь ( размерность -дни) rk = mod(epoha,4); if ( rk == 0 ) rk = 1.0; else rk = 2.0 - rk * 0.25; end; n100 = floor(epoha / 100); n400 = floor(epoha / 400); jden = (4712 + epoha) * 365.25 + n400 - n100 + rk;
    % fprintf('epoha=%d rk=%f jden=%6.2f \n', epoha, rk, jden);
    163

    Функция JD_data
    function [JD, day_year] = JD_data(timeUTC)
    %Имя:JD_data
    % Функция JD_data(timeUTC) вычисляет :
    %JD - номер юлианского дня, day_year - номер дня года.
    %Входные данные:
    %timeUTC.year - год,
    % timeUTC.mon - месяц,
    % timeUTC.day - день.
    %Выходные данные:
    %JD - юлианский день, day_year- день от начала года.
    %Оригинальные функции: function jd0 = JD_epohi(year),
    %(смотри комментарий).
    % число дней от начала периода до 12ч. всемирного времени (полдень)
    % указанной даты ( по Гринвичу)
    %Входные данные для контрольного примера:
    %year = 2000; mon = 1; day = 1;
    %количество дней в месяцах
    DnMon = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    %Вычисление номера юлианского дня опорной эпохи jd0 = JD_epohi(timeUTC.year);
    %Учет високосного года nfebr = 0; if mod(timeUTC.year,4) == 0 nfebr = 1; end;
    %Расчетномера дня года k = 0; for i = 2 : timeUTC.mon k = k + DnMon(i - 1); if (i == 2) k = k + nfebr; end; end; day_year = k + timeUTC.day;
    %Расчет номера юлианского дня
    JD = jd0 + day_year;
    %2451545 - номер юлианского дня; 1- первый день года.
    164

    5.2 Декодирование данных альманаха спутников GPS
    5.2.1 Краткие сведения из теории
    Спутниковые навигационные приемники обрабатывают данные навигационных спутников и вырабатывают информации в определенных форматах, как правило, в форма- тах приемников характерных для фирм-производителей. Рассмотрим программу преобра- зования данных альманаха, получаемых с одного из широко распространенных приемни- ков фирмы Novatel, ProPak-G2, выполненного на базе платы OEM 4 [10, 11]..
    Информация, вырабатываемая приемником, записывается в виде файла в бинарной форме и в форме кода ASCII. В программе декодирования альманаха используется бинар- ная форма. Декодируется сырой альманах (RAWALM, Message ID: 74) [10, 11]. Формат данных из оригинала [10, 11].имеет вид
    Таблица
    Формат данных альманаха RAWALM
    Field
    Field type
    Data Descrsption
    Format
    Binary
    Bytes
    Binary
    Offset
    1 header
    Log header
    H
    0 2 ref week
    Almanac reference week number
    Ulong
    4
    H
    3 ref secs
    Almanac reference time (seconds.)
    Ulong
    4
    H+4 4 subframes
    Number of subframes to follow
    Ulong
    4
    H+8 5 svid
    SV ID (satellite vehicle ID)a
    UShort
    2
    H+12 6 data
    Subframe page data.
    Hex
    30
    H+14 7...
    Next subframe offset = H + 12 + (subframe x 32) variable xxxx
    32-bit CRC (ASCII and Binary only)
    Hex
    4
    H + 12 +
    (32 x subframes) variable [CR][LF]
    Sentence terminator (ASCII only)
    -
    -
    -
    На CD-диске программа записана в папке ALM_ProPakG2
    Цель лабораторной работы изучение процедур и правил декодирования данных навигационного приемника.
    5.2.2 Лабораторная работа 5. 2 «Декодирование данных альманаха навигационных приемников на базе плат OEM- 4»
    Пакет программ для выполнения лабораторной работы расположен в папке
    ALM_ProPakG2 Для выполнения работы в качестве входных данных потребуется альма- нах спутников GPS в виде бинарного файла, который можно получить с навигационных приемников на базе плат OEM 4. Для тестирования программы такой альманах приводит- ся в приложении.
    165

    Рекомендуется следующий порядок (не обязательный) выполнения лабораторной работы.
    1. Создайте папки
    ALM_ProPakG2_My, RAW_ALM_BIN_DAT,
    RAW_ALM_BIN_ALM.
    2. Скопируйте в папку
    ALM_ProPakG2_My
    из ALM_ProPakG2 папку
    RAW_ALM_PRG и RAW_ALM_BIN_DAT, RAW_ALM_BIN_ALM.
    3. Запишите в папку RAW_ALM_BIN_DAT бинарный файл альманаха, который требу- ется декодировать.
    4. Откроете папку RAW_ALM_PRG и изучите файлы и функции по комментария и про- граммным процедурам.
    5. В папке RAW_ALM_PRG откройтефайл Raw_Alm.m и в соответствующие строки запишите имя файла альманаха, который требуется декодировать и имя файла альма- наха, под которым запишется декодированный альманах в формате YUMA.
    6. Задание. Сравните данные декодированного альманаха с содержанием альманаха
    YUMA на сайте
    7. Выполните файл Raw_Alm.m и в папке RAW_ALM_BIN_ALM прочитайте декодиро- ванный альманах.
    5.2.3 Задание для самоподготовки
    В руководстве пользователя на приемники, выполненные на базе плат OEM 4 [10,
    11]. Изучите соответствующие разделы.
    5.2.4 Функции и файлы из папки RAW_ALM_PRG
    Файл Raw_Alm.m
    %Имя файла:Raw_Alm.m
    %Программа преобразует данные бинарного файла альманаха спутников GPS в
    %формат YUMA
    %Входные данные:
    %Бинарный файл "сырого" альманаха навигационных приемников ProPak G2, ProPak G2 plus, DL 4
    %для приведенного примера имя файла (2006_05_09_16.31_G2_RAW).bin
    %Выходные данные:
    %Файл альманаха GPS в формате YUMA,
    %для приведенного примера имя файла (2006_05_09_16.31_G2_RAW_OK).alm
    %начало цикла для 63 спутников (в том числе и спутников-нагрузок) for i=1:63
    %структура согласно формата альманаха YUMA и ICD GPS-200 C alm(i)= struct('SV_ID',0, 'week',0, 'health_0',0, 'health',0,'ecc',0,...
    't0a',0, 'incl_angle',0, 'omega_dot',0,...
    ЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧЧ.
    166

    'sqrtA',0, 'omega0',0, 'omega', 0, 'M0',0,'af0',0, 'af1',0); end;
    %диск и последовательность папок, из которых считывается файл с записью альманаха в бинарном
    %формате. При необходимости можно указать любой другой путь к файлу name_in = 'E:\MATLAB7\work\RAW_ALM_BIN_DAT\(2006_05_09_16.31_G2_RAW).bin';
    %открытие данных для чтения и записи fw = fopen('E:\MATLAB7\work\RAW_ALM_BIN_ALM\(2006_05_09_16.31_G2_RAW_OK).alm','Wt');
    %формирование CRC-кода для проверки считываемых данных fid_crc = fopen(name_in,'rb'); fseek(fid_crc, 0, 'eof'); size1 = ftell(fid_crc)- 4; fseek(fid_crc, size1, 'bof');
    CRC = fread(fid_crc,1,'uint32'); fprintf('CRC_hex = %X \n',CRC); fseek(fid_crc, 0, 'bof');
    CRC_own = CalculateBlockCRC32(fid_crc, size1); fprintf('CRC_own_hex= %X \n',CRC_own); fclose(fid_crc);
    %Чтение "сырых" данных альманаха fid = fopen(name_in,'rb');
    % Заголовок данных- Header Structure (Binary Message)
    Syn_c = fread(fid,3,'char'); %В OEM-4 'Char'
    Hear_d= fread(fid,1,'uchar');%В OEM-4 'Uchar'
    Message_ID = fread(fid,1,'uint16');%В OEM-4 'Long'
    Message_Type=fread(fid,1,'char'); %В OEM-4 'Char'
    Port_Address = fread(fid,1,'char'); %В OEM-4 'Char'
    Message_Length = fread(fid,1,'uint16'); %В OEM-4 'Ushort'
    Sequenc_e = fread(fid,1,'uint16'); %В OEM-4 'Ushort'
    Idle_Time = fread(fid,1,'char'); %В OEM-4 'Char'
    Time_Status = fread(fid,1,'char'); %В OEM-4 'Enum' week_1 = fread(fid,1,'uint16'); %В OEM-4 'Ushort'
    Time = fread(fid,1,'ulong'); %В OEM-4 'Double'
    N_ul = fread(fid,1,'uint'); d_fcc=fread(fid,1,'uint16'); d_fcc = dec2hex(d_fcc); e1 = fread(fid,1,'uint16'); week =fread(fid,1,'uint');% неделя GPS
    T0a= fread(fid,1,'ulong');% время привязки альманаха kol_str= fread(fid,1,'ulong'); %количество строк
    %Чтение данных по каждому спутнику for i=1:kol_str
    167

    Nsv= fread(fid,1,'ushort'); % номер спутника согласно табл.20-V ICD GPS-200 C
    TLM= fread(fid,3,'char');
    TL_M = dec2hex(TLM,2);
    HOW= fread(fid,3,'char');
    HO_W = dec2hex(HOW,2); e6= fread(fid,1,'char'); maska = bin2dec('11000000');
    ID_dop = bitand(e6, maska); data_ID = bitshift(ID_dop, -6); maska = bin2dec('00111111');
    SV_ID = bitand(e6, maska); ecc1 = fread(fid,1,'char'); ecc2 = fread(fid,1,'char'); ecc = (bitshift(ecc1, 8) + ecc2)*2^(-21);%ексцентриситет t0a= fread(fid,1,'char')*2^12 ;% время привязки альманаха d1= fread(fid,1,'bit8'); d2=fread(fid,1,'char'); incl_angle= ((bitshift(d1, 8) + d2)*2^(-19) + 0.3) * pi;%наклонение орбиты спутника d1= fread(fid,1,'bit8'); d2=fread(fid,1,'char'); omega_dot= (bitshift(d1, 8) + d2)*2^(-38) * pi;%скорость изменения восходящего узла maska = bin2dec('00111111');
    %здоровье спутника GPS health_1 = fread(fid,1,'char'); if health_1 > 255 health_1 = health_1; end; health = bitand(health_1,maska); if health > 63 health = health; end; maska = bin2dec('11000000'); health_0 = bitand(health_1,maska); health_0 = bitshift(health_0, -6); if health_0 > 3 health_0 = health_0; end; d1 = fread(fid,1,'char'); d2 = fread(fid,1,'char');
    168
    d3 = fread(fid,1,'char'); sqrtA=(bitshift(d1, 16) + bitshift(d2, 8) + d3)*2^(-11);%корень квадратный из большей полуоси орбиты d1 = fread(fid,1,'bit8'); sign2 = sign(d1); d2 = fread(fid,1,'char'); d3 = fread(fid,1,'char'); omega0 =((bitshift(d1, 16) + bitshift(d2, 8) + d3)*2^(-23)) * pi; %долгота восходящего узла орбиты спут- ника d1 = fread(fid,1,'bit8'); sign1 = sign(d1); d2 = fread(fid,1,'char'); d3 = fread(fid,1,'char'); omega =((bitshift(d1, 16) + bitshift(d2, 8) + d3)*2^(-23)) * pi; %аргумент перигея d1 = fread(fid,1,'bit8'); d2 = fread(fid,1,'char'); d3 = fread(fid,1,'char');
    M0 =((bitshift(d1, 16) + bitshift(d2, 8) + d3)*2^(-23)) * pi;%средняя аномалия на время привязки t0a af0_1 = fread(fid,1,'char'); af0_1_bin = dec2bin(af0_1); d2 = fread(fid,1,'char'); d2bin = dec2bin(d2); d3 = fread(fid,1,'char'); d3bin = dec2bin(d3); maska = bin2dec('00011100'); d4 = bitand(d3,maska); af0_2 = bitshift(d4, -2); af0_dop = bitshift(af0_1, 3) + af0_2; koef = 2^(-20); af0 = var_sign(af0_dop,11,koef);%коэффициент коррекции времени af0
    % af1: maska = bin2dec('11100000'); d4 = bitand(d3,maska); af1_2 = bitshift(d2, 3); af1_1 = bitshift(d4, -5);
    169
    af1_dop = bitor(af1_2, af1_1); koef = 2^(-38); af1 = var_sign(af1_dop,11,koef);%коэффициент коррекции времени af1
    %-------------------------------------------------- if SV_ID > 0 alm(SV_ID)= struct('SV_ID',SV_ID, 'week',week, 'health_0', health_0, 'health',health, 'ecc',ecc,...
    't0a',t0a, 'incl_angle',incl_angle, 'omega_dot',omega_dot,...
    'sqrtA',sqrtA, 'omega0',omega0, 'omega', omega, 'M0',M0,...
    'af0',af0, 'af1',af1); end; end;
    %Формирование вывода данных альманаха в формате YUMA for i=1:30 %63 if alm(i).SV_ID > 0 if alm(i).SV_ID < 10 fprintf(fw,'**** Week %i almaNAU for PRN-0%i **********\n',alm(i).week, alm(i).SV_ID); fprintf(fw,'ID: 0%i\n',alm(i).SV_ID); else fprintf(fw,'**** Week %i almaNAU for PRN-%i **********\n',alm(i).week, alm(i).SV_ID); fprintf(fw,'ID: %i\n',alm(i).SV_ID); end; if alm(i).health < 10 fprintf(fw,'Health: %i0%i\n', alm(i).health_0, alm(i).health); else fprintf(fw,'Health: %i%i\n', alm(i).health_0, alm(i).health); end; strdop = e_norm(alm(i).ecc, 10); fprintf(fw,'Eccentricity: %s\n', strdop); fprintf(fw,'Time of Applicability(s): %6.4f\n',alm(i).t0a); fprintf(fw,'Orbital Incluation(rad): %0.10f \n',alm(i).incl_angle); strdop = e_norm(alm(i).omega_dot, 10); fprintf(fw,'Rate of Right Ascen(r/s): %s\n', strdop);
    170
    fprintf(fw,'SQRT(A) (m^1/2): %4.7f \n',alm(i).sqrtA); strdop = e_norm(alm(i).omega0, 10); fprintf(fw,'Right Ascen at Week(rad): %s\n', strdop); if alm(i).omega < 0 fprintf(fw,'Argument of Perigee(rad): %1.10f \n',alm(i).omega); else fprintf(fw,'Argument of Perigee(rad): %1.10f \n',alm(i).omega); end; strdop = e_norm(alm(i).M0, 10); fprintf(fw,'Mean Anom(rad): %s\n', strdop); strdop = e_norm(alm(i).af0, 10); fprintf(fw,'Af0(s): %s\n', strdop); strdop = e_norm(alm(i).af1, 10); fprintf(fw,'Af1(s/s): %s\n', strdop); fprintf(fw,'week: %i \n',alm(i).week); fprintf(fw,' \n'); end; %if alm(i).SV_ID > 0 end; %i
    %CR_C = fread(fid,1,'uint32');
    %CR_C = dec2hex(CR_C); fclose(fid);%закрытия файла для чтения fclose(fw);%закрытия файла для записи
    1   ...   6   7   8   9   10   11   12   13   14


    написать администратору сайта