Спутниковые системы навигации. Учебное пособие. Учебное пособие ( Лабораторный практикум на компьютере ) Київ 2008 1
Скачать 4.49 Mb.
|
5.4.2 Лабораторная работа 5. 4 «Модель движения и визуализация спутников GPS, ГЛОНАСС, GALILEO » Комплекс программ для выполнения настоящей работы основан на пакете Vsion_GLONASS_GPS, вкотором файл Vision_GLONASS_GPS.m заменяется файлом Vision_GL_GPS_GAL.m, а входными данными является альманах спутников трех сис- тем- GPS, ГЛОНАСС, GALILEO приведенный в приложении. Рекомендуется следующий порядок выполнения лабораторной работы. 1. Создайте папку Vision_GLONASS_GPS_GALILEO _My. 2. Скопируйте в папку Vision_GLONASS_GPS_GALILEO _My из Vsion_GLONASS_GPS функции и файлы, из папки Vi- sion_GLONASS_GPS_GALILEO файл Vision_GL_GPS_GAL.m, из приложения файл альманаха AlmGGG.yum. Комплекс готов к работе. Выполните задания 1, 2. 3. Задание 1 .Откройте файл Vision_GL_GPS_GAL.m, убедитесь в правильности введен- ных входных данных ( альманах , дата и время) исполните файл и результаты визуали- зации по каждой спутниковой системе внесите в отчет. 4. Задание 2. Измените в Vision_GL_GPS_GAL.m дату на 1 сутки, выполните файл, вне- сите результаты в отчет. Объясните причины, изменения местоположения спутников по каждой из систем. 5.4.3 Задание для самоподготовки Подготовьте сравнительную характеристику спутниковых радионавигационных систем GPS, ГЛОНАСС, GALILEO 186 5.4.4 Файл из папки Vision_GLONASS_GPS_GALILEO Файла Vision_GL_GPS_GAL.m clear all %Имя m-файла:Vision_GL_GPS_GAL.m %Программа рассчитывает углы видимости навигационных спутников GPS, ГЛОНАСС, GALLILEO %(азимута и места) спутников на заданный момент времени %Входные данные: %файл альманаха в формате Yuma,имя файла альманаха присваивается %переменной "Dat",например,Dat = 'имя файла альманаха'; %данные о начале отсчета "d2",d2='месяц/день/год';h=час;min=минута;s=секунда; %координаты позиции приемника -lat(широта в радианах),lon (долгота в радианах, %hr (высота в метрах); %шаг с каким будут рассчитываться параметры (step,секунды); %количество точек (L), в которых будут рассчитываться параметры орбит %L=12*3600/step,L читается так: количество часов (например,12) %число секунд в часе (3600) деленное на шаг (step) %Постоянные: %скорость вращения Земли OMEGAeDOT=7.2921151467e-005; %радиусы земного эллипсоида A_WGS84=6378137.0; B_WGS84=6356752.314; %константы mu=398600500000000; F_CONST = 4.442807633E-10; kt=1;%установка времени на титульной надписи графика, определяется параметрами d2'; h; min; s и j или L; %Задание цветов для графики color6(1:14) = ['k' 'b' 'g' 'r' 'c' 'm' 'r' ':' 'g' ':' 'b' ':' 'k' 'h']; %Входные данные Dat = 'AlmGGG.yum';%альманах спутников GPS, ГЛОНАСС, GALLILEO d2='12/21/2006'; h=14; min=52.0; s=58.0; %координаты точки, из которой наблюдаются спутники lat = 0.88032730015257;%50 градусов 26минут 20.54 секунд lon = 0.53109641675259;%30 градусов 25 минут 46.4995секунд hr=187.488;% метров X_label=['Широта' ':' num2str(lat) ';' 'долгота' ':' num2str(lon) ';' 'высота' ':' num2str(hr)]; 187 step=300;%шаг отсчета времени в секундах (300=5 минутам);шаг можно изменять step=0; %L=(24*3600) / step;% убрать % перед L для вывода таблицы улов видимости и азимута L=1;% установить % перед L для вывода таблицы улов видимости и азимута %Чтение альманаха [alm,max_kol] = Yuma_GPS_GLONAS_Alm(Dat); %max_kol = 32; nom = 1; i = 0; k = 0; i = 0; % for i = 1 : max_kol while ( i <91) id = alm(nom).ID; Health = alm(nom).Health; %fprintf('1: i=%i k=%i nom=%i id=%i Health=%i \n', i, k, nom, id, Health); if ( id > 0) Health = alm(nom).Health; if ( Health == 0) k = k + 1; nom_ns(k) = id; % fprintf('2: i=%i k=%i nom=%i id=%i Health=%i \n', i, k, nom, id, Health); nom = nom + 1; else nom = nom + 1; end; else nom = nom + 1; end; i = i + 1; end; % i kol = k; fprintf('kol=%i \n', kol); nom_ns % - номер навигационного спутника [Rx,Ry,Rz] = ECEFLLH(lon, lat,hr); %Rx=0;Ry=0;,Rz=0;%центр масс Земли %Начало отсчета текущего времени [week,modeweek,d,dweek,weeks]=Tim(d2,h,min,s); for j = 1% 0:L 188 % for j = 1:L % 0:L t( j )=weeks+step*(j); %-step; %t1(j) = t(j)/60; %изменение дискретности текущего времени %d_wn = (week - alm(i).Week); %d_wn = 0; for k = 1 : kol i = nom_ns(k) ; % input "i" !!! % fprintf('i=%i alm(i).Week= %i \n',i, alm(i).Week) d_wn=(modeweek - alm(i).Week);%если в альманахе не учтено 1024 tk = t(j) + d_wn * 604800 - alm(i).TOA; d_wn = abs(modeweek - alm(i).Week); dd = 302400.0 + d_wn * 604800; if ( ( alm(i).A05 > 0 ) & ( alm(i).Health == 0 ) ) while (abs(tk) > dd) if tk > dd tk = tk - 604800; else if tk < -dd tk = tk + 604800; end end % if end % while %Справочник по альманаху- цифра в скобках обозначает порядковый номер %параметра альманаха в формате YUMA %alm(ID).ID(1); alm(ID).Health(2); alm(ID).e(3); alm(ID).TOA(4); alm(ID).deltai(5); %alm(ID).OMEGADOT(6); alm(ID).A05(7); alm(ID).omega0(8); alm(ID).omega(9); %alm(ID).M0(10); alm(ID).Af0(11); alm(ID).Af1(12); alm(ID).Week(13); n0=sqrt((mu) / (alm(i).A05^6)); j2 = 1082.68E-6; re = (A_WGS84 + B_WGS84) / 2.; sin55 = sin(55.0 * pi / 180.0); dn = 1.5 * j2 * re * re / (alm(i).A05^4 ) * (1. - 1.5 * sin55 * sin55); %dn = 0; n=n0 * (1 + dn); 189 Mk = alm(i).M0 + n*tk; e=alm(i).e; %решение уравнения Кеплера eps = 1.0E-15; y = e * sin(Mk); x1 = Mk; x = y; for k = 0 : 15 % количество итераций x2 = x1; x1 = x; y1 = y; y = Mk - (x - e * sin(x)); if (abs(y - y1) < eps) break end x = (x2 * y - x * y1) / (y - y1); end % kepler Ek = x; deltr = F_CONST * alm(i).e * alm(i).A05 * sin(Ek); dt1 = alm(i).Af0 + alm(i).Af1 * tk + deltr; tk = tk - dt1; vd = 1. - alm(i).e * cos(Ek); nuk =atan2(sqrt(1-alm(i).e^2)*sin(Ek) / vd,(cos(Ek)-alm(i).e) / vd); Ek = acos((alm(i).e+cos(nuk))/(1+alm(i).e*cos(nuk))); Fk =nuk + alm(i).omega; uk =Fk; ik=alm(i).deltai; % alm(i) rk =(alm(i).A05^2)*(1.0-alm(i).e*cos(Ek)); xkk =rk*cos(uk); ykk =rk*sin(uk); OMEGAk =alm(i).omega0+(alm(i).OMEGADOT-OMEGAeDOT)*tk-OMEGAeDOT*alm(i).TOA; % fprintf('i=%i j=%i \n ',i, j); Xk(j,i) = xkk*cos(OMEGAk)-ykk*cos(ik)*sin(OMEGAk); Yk(j,i) = xkk*sin(OMEGAk)+ykk*cos(ik)*cos(OMEGAk); Zk(j,i) = ykk*sin(ik); %Дальности до спутников PR(j,i) = sqrt((Xk(j,i) - Rx)^2 + (Yk(j,i) - Ry)^2 + (Zk(j,i) - Rz)^2); 190 %Перевод в географическую систему если требуется %[lons,lats,hrs] = LLHECEF(Xk,Yk,Zk); %(Llon(j),Llat(j),Hhr(j)) = [lons,lats,hrs]; %расчет угла видимости спутника xls = Xk(j,i) - Rx; yls = Yk(j,i) - Ry; zls = Zk(j,i) - Rz; range1 = sqrt(xls*xls+yls*yls+zls*zls); if j>1 doppler(j-1) = (range1 - range2) * 5.2514 / step; end range2 = range1; P = sqrt(Rx * Rx + Ry * Ry + Rz * Rz); tdot = ( Rx*xls+Ry*yls+Rz*zls)/range1/P; xll = xls/range1; yll = yls/range1; zll = zls/range1; if tdot >= 1.00 b = 0.0; elseif tdot <= -1.00 b = pi; else b = acos( tdot); end satang = pi/2.0 - b; TT =satang; TT(j,i) =TT;%угол видимости спутников %расчет угла азимута спутников xn =-cos(lon)*sin(lat); yn =-sin(lon)*sin(lat); zn = cos(lat); xe =-sin(lon); ye = cos(lon); xaz = xe*xll + ye*yll; yaz = xn*xll + yn*yll + zn*zll; if (xaz == 0) or (yaz == 0) az(j)= 0; else az(j,i) = atan2(xaz,yaz); end 191 if az(j,i) < 0 az(j,i) = az(j,i) + pi*2; end AZ(j,i) =az(j,i) *180/pi;%угла азимута спутников в градусах EL(j,i) = TT(j,i) *180/pi;%угла видимости спутников в градусах % ПЕРЕСЧЕТ ВРЕМЕНИ A(j)=mod(t(j),86400); her(j)=floor(A(j)/3600); m(j)=floor((A(j)-her(j)*3600)/60); sek(j)=A(j)-her(j)*3600-m(j)*60; %Построение полярной системы координат if EL(j,i) < 0 elp = 180; else elp = (EL(j,i) - 90); end; azp = (AZ(j,i) + 90.0); rad = pi / 180; x0 = 0; y0 = 0; xt(j,i) = (elp * cos(azp * rad)); yt(j,i) = -(elp * sin(azp * rad)); % fprintf('i=%i j=%i \n' , i, j); end % i = ns end; % if ( alm(i).A05 > 0 ) end % j = time %ВНИМАНИЕ. Для вывода времени визуализации спутников на график установите kt t_itle=[d2 ' ' num2str(her(kt)) ':' num2str(m(kt)) ':' num2str(sek(kt))]; %X_label=['Широта' ':' num2str(lat) ';' 'долгота' ':' num2str(lon) ';' 'высота' ':' num2str(hr)]; %num2ctr(lat) %num2str(her(kt)) %X_label=['66' ':']; n = 6; max_n = max(nom_ns); n_end = mod(max(nom_ns),n); n_end = mod(kol, n); n2 = fix(kol / n) * n - n +1; 192 %Формирование таблицы вывода времени UTC (Time), GPS (Tgps в секундах), номера спутника (nns), % углов видимости и азимута от времени и номера спутника for i=1:n:kol fprintf(' Time Tgps '); for k=1: n nns = nom_ns(i+k-1); fprintf(' %2i ', nns); end; fprintf(' \n'); for j=1:L fprintf('%2i:%2i:%2i %i ',her(j),m(j),sek(j), t(j)); for k=1: n nns = nom_ns(i+k-1); fprintf('%6.1f *%6.1f ', EL(j,nns), AZ(j,nns) ); end; fprintf(' \n'); end ; % J=1:L if (i) == (n2) n = n_end; end; end% i hold on %Окружности уровней на круговой диаграмме видимости спутников k1 = 10; k2 = 30; k3 = 50; k4 = 70; k5 = 85; k6=90; n=0; for k=1:5:365 n=n+1; m1 = pi / 180; x(n)=cos(k*m1); y(n)=sin(k*m1); end; %График круговой диаграммы plot(k1*x(:),k1*y(:),'k:', k2*x(:),k2*y(:),'k:', k3*x(:),k3*y(:),'k:',k4*x(:),k4*y(:),'k:', k5*x(:),k5*y(:),'r', k6*x(:),k6*y(:),'r:'); text(5, 10,'80','FontSize',12,'FontName','TimesNewRoman'); 193 text(18, 23,'60','FontSize',12,'FontName','TimesNewRoman'); text(32, 37,'40','FontSize',12,'FontName','TimesNewRoman'); text(45, 50,'20','FontSize',12,'FontName','TimesNewRoman'); text(55, 60,'5','FontSize',12,'FontName','TimesNewRoman'); text(62, 67,'0','FontSize',12,'FontName','TimesNewRoman'); grid on; %Построение изображений видимых спутников на круговой диаграмме i=1; for k=1:kol i = nom_ns(k) ; if (i < 31) plot(xt(kt,i),yt(kt,i), 'Marker' ,'o','MarkerSize',20,'MarkerFaceColor','g' ) ; end; if ((i > 31) & ( i < 62)) plot(xt(kt,i),yt(kt,i), 'Marker' ,'o','MarkerSize',20,'MarkerFaceColor','r' ) ; end; if (i > 61) plot(xt(kt,i),yt(kt,i), 'Marker' ,'o','MarkerSize',20,'MarkerFaceColor','y' ) ; end; title(t_itle); xlabel(X_label,'FontSize',12,'FontName','TimesNewRoman') set(get(gcf,'CurrentAxes'),'FontSize',14,'FontName','TimesNewRoman') hold on str1 = num2str( i, 2); %{ if i<32 str1 = num2str( i, 2); else str1 = num2str( (i), 2); end %} text(xt(kt,i), yt(kt,i),str1,'FontSize',14,'FontName','TimesNewRoman','HorizontalAlignment','center' ); axis( [-100 100 -100 100]); %axis( [-90 90 -90 90]); end clear Результат выполнения программы изображен на рис. 5.5. 194 -100 -50 0 50 100 -100 -80 -60 -40 -20 0 20 40 60 80 100 80 60 40 20 5 0 12/21/2006 14:52:58 Широта:0.88033;долгота:0.5311;высота:187.488 3 7 14 16 18 19 21 22 26 29 38 44 45 59 61 64 65 66 72 73 74 75 80 81 82 83 91 Рис. 5.5. Видимость спутников GPS, ГЛОНАСС, GALILEO 5.4.5 Лабораторная работа 5. 5 «Орбиты спутников GPS, ГЛОНАСС, GALILEO » Цель лабораторной работы моделирование орбит спутников GPS, ГЛОНАСС, GALILEO Для одновременного расчета орбит спутников трех систем GPS, ГЛОНАСС, GALI- LEO пакет программ, сформированный в лабораторной работе 5. 4 может быть дополнен файлами ORBITA_GGG.m и map. m из папки ORBIT_GGG. Рекомендуется следующий порядок выполнения лабораторной работы. 1. Создайте папку ORBIT_GGG _My. 2. Из папки Vision_GLONASS_GPS_GALILEO скопируйте в папку ORBIT_GGG _My функции ECEFLLH, LLHECEF, Tim; файлы Yuma_GPS_GLONAS_Alm.m, AlmGGG.yum; из папки ORBIT_GGG файл ORBITA_GGG.m. 3. Запустите MatLab [7, 8]. 4. Обратитесь к папке ORBIT_GGG _My , откройте ее, изучите функции, файлы и про- граммные процедуры по комментариям и выполните задания 1, 2. 5. Задание 1. Откройте файл ORBITA_GGG.m. Сформируйте желаемую конфигурацию спутников, орбиты которых требуется рассчитать (см. комментарий к файлу). Устано- вите скорость вращения Земли, равную 0 (OMEGAeDOT=0). Выполните файл. Дайте описание, полученного графического изображения орбит. Результаты внесите в отчет. 6. Задание 2. В файле ORBITA_GGG.m сформируйте конфигурацию спутников: 1 спут- ник GPS, 1 спутник ГЛОНАСС, 1 спутник GALILEO. Установите 195 OMEGAeDOT=7.2921151467e-005. Выполните файл. Дайте описание, полученного графического изображения орбит. Результаты внесите в отчет. 5.4.6 Задания и вопросы для самоподготовки 1. Чем различаются орбиты спутников GPS, ГЛОНАСС, GALILEO? 2. По каким параметрам можно определить принадлежность спутника той или иной ор- бите? 3. Сформулируйте алгоритм определения дальности до спутника из точки наблюдения. 4. В какой системе координат рассчитываются углы видимости спутника? 5.4.7 Листинг файла ORBITA_GGG.m Файл ORBITA_GGG.m clear all %Имя m-файла:ORBITA_GGG.m %Программа рассчитывает орбиты спутников GPS, ГЛОНАСС, GALLILEO %Входные данные: %файл альманаха в формате Yuma,имя файла альманаха присваивается %переменной "Dat",например,Dat = 'имя файла альманаха'; %данные о начале отсчета "d2",d2='месяц/день/год';h=час;min=минута;s=секунда; %координаты позиции приемника -lat(широта в радианах),lon (долгота в радианах, %hr (высота в метрах); %шаг с каким будут рассчитываться параметры (step,секунды); %количество точек (L), в которых будут рассчитываться параметры орбит %L=12*3600/step,L читается так: количество часов (например,12) %число секунд в часе (3600) деленное на шаг (step) %Выходные данные: %Xk(j,i) - координата X спутника с номером i на момент времени j; %Yk(j,i) - координата Y спутника с номером i на момент времени j; %Zk(j,i) - координата Z спутника с номером i на момент времени j; %Примечание: входные и выходные данные могут быть дополнены / изменены закомментированны- ми %параметрами, помеченными строкой %%%%%%%%%%%%%%%%%%%%%%%; %Постоянные: %скорость вращения Земли %OMEGAeDOT=7.2921151467e-005; OMEGAeDOT=0;%%%%%%%%%%%%%%для орбитальных плоскостей %радиусы земного эллипсоида A_WGS84=6378137.0; B_WGS84=6356752.314; %константы mu=398600500000000; 196 F_CONST = 4.442807633E-10; %Задание цветов для графики j_color = 0; color6(1:11) = ['B' 'B' 'B' 'B' 'B' 'B' 'o' 'o' '+' '+' '+'];%%%%%%%%%%%%%%%%%%%%%%% %Входные данные Dat = 'AlmGGG.yum';%альманах спутников GPS, ГЛОНАСС, GALLILEO N=6378136;% радиус Земли (используется, как нормирующий коэффициент map(N);%функция выводит на графики Землю d2='12/21/2006'; %%%%%%%%%%%%%%%%%%%%%%% h=14; min=52.0; s=58.0;%%%%%%%%%%%%%%%%%%%%%%% %координаты точки, из которой наблюдаются спутники lat = 0.88032730015257;%50 градусов 26минут 20.54 секунд %%%%%%%%%%%%%%%%%%%%%% lon = 0.53109641675259;%30 градусов 25 минут 46.4995секунд %%%%%%%%%%%%%%%%%%%%% hr=187.488;% метров %%%%%%%%%%%%%%%%%%%%%%% step=600;%шаг отсчета времени в секундах (300=5 минутам);шаг можно изменять %step=0; L=(12*3600) / step;% убрать перед L для вывода таблицы улов видимости и азимута %%%%%%%%%% %L=1;% установить % перед L для вывода таблицы улов видимости и азимута %Чтение альманаха [alm,max_kol] = Yuma_GPS_GLONAS_Alm(Dat);%%%%%%%%%%%%%%%%%%%%%%% nom = 1; i = 0; k = 0; i = 0; while ( i <91) id = alm(nom).ID; Health = alm(nom).Health; if ( id > 0) Health = alm(nom).Health; if ( Health == 0) k = k + 1; nom_ns(k) = id; nom = nom + 1; else nom = nom + 1; end; else 197 nom = nom + 1; end; i = i + 1; end; % i kol = k; nom_ns ; % - номер навигационного спутника [Rx,Ry,Rz] = ECEFLLH(lon, lat,hr);%%%%%%%%%%%%%%%%%%%%%%% [week,modeweek,d,dweek,weeks]=Tim(d2,h,min,s); for j = 1:L % for j = 1:L % 0:L t( j )=weeks+step*(j); %-step;%%%%%%%%%%%%%%%%%%%%%%% %t1(j) = t(j)/60; %изменение дискретности текущего времени %d_wn = (week - alm(i).Week); %d_wn = 0; kol=11;%%%%%%%%%%%%%%%%%%%%%%% nom_ns(1:kol) =[1 3 4 5 9 10 38 58 62 72 82 ];%%%%%%%%%%%%%%%%%%%%%%% for k = 1 : kol i = nom_ns(k) ; % input "i" !!! d_wn=(modeweek - alm(i).Week);%если в альманахе не учтено 1024 tk = t(j) + d_wn * 604800 - alm(i).TOA; d_wn = abs(modeweek - alm(i).Week); dd = 302400.0 + d_wn * 604800; if ( ( alm(i).A05 > 0 ) & ( alm(i).Health == 0 ) ) while (abs(tk) > dd) if tk > dd tk = tk - 604800; else if tk < -dd tk = tk + 604800; end end % if end % while %Справочник по альманаху- цифра в скобках обозначает порядковый номер %параметра альманаха в формате YUMA %alm(ID).ID(1); alm(ID).Health(2); alm(ID).e(3); alm(ID).TOA(4); alm(ID).deltai(5); %alm(ID).OMEGADOT(6); alm(ID).A05(7); alm(ID).omega0(8); alm(ID).omega(9); %alm(ID).M0(10); alm(ID).Af0(11); alm(ID).Af1(12); alm(ID).Week(13); n0=sqrt((mu) / (alm(i).A05^6)); j2 = 1082.68E-6; re = (A_WGS84 + B_WGS84) / 2.; sin55 = sin(55.0 * pi / 180.0); dn = 1.5 * j2 * re * re / (alm(i).A05^4 ) * (1. - 1.5 * sin55 * sin55); 198 %dn = 0; n=n0 * (1 + dn); Mk = alm(i).M0 + n*tk; e=alm(i).e; %решение уравнения Кеплера eps = 1.0E-15; y = e * sin(Mk); x1 = Mk; x = y; for k = 0 : 15 % количество итераций x2 = x1; x1 = x; y1 = y; y = Mk - (x - e * sin(x)); if (abs(y - y1) < eps) break end x = (x2 * y - x * y1) / (y - y1); end % kepler Ek = x; deltr = F_CONST * alm(i).e * alm(i).A05 * sin(Ek); dt1 = alm(i).Af0 + alm(i).Af1 * tk + deltr; tk = tk - dt1; vd = 1. - alm(i).e * cos(Ek); nuk =atan2(sqrt(1-alm(i).e^2)*sin(Ek) / vd,(cos(Ek)-alm(i).e) / vd); Ek = acos((alm(i).e+cos(nuk))/(1+alm(i).e*cos(nuk))); Fk =nuk + alm(i).omega; uk =Fk; ik=alm(i).deltai; rk =(alm(i).A05^2)*(1.0-alm(i).e*cos(Ek)); xkk =rk*cos(uk); ykk =rk*sin(uk); OMEGAk =alm(i).omega0+(alm(i).OMEGADOT-OMEGAeDOT)*tk-OMEGAeDOT*alm(i).TOA; Xk(j,i) = xkk*cos(OMEGAk)-ykk*cos(ik)*sin(OMEGAk); Yk(j,i) = xkk*sin(OMEGAk)+ykk*cos(ik)*cos(OMEGAk); Zk(j,i) = ykk*sin(ik); %%%%%%%%%%%%%%%%%%%%%%% %{ %Дальности до спутников PR(j,i) = sqrt((Xk(j,i) - Rx)^2 + (Yk(j,i) - Ry)^2 + (Zk(j,i) - Rz)^2); %Перевод в географическую систему если требуется %[lons,lats,hrs] = LLHECEF(Xk,Yk,Zk); 199 %(Llon(j),Llat(j),Hhr(j)) = [lons,lats,hrs]; %расчет угла видимости спутника xls = Xk(j,i) - Rx; yls = Yk(j,i) - Ry; zls = Zk(j,i) - Rz; range1 = sqrt(xls*xls+yls*yls+zls*zls); if j>1 doppler(j-1) = (range1 - range2) * 5.2514 / step; end range2 = range1; P = sqrt(Rx * Rx + Ry * Ry + Rz * Rz); tdot = ( Rx*xls+Ry*yls+Rz*zls)/range1/P; xll = xls/range1; yll = yls/range1; zll = zls/range1; if tdot >= 1.00 b = 0.0; elseif tdot <= -1.00 b = pi; else b = acos( tdot); end satang = pi/2.0 - b; TT =satang; TT(j,i) =TT;%угол видимости спутников %расчет угла азимута спутников xn =-cos(lon)*sin(lat); yn =-sin(lon)*sin(lat); zn = cos(lat); xe =-sin(lon); ye = cos(lon); xaz = xe*xll + ye*yll; yaz = xn*xll + yn*yll + zn*zll; if (xaz == 0) or (yaz == 0) az(j)= 0; else az(j,i) = atan2(xaz,yaz); end if az(j,i) < 0 az(j,i) = az(j,i) + pi*2; 200 end AZ(j,i) =az(j,i) *180/pi;%угла азимута спутников в градусах EL(j,i) = TT(j,i) *180/pi;%угла видимости спутников в градусах % ПЕРЕСЧЕТ ВРЕМЕНИ A(j)=mod(t(j),86400); her(j)=floor(A(j)/3600); m(j)=floor((A(j)-her(j)*3600)/60); sek(j)=A(j)-her(j)*3600-m(j)*60; %Построение полярной системы координат if EL(j,i) < 0 elp = 180; else elp = (EL(j,i) - 90); end; azp = (AZ(j,i) + 90.0); rad = pi / 180; x0 = 0; y0 = 0; xt(j,i) = (elp * cos(azp * rad)); yt(j,i) = -(elp * sin(azp * rad)); %} %%%%%%%%%%%%%%%%%%%%%%%% end % i = ns end; % if ( alm(i).A05 > 0 ) end % j = time for (i=1:kol) j_color = j_color + 1; if (j_color > 11 ) j_color = 1; end S = color6(j_color); prn = nom_ns(i); %%%%%%%%%%%%%%%%%%%%%%% hold on h_F1 = gca; plot3(Xk(:,prn),Yk(:,prn),Zk(:,prn),S,'LineWidth',0.5); axis([ -2.552*10^(7) 2.552*10^(7) -2.552*10^(7) 2.552*10^(7) -2.552*10^(7) 2.552*10^(7)]); set(get(gcf,'CurrentAxes'),'FontSize',14,'FontName','TimesNewRoman'); set(h_F1,'Position',[0.1 0.1 0.85 0.9]) ; xlabel('Координата X') 201 ylabel('Координата Y'), zlabel('Координата Z'),grid on str1 = num2str( prn); text(Xk(j,prn), Yk(j,prn),Zk(j,prn),str1,'FontSize',14,'FontName','TimesNewRoman','HorizontalAlignment','center' ); hold on %%%%%%%%%%%%%%%%%%%%%%% end clear 5.4.8 Пример выполнения файла:ORBITA_GGG.m Результат выполнения программы изображен на рис. 5.6. Рис. 5.6. Орбиты спутников GPS, ГЛОНАСС, GALILEO На рис. 5.6 сплошными линиями показаны 6 орбит спутников GPS, маркером «о» 2 орбиты ГЛОНАСС, маркером «+» 3 орбиты GALILEO; цифрами обозначены номера спутников соответствующих систем. 5.5 Декодирование и расшифровка данных спутников ГЛОНАСС 5.5.1 Краткие сведения из теории В данном подразделе приводится программа декодирования данных спутников ГЛОНАСС. Данные, которые декодируются получены экспериментально с реального на- 202 вигационного приемника после корреляционной обработки в виде последовательности символов «0» и «1». Поскольку объем данных относительной большой около 60000 сим- волов, то приводятся два вспомогательных m-файла. Эти вспомогательные программы по- зволяют сформировать данные на бумажном носителе в виде последовательности шестна- дцатеричных чисел, из которых можно восстановить m-файл для декодирования. Экспе- риментальные данные рассматриваемые далее представляют собой символы длительно- стью 10 миллисекунд и являются составляющими информационных символов сложенных по модулю 2 с меандром имеющим частоту 100 Гц. Примененный алгоритм декодирования основан на строгом соответствии данных, передаваемых с навигационного спутника ГЛОНАСС, которые соответствуют формату сообщений. Более подробно формат сообщений и данные, передаваемые в кадрах сообще- ний приводятся в интерфейсном контрольном документе ГЛОНАСС и в книге [1] под- раздел 2. 2, стр. 77- 87). Комплекс программ декодирования и расшифровки находится в папке Decod_GLONASS. Цель лабораторной работы освоение и применение методики декодирования и расшифровки данных спутниковой системы ГЛОНАСС. 5.5.2 Лабораторная работа 5. 6 «Декодирование данных спутников ГЛОНАСС в на- вигационном приемнике» Рекомендуется следующий порядок выполнения лабораторной работы. 1. Создайте папку Decod_GLONASS _My и скопируете в ее файлы и функции из папки Decod_GLONASS. 2. Запустите MatLab. 3. Обратитесь к папке Decod_GLONASS _My , откройте ее, изучите функции, файлы и программные процедуры по комментариям и выполните задания 1, 2. 4. Задание 1. Откройте файл Hex_GLONASS.m. Изучите программные процедуры фай- ла, используя его текст и расширенный комментарий. Файл преобразования экспериментальных данных в шестнадцатеричные симво- лы Hex_GLONASS.m %Имя m- файла: Hex_GLONASS.m %Файл Hex_GLONASS.m предназначен для преобразования экспериментальных данных, записанных %в фйле с именем raw_bits_SV18J.dat в файл SV1.dat, записанный в шестнадцатеричных символах name_in = 'raw_bits_SV18J.dat'; % имя экспериментального файла fw = fopen('SV1.dat','Wt');%имя файла в шестнадцатеричных символах M=dlmread(name_in);%чтение экспериментального файла в матрицу M %чтение двоичных символов в 1875 строк по 16 символов в строке [ ] ( 203 for i=1:1875 str_danD(i,:)=sprintf('%d',M(i+15*(i-1):(15+i+15*(i-1)))); end bin_dec=bin2dec(str_danD);%преобразование строк символов в десятичные числа dec_hex=dec2base(bin_dec,16)';%преобразование десятичных чисел в шестнадцатеричные fprintf(fw,'%c',dec_hex);%запись файла в шестнадцатеричном представлении fclose(fw);%закрытие записанного файла Расширенный комментарий к файлу Hex_GLONASS.m. При условии, что имеется файл данных спутника с именем raw_bits_SV18J.dat ре- зультат выполнения m- файла: Hex_GLONASS.m, записанный под именем SV1.dat и про- читанный клавишей F3 файла в Total Commander в шестнадцатеричном представлении имеет вид AAD34B52CAAB3534B52CAB5332ACD4AD3F1BA84B2D4AB4D4B54ACD54AAD555555555555555555552 B2BF1BA84B2D34ACB4D5555555554B54AAAAAAAAAAAAAAAAACB33F1BA84B2CB52D3555334ACAA D4B55552B32CACAAB4AB2B34D3F1BA84B2CCB4B54D52AAAB2B2CAACB535554AB4ACD54B52CB3F1 BA84B354AD3554ACCB2D2AAAACAAAD4CB2D35554ACAD4D2BF1BA84B352CCCCD4CD52D534D534C B535554D53532AD2AB34BF1BA84B34B52CD52B4CD52AD54B52AAD4CB34CAAD4B352D2B3F1BA84B34 D32AAACCD4B5532CB5334ACAAAAD2D532AD34AACBF1BA84B32B5354AAB4CD2B2CAB552AAD534B 35555532CD2D4BF1BA84B32CAAB2B2AAB32B55554CCB535554D535352ACAB4ABF1BA84B33555555555 5555555555555555555555555554D2ABF1BA84B332AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABF1BA84B2AD2B534B54B4B34CB5334CAB54D2CB2AD32D2D2B33F1BA84B2B554ACB554AB3 534B4D4D4AAACAB4ACAD4B54D32D3F1BA84B2B32AAAB55552CB4AD3554CACB4AD354ACCD532CB 4BF1BA84B2D4AB4D4B54ACD54AAD555555555555555555552B2BF1BA84B2D34ACB4D5555555554B54A AAAAAAAAAAAAAAAACB33F1BA84B2CAAAAD55555555555555555555555555555554D4B3F1BA84B2C D555555555555555555555555555555555554D2B3F1BA84B355554AAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAB534BF1BA84B352AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3F1BA84B3 4B554CACAAB4D2D4B4AD3552D4D32D54AD4B54B4ABF1BA84B34CCB34CD33552B2AAACD34AD3333 552D4CACAACCCBF1BA84B32AAAD555555555555555555555555555555554D4B3F1BA84B32D5555555555 555555555555555555555555552D53F1BA84B334AAD34B2AAB52D4CCB32AAD2B2D55554D2D2D54D3F1B A84B332CACB534AAB2CCACAAD34AD3333552D4D2AD4ACD3F1BA84B2AD2B534B534B4CB34ACCB35 4AB2D34D52CD2D332ABF1BA84B2B554ACB554AB3534B4D4D4AAACAB4ACAD4B54D32D3F1BA84B2B 32AAAB55552CB4AD3554CACB4AD354ACCD532CB4BF1BA84B2D4AB4D4B54ACD54AAD555555555555 555555552B2BF1BA84B2D34ACB4D5555555554B54AAAAAAAAAAAAAAAAACB33F1BA84B2CAAACA AAD32AD3554D2CCAAD2B2ACAAAD4D2B33333F1BA84B2CD4CCAD32D4AACCAB4B2CB52CCCD334 D4D2D4AB4CBF1BA84B355553354B4D552CCB54ACAACAAD333554B4CB4CAD3F1BA84B352D4B4B32D 4D34B532D4CB52CCCD4B52B2D4CAB54BF1BA84B34AAB554B55354ACAD3553553554CACAACAACAC D2ABF1BA84B34D4B2B32B52B4D55354D34AD3332AAD2B2D2AACD4BF1BA84B32AAB52AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAB554BF1BA84B32D5555555555555555555555555555555555552D53F1 BA84B33554B5555555555555555555555555555555552D4BF1BA84B332AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABF1BA84B2AD2B534B4B4B4CB34ACCB354AB2D34D52CD2D354CBF1BA84B 2B554ACB554AB3534B4D4D4AAACAB4ACAD4B54D32D3F1BA84B2B32AAAB55552CB4AD3554CACB4A D354ACCD532CB4BF1BA84B2D4AB4D4B54ACD54AAD555555555555555555552B2BF1BA84B2D34ACB4 D5555555554B54AAAAAAAAAAAAAAAAACB33F1BA84B2CAAB4D55555555555555555555555555555555 2B53F1BA84B2CD555555555555555555555555555555555554D2B3F1BA84B35554D555555555555555555555 5555555555552D4BF1BA84B352AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3F1BA84B 34AAB2D55555555555555555555555555555554D4B3F1BA84B34D555555555555555555555555555555555555 2D4BF1BA84B32AAB35555555555555555555555555555555552B53F1BA84B32D555555555555555555555555 5555555555552D53F1BA84B33554CD55555555555555555555555555555554D2ABF1BA84B332AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF1BA84B2AD2B534B4CB4B34CB5334CAB54D2CB2A D32D2D4D53F1BA84B2B554ACB554AB3534B4D4D4AAACAB4ACAD4B54D32D3F1BA84B2B32AAAB555 52CB4AD3554CACB4AD354ACCD532CB4BF1BA84B2D4AB4D4B54ACD54AAD555555555555555555552B 204 2BF1BA84B2D34ACB4D5555555554B54AAAAAAAAAAAAAAAAACB33F1BA84B2CAAD55555555555555 555555555555555555552B33F1BA84B2CD555555555555555555555555555555555554D2B3F1BA84B354AD52 AAAD4CAB54CD54AAAD534AB4AAACB2B2B533F1BA84B352ACD2B52D2D5554AAACCB535554B2D53 52B4B4B53F1BA84B34B52B4AB4D332D54CAD34AAD52CD4D52AAD34D4CB3F1BA84B34CCAAD554AC ACCACCD3334AD3334ACCAAB2D2AAD4BF1BA84B32AAD4D555555555555555555555555555555552B2B F1BA84B32D5555555555555555555555555555555555552D53F1BA84B33552D55555555555555555555555555 5555554D2CBF1BA84B332AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF1BA84B2AD 2B534B2B4B4CB34ACCB354AB2D34D52CD2D354D3F1BA84B2B554ACB554AB3534B4D4D4AAACAB4A CAD4B54D32D3F1BA84B2B2D5554AAAAD34B52CAAB3534B52CAB5332ACD4AD3F1BA84B2D4AB4D4B 54ACD54AAD555555555555555555552B2BF1BA84B2D34ACB4D5555555554B54AAAAAAAAAAAAAAAA ACB33F1BA84B2CB52D3555334ACAAD4B55552B32CACAAB4AB2B34D3F1BA84B2CCB4B54D52AAAB2 B2CAACB535554AB4ACD54B52CB3F1BA84B354AD3554ACCB2D2AAAACAAAD4CB2D35554ACAD4D2 BF1BA84B352CCCCD4CD52D534D534CB535554D53532AD2AB34BF1BA84B34B52CD52B4CD52AD54B52 AAD4CB34CAAD4B352D2B3F1BA84B34D32AAACCD4B5532CB5334ACAAAAD2D532AD34AACBF1BA8 4B32B5354AAB4CD2B2CAB552AAD534B35555532CD2D4BF1BA84B32CAAB2B2AAB32B55554CCB53555 4D535352ACAB4ABF1BA84B335555555555555555555555555555555555554D2ABF1BA84B332AAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF1BA84B2AD2B534B2CB4B34CB5334CAB54D2CB2A D32D2D4D4BF1BA84B2B554ACB554AB3534B4D4D4AAACAB4ACAD4B54D32D3F1BA84B2B32AAAB555 52CB4AD3554CACB4AD354ACCD532CB4BF1BA84B2D4AB4D4B54ACD54AAD555555555555555555552B 2BF1BA84B2D34ACB4D5555555554B54AAAAAAAAAAAAAAAAACB33F1BA84B2CAAAAD55555555555 555555555555555555554D4B3F1BA84B2CD555555555555555555555555555555555554D2B3F1BA84B355554 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB534BF1BA84B352AAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAB3F1BA84B34B554CACAAB4D2D4B4AD3552D4D32D54AD4B54B4ABF1BA84 B34CCB34CD33552B2AAACD34AD3333552D4CACAACCCBF1BA84B32AAAD555555555555555555555555 555555554D4B3F1BA84B32D5555555555555555555555555555555555552D53F1BA84B334AAD34B2AAB52D 4CCB32AAD2B2D55554D2D2D54D3F1BA84B332CACB534AAB2CCACAAD34AD3333552D4D2AD4ACD3 F1BA84B2AD2B534B34B4B34CB5334CAB54D2CB2AD32D2D2B2BF1BA84B2B554ACB554AB3534B4D4D4 AAACAB4ACAD4B54D32D3F1BA84B2B32AAAB55552CB4AD3554CACB4AD354ACCD532CB4BF1BA84B 2D4AB4D4B54ACD54AAD555555555555555555552B2BF1BA84B2D34ACB4D5555555554B54AAAAAAAA AAAAAAAAACB33F1BA84B2CAAACAAAD32AD3554D2CCAAD2B2ACAAAD4D2B33333F1BA84B2CD4 CCAD32D4AACCAB4B2CB52CCCD334D4D2D4AB4CBF1BA84B355553354B4D552CCB54ACAACAAD333 554B4CB4CAD3F1BA84B352D4B4B32D4D34B532D4CB52CCCD4B52B2D4CAB54BF1BA84B34AAB554B5 5354ACAD3553553554CACAACAACACD2ABF1BA84B34D4B2B32B52B4D55354D34AD3332AAD2B2D2A ACD4BF1BA84B32AAB52AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB554BF1BA84B32D55555555 55555555555555555555555555552D53F1BA84B33554B5555555555555555555555555555555552D4BF1BA84B 332AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF1BA84B2AD2B534B334B4CB34AC CB354AB2D34D52CD2D332B3F1BA84B2B554ACB554AB3534B4D4D4AAACAB4ACAD4B54D32D3F1BA8 4B2B32AAAB55552CB4AD3554CACB4AD354ACCD532CB4BF1BA84B2D4AB4D4B54ACD54AAD5555555 55555555555552B2BF1BA84B2D34ACB4D5555555554B54AAAAAAAAAAAAAAAAACB33F1BA84B2CAA B4D555555555555555555555555555555552B53F1BA84B2CD555555555555555555555555555555555554D2B3 F1BA84B35554D5555555555555555555555555555555552D4BF1BA84B352AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAB3F1BA84B34AAB2D55555555555555555555555555555554D4B3F1BA84B34 D5555555555555555555555555555555555552D4BF1BA84B32AAB35555555555555555555555555555555552B 53F1BA84B32D5555555555555555555555555555555555552D53F1BA84B33554CD55555555555555555555555 555555554D2ABF1BA84B332AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF1BA84B2 AD2B534D54B4B34CB5334CAB54D2CB2AD32D2CD4ABF1BA84B2B554ACB554AB3534B4D4D4AAACAB 4ACAD4B54D32D3F1BA84B2B32AAAB55552CB4AD3554CACB4AD354ACCD532CB4BF1BA84B2D4AB4D 4B54ACD54AAD555555555555555555552B2BF1BA84B2D34ACB4D5555555554B54AAAAAAAAAAAAAA AAACB33F1BA84B2CAAD55555555555555555555555555555555552B33F1BA84B2CD5555555555555555555 55555555555555554D2B3F1BA84B354AD52AAAD4CAB54CD54AAAD534AB4AAACB2B2B533F1BA84B35 2ACD2B52D2D5554AAACCB535554B2D5352B4B4B53F1BA84B34B52B4AB4D332D54CAD34AAD52CD4D 52AAD34D4CB3F1BA84B34CCAAD554ACACCACCD3334AD3334ACCAAB2D2AAD4BF1BA84B32AAD4D 555555555555555555555555555555552B2BF1BA84B32D5555555555555555555555555555555555552D53F1B A84B33552D555555555555555555555555555555554D2CBF1BA84B332AAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAABF1BA84B2AD2B534D534B4CB34ACCB354AB2D34D52CD2D2CD33F1BA84B 2B554ACB4000000000000000000000000000000000000000000000000000 Этот результат можно было получить при условии, что имеется эксперименталь- ный файл raw_bits_SV18J.dat. Если экспериментального файла нет, то из его шестнадцате- ричного представления, приведенного выше можно сформировать файл для последующе- 205 го декодирования. Для этого скопируем приведенное шестнадцатеричное представление файла и запишем его в виде файла с именем FilGL1.txt с помощью текстового редактора. В форму для декодирования (эта форма в точности соответствует файлу raw_bits_SV18J.dat файл FilGL1.txt преобразуется с помощью программы HexBin_GLONASS.m. Файл HexBin_GLONASS.m %Имя m- файла: HexBin_GLONASS.m %Файл HexBin_GLONASS предназначен для преобразования файла FilGL1.txt %в шестнадцатеричных символах в файл FilGL1_bin.txt в символах "0" и "1" name_in1='FilGL1.txt';%имя файла в шестнадцатеричном представлении fid = fopen(name_in1,'rt'); %открытие файла fw_bin=fopen('FilGL1_bin.txt','wb');%запись преобразованного файла %чтение и переформатирование файла MAS = fscanf(fid,'%s'); for i=1:1875 str_MAS(1:4,i)=sprintf('%s',MAS(i+3*(i-1):(3+i+3*(i-1)))); end MATR=reshape(MAS,4,1875)'; hex_dec= base2dec(MATR,16);%преобразование шестнадцатеричных чисел в десятичные dec_bin= dec2bin(hex_dec)';%преобразование десятичных чисел в двоичные MATR_Char = reshape(dec_bin,1,1875*16);%преобразование в строку %fprintf(fw_bin,'%c ',MATR_Char);%запись файла в символах "0" и "1"(вариант, пробел после с имеет значение) fprintf(fw_bin,'%c\n',MATR_Char);%запись файла в символах "0" и "1" (вариант) fclose(fw_bin);% закрытие файла Файлы FilGL1.txt (восстановленный из шестнадцетиричного) и raw_bits_SV18J.dat (экспериментальный) одинаковы и применяя любой из них можно проводить декодирова- ние данных спутников ГЛОНАСС. Прежде чем приступить к обработке данных файла FilGL1.txt рассмотрим процесс формирования и декодирования в навигационном приемнике информационного навигаци- онного сигнала. Этот процесс может быть представлен в виде следующей блок – схемы (рис. 5.7). Информация, передаваемая с каждого навигационного спутника представляет собой непрерывный поток информационных символов. Начала отсчетов передачи данных нуль часов Московского времени (начало передачи первого суперкадра каждые сутки). Структурно поток цифровой информации (ЦИ) формируется в виде непрерывно по- вторяющихся суперкадров (рис. 5.8). 206 207 Рис. 5.7. Формирование и декодирование радионавигационного сигнала 1. Формирование навигационной информации 2. Форматирование навигационной информации 3. Преобразование навигационной информации в двоичный код 4. Формирование информационных сигналов, соот- ветствующих двоичному коду методом двухпози- ционной фазовой манипуляции с частотой 50 Гц 5. Преобразование информационных сигналов в сигналы с относительной фазовой манипуляцией 6. Сложение по модулю 2 информационных сигналов с меандровым колебанием частоты 100 Гц и выделе- ние 170 символов длительностью 10 миллисекунд 7. Дополнение 170 символов тридцатью символами кода метки времени (символ кода метки времени име- ет длитальность 10 миллисеконд). Окончание формирования одной строки навигацион- ногокадра Итог: 200 символов по 10 миллисекунд (2 секунды- время передачи 1 строки) А 208 Рис. 5.7. Формирование и декодирование радионавигационного сигнала (продолжение) А 9. Модуляция несущих частот спутника полученным сигналом 10. Демодуляция радионавигационного сигнала 11.Корреляционная обработка демодулированного сигнала. Итог: поток символов длительностью 10 миллисекунд 12. Определение границ строк Выделяются строки длиной по 170 бит 13. Выделение информационных символов каждой строки Выделяются 77 символов информации и 8 провероч- ных символов (код Хемминга) 14. Проверка правильности считанной информации и исправление ошибок 15. Дешифровка двоичных символом 15. Декодирование двоичных символом 16. Перевод декодированных сигналов в десятичный эквивалент 17. Конец декодирования 8. Сложение по модулю 2 информационных сигналов с псевдослучайным кодом стандартной точности с частотой 0.511 МГц 209 Рис. 5.8. Изображение потока данных навигационного спутника В приведенной далее программе декодирования навигационных данных спутников ГЛОНАСС выполняются процедуры п. п. 12… 17 (рис. 5.7) по данным п. 11 в соответст- вии с ИКД ГЛОНАСС. 5. Задание 2. Откройте файл Decod_GL3.m. Изучите программные процедуры файла, ис- пользуя его текст и расширенный комментарий. Выполните файл и в командном окне MatLab прочитайте результат декодирования и занесите его в отчет. 5.5.3 Задания и вопросы для самоподготовки 1. Изучите форматы сообщений спутников ГЛОНАСС? 2. Что понимается под суперкадром, кадром, строкой и словом в сообщениях спутников ГЛОНАСС? 3. Что понимается под оперативной и неоперативной информацией, передаваемой со спутников ГЛОНАСС? 4. Как контролируется достоверность информации, передаваемой со спутников ГЛО- НАСС? 5. Как выполняется преобразование между системами счисления: переход из двоичной системы счисления в десятичную и наоборот; переход из шестнадцатеричной системы счисления в десятичную и наоборот; переход из двоичной системы счисления в шест- надцатеричную и наоборот? 6. Что такой бит, байт, младший разряд, старший разряд? … Метеки времени Информационные символы строк (строка передается в течение 1.7 секунды) Начало суток Окончание суток 5.5.4 Листинг файла : Decod_GL3.m %Имя m- файла:Decod_GL3.m %Программа декодирования данных спутников ГЛОНАСС %Символы метки времени Met=[1 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 1 0 0 0 0 1 0 0 1 0 1 1 0]; %Открытие файла для считывания данных %fid = fopen('raw_bits_SV18J.dat','rb') %fid = fopen( 'SV18fw_bin.txt','rb') fid = fopen('FilGL1_bin.txt','rb') if fid=-1 kol = 0;%Порядковый номер считываемых данных while (kol < 24) %Поиск и обнаружение меток времени в массиве данных for i = 1:30 MAS(i) = fscanf(fid,'%d',1); end C = xor(MAS, Met); D = any(C); kk = 0; while ( (feof(fid)==0) & (D == 1) ) MAS(1:29) = MAS(2:30); ch = fscanf(fid,'%d',1); MAS(30) = ch; C = xor(MAS, Met); D = any(C); %0 - all 0 kk = kk + 1; end % while %Считывание данных строк kol = kol + 1 for i = 1:170 danDDD(i)= (fscanf(fid,'%d',1)); end; str_danDDD=sprintf('%d',danDDD(1:170)); %Сложение данных по модулю 2 с меандром for i = 1:170 meandr = rem((i-1), 2); %остаток от деления на 2 ((i-1)/2) danDD(i) = xor(danDDD(i), meandr); end; % for i = 1:170 210 % DD = danDD %Выделение информационных символов dd1 = danDD(1:2:169); dd2 = danDD(2:2:170); ddxor = xor(dd1, dd2); Dany = any(ddxor); str1(1) = dd1(1); %Перевод данных из относительного кода for i = 2:85 str1(i) = xor(dd1(i-1), dd1(i)); end; % Контроля четности (правильности) принятых данных Skod(1,1:85)=[0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 0 1 ... 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 ... 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 ... 0 1 0 1 0 1 0 1 0 1 0 1 0]; Skod(2,1:85)=[0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 1 1 0 1 1 0 0 1 1 ... 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 ... 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 1 0 0 1 1 ... 0 0 1 1 0 0 1 1 0 0 1 1 0]; Skod(3,1:85)=[0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 ... 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 ... 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 ... 0 0 0 0 1 1 1 1 0 0 0 0 1]; Skod(4,1:85)=[0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 ... 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ... 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 ... 1 1 1 1 1 1 1 1 0 0 0 0 0]; Skod(5,1:85)=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 1 1 1 0]; Skod(6,1:85)=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0 0]; 211 Skod(7,1:85)=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1 1 1 1]; Skod(8,1:85)=[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ... 1 1 1 1 1 1 1 1 1 1 1 1 1]; E = rot90(eye(85)); for k=1:8 Vi1 = Skod(k,1:85) * E; STR1Vi = and(str1,Vi1); a1 = sum(STR1Vi); n = floor(a1 / 2); c1 = a1 - n * 2; if (k <8) cc_all(kol,k)=xor(c1,str1(86 - k)); else cc_all(kol,k)=c1; end; end; %Декодирование номеров строк num4 = str1(2:5); NN1 = sprintf('%d',num4); num(kol)=bin2dec(NN1); %Вывод данных строк str_danDDD1=sprintf('%d',num(kol),danDDD(1:85)); str_danDDD2=sprintf('%d',num(kol),danDDD(86:170)); s_danDDD=[str_danDDD1;str_danDDD2]; %++++++++++++++++++++++++++++++++++++++++++ %Вывод номера считываемых данных (kol), номера строки %[num(kol)] и коэффициентов четности cc_all(kol,1:8)= %C8 C7 C6 C5 C4 C3 C2 C1 out1 = [kol num(kol) cc_all(kol,8:-1:1)] %Вывод считываемых данных строки SS1=sprintf('%d',str1); %Декодирование данных строк согласно их номеров 212 % в кадре [например, num(kol) == 1- cтрока номер 1] if num(kol) == 1 zx=1; zxdot=1; zx2dot=1; Nstr=sprintf('%d',str1(2:5)); R1= sprintf('%d',str1(6:7)); P1=sprintf('%d',str1(8:9)); tk5=sprintf('%d',str1(10:14)); tk6=sprintf('%d',str1(15:20)); tk1=sprintf('%d',str1(21)); if sprintf('%d',str1(22))=='1' zxdot = -1; end; Xdot=sprintf('%d',str1(23:45)); if sprintf('%d',str1(46))=='1' zx2dot = -1; end; X2dot=sprintf('%d',str1(47:50)); if sprintf('%d',str1(51))=='1' zx = -1; end; X=sprintf('%d',str1(52:77)); St1=bin2dec({Nstr tk5 tk6 tk1 X Xdot X2dot}); Mng=[1 1 1 30 zx*2^(-11) zxdot*2^(-20) zx2dot*2^(-30)]; Str1=(St1'.*Mng)'%вывод декодированных данных end; if num(kol) == 2 zy=1; zydot=1; zy2dot=1; Nstr=sprintf('%d',str1(2:5)); Bn= sprintf('%d',str1(6:8)); P2=sprintf('%d',str1(9)); tb=sprintf('%d',str1(10:16)); R2=sprintf('%d',str1(17:21)); if sprintf('%d',str1(22))=='1' zydot = -1; end; Ydot=sprintf('%d',str1(23:45)); if sprintf('%d',str1(46))=='1' zy2dot = -1; end; 213 Y2dot=sprintf('%d',str1(47:50)); if sprintf('%d',str1(51))=='1' zy = -1; end; Y=sprintf('%d',str1(52:77)); St2=bin2dec({Nstr Bn P2 tb Y Ydot Y2dot}); Mng=[1 1 1 15*60 zy*2^(-11) zydot*2^(-20) zy2dot*2^(-30)]; Str2=(St2'.*Mng)'%вывод декодированных данных end; if num(kol) == 3 zz=1; zzdot=1; zz2dot=1; zgamma=1; Nstr=sprintf('%d',str1(2:5)); P3= sprintf('%d',str1(6)); if sprintf('%d',str1(7))=='1' zgamma = -1; end; Gamma=sprintf('%d',str1(8:17)); R3=sprintf('%d',str1(18:19)); P=sprintf('%d',str1(20)); ln=sprintf('%d',str1(21)); if sprintf('%d',str1(22))=='1' zzdot = -1; end; Zdot=sprintf('%d',str1(23:45)); if sprintf('%d',str1(46))=='1' zz2dot = -1; end; Z2dot=sprintf('%d',str1(47:50)); if sprintf('%d',str1(51))=='1' zz = -1; end; Z=sprintf('%d',str1(52:77)); St3=bin2dec({Nstr P3 ln Gamma Z Zdot Z2dot}); Mng=[1 1 1 zgamma*2^(-40) zz*2^(-11) zzdot*2^(-20) zz2dot*2^(-30)]; Str3=(St3'.*Mng)'%вывод декодированных данных end; 214 if num(kol) == 4 ztaun=1; zdtaun=1; Nstr=sprintf('%d',str1(2:5)); if sprintf('%d',str1(6))=='1' ztaun = -1; end; taun= sprintf('%d',str1(7:27)); if sprintf('%d',str1(28))=='1' zdtaun = -1; end; deltatau=sprintf('%d',str1(29:32)); En=sprintf('%d',str1(33:37)); R4=sprintf('%d',str1(38:51)); P4=sprintf('%d',str1(52)); FT=sprintf('%d',str1(53:56)); R4i4=sprintf('%d',str1(57:59)); NT=sprintf('%d',str1(60:70)); nSV=sprintf('%d',str1(71:75)); modifSV=sprintf('%d',str1(76:77)); St4=bin2dec({Nstr taun deltatau En FT NT nSV modifSV}); Mng=[1 ztaun*2^(-30) zdtaun*2^(-30) 1 1 1 1 1]; Str4=(St4'.*Mng)'%вывод декодированных данных end; if num(kol) == 5 ztauc=1; ztauGPS=1; Nstr=sprintf('%d',str1(2:5)); NA= sprintf('%d',str1(6:16)); if sprintf('%d',str1(17))=='1' ztauc = -1; end; tauc=sprintf('%d',str1(18:48)); R5=sprintf('%d',str1(49)); N4=sprintf('%d',str1(50:54)); if sprintf('%d',str1(55))=='1' ztauGPS = -1; end; tauGPS=sprintf('%d',str1(56:76)); ln=sprintf('%d',str1(77)); St5=bin2dec({Nstr NA tauc N4 tauGPS ln Nstr Nstr}); Mng=[1 1 ztauc*2^(-27) 1 ztauGPS*2^(-30) 1 0 0]; 215 Str5=(St5'.*Mng)'%вывод декодированных данных end; if num(kol) == 6 ztaun=1; zlambda=1;zdeltai=1; Nstr=sprintf('%d',str1(2:5)); CNA= sprintf('%d',str1(6)); Mn=sprintf('%d',str1(7:8)); nSV=sprintf('%d',str1(9:13)); if sprintf('%d',str1(14))=='1' ztaun = -1; end; taun=sprintf('%d',str1(15:23)); if sprintf('%d',str1(24))=='1' zlambda = -1; end; lambda=sprintf('%d',str1(25:44)); if sprintf('%d',str1(45))=='1' zdeltai= -1; end; deltai=sprintf('%d',str1(46:62)); ecs=sprintf('%d',str1(63:77)); St6=bin2dec({Nstr Mn nSV taun lambda deltai ecs}); Mng=[1 1 1 ztaun*2^(-18) zlambda*2^(-20) zdeltai*2^(-20) 2^(-20)]; Str6=(St6'.*Mng)'%вывод декодированных данных end; if num(kol) == 7 zomegan=1;zdeltaT=1; zdeltaTdot=1; Nstr=sprintf('%d',str1(2:5)); if sprintf('%d',str1(6))=='1' zomegan = -1; end; omegan= sprintf('%d',str1(7:21)); tlambda=sprintf('%d',str1(22:44)); if sprintf('%d',str1(43))=='1' zdeltaT = -1; end; deltaT=sprintf('%d',str1(44:64)); if sprintf('%d',str1(65))=='1' zdeltaTdot= -1; end; 216 deltaTdot=sprintf('%d',str1(66:71)); Hn=sprintf('%d',str1(72:76)); ln=sprintf('%d',str1(77)); St7=bin2dec({Nstr omegan tlambda deltaT deltaTdot Hn ln}); Mng=[1 zomegan*2^(-15) 2^(-5) zdeltaT*2^(-9) zdeltaTdot*2^(-14) 1 1]; Str7=(St7'.*Mng)'%вывод декодированных данных end; if num(kol) == 8 ztaun=1; zlambda=1;zdeltai=1; Nstr=sprintf('%d',str1(2:5)); CNA= sprintf('%d',str1(6)); Mn=sprintf('%d',str1(7:8)); nSV=sprintf('%d',str1(9:13)); if sprintf('%d',str1(14))=='1' ztaun = -1; end; taun=sprintf('%d',str1(15:23)); if sprintf('%d',str1(24))=='1' zlambda = -1; end; lambda=sprintf('%d',str1(25:44)); if sprintf('%d',str1(45))=='1' zdeltai= -1; end; deltai=sprintf('%d',str1(46:62)); ecs=sprintf('%d',str1(63:77)); St8=bin2dec({Nstr Mn nSV taun lambda deltai ecs}); Mng=[1 1 1 ztaun*2^(-18) zlambda*2^(-20) zdeltai*2^(-20) 2^(-20)]; Str8=(St8'.*Mng)' %вывод декодированных данных end; if num(kol) == 9 zomegan=1;zdeltaT=1; zdeltaTdot=1; Nstr=sprintf('%d',str1(2:5)); if sprintf('%d',str1(6))=='1' zomegan = -1; end; omegan= sprintf('%d',str1(7:21)); tlambda=sprintf('%d',str1(22:44)); if sprintf('%d',str1(43))=='1' zdeltaT = -1; 217 end; deltaT=sprintf('%d',str1(44:64)); if sprintf('%d',str1(65))=='1' zdeltaTdot= -1; end; deltaTdot=sprintf('%d',str1(66:71)); Hn=sprintf('%d',str1(72:76)); ln=sprintf('%d',str1(77)); St9=bin2dec({Nstr omegan tlambda deltaT deltaTdot Hn ln}); Mng=[1 zomegan*2^(-15) 2^(-5) zdeltaT*2^(-9) zdeltaTdot*2^(-14) 1 1]; Str9=(St9'.*Mng)'%вывод декодированных данных end; if num(kol) == 10 ztaun=1; zlambda=1;zdeltai=1; Nstr=sprintf('%d',str1(2:5)); CNA= sprintf('%d',str1(6)); Mn=sprintf('%d',str1(7:8)); nSV=sprintf('%d',str1(9:13)); if sprintf('%d',str1(14))=='1' ztaun = -1; end; taun=sprintf('%d',str1(15:23)); if sprintf('%d',str1(24))=='1' zlambda = -1; end; lambda=sprintf('%d',str1(25:44)); if sprintf('%d',str1(45))=='1' zdeltai= -1; end; deltai=sprintf('%d',str1(46:62)); ecs=sprintf('%d',str1(63:77)); St10=bin2dec({Nstr Mn nSV taun lambda deltai ecs}); Mng=[1 1 1 ztaun*2^(-18) zlambda*2^(-20) zdeltai*2^(-20) 2^(-20)]; Str10=(St10'.*Mng)'%вывод декодированных данных end; if num(kol) == 11 zomegan=1;zdeltaT=1; zdeltaTdot=1; Nstr=sprintf('%d',str1(2:5)); if sprintf('%d',str1(6))=='1' zomegan = -1; 218 end; omegan= sprintf('%d',str1(7:21)); tlambda=sprintf('%d',str1(22:44)); if sprintf('%d',str1(43))=='1' zdeltaT = -1; end; deltaT=sprintf('%d',str1(44:64)); if sprintf('%d',str1(65))=='1' zdeltaTdot= -1; end; deltaTdot=sprintf('%d',str1(66:71)); Hn=sprintf('%d',str1(72:76)); ln=sprintf('%d',str1(77)); St11=bin2dec({Nstr omegan tlambda deltaT deltaTdot Hn ln}); Mng=[1 zomegan*2^(-15) 2^(-5) zdeltaT*2^(-9) zdeltaTdot*2^(-14) 1 1]; Str11=(St11'.*Mng)'%вывод декодированных данных end; if num(kol) == 12 ztaun=1; zlambda=1;zdeltai=1; Nstr=sprintf('%d',str1(2:5)); CNA= sprintf('%d',str1(6)); Mn=sprintf('%d',str1(7:8)); nSV=sprintf('%d',str1(9:13)); if sprintf('%d',str1(14))=='1' ztaun = -1; end; taun=sprintf('%d',str1(15:23)); if sprintf('%d',str1(24))=='1' zlambda = -1; end; lambda=sprintf('%d',str1(25:44)); if sprintf('%d',str1(45))=='1' zdeltai= -1; end; deltai=sprintf('%d',str1(46:62)); ecs=sprintf('%d',str1(63:77)); St12=bin2dec({Nstr Mn nSV taun lambda deltai ecs}); Mng=[1 1 1 ztaun*2^(-18) zlambda*2^(-20) zdeltai*2^(-20) 2^(-20)]; Str12=(St12'.*Mng)'%вывод декодированных данных end; 219 if num(kol) == 13 zomegan=1;zdeltaT=1; zdeltaTdot=1; Nstr=sprintf('%d',str1(2:5)); if sprintf('%d',str1(6))=='1' zomegan = -1; end; omegan= sprintf('%d',str1(7:21)); tlambda=sprintf('%d',str1(22:44)); if sprintf('%d',str1(43))=='1' zdeltaT = -1; end; deltaT=sprintf('%d',str1(44:64)); if sprintf('%d',str1(65))=='1' zdeltaTdot= -1; end; deltaTdot=sprintf('%d',str1(66:71)); Hn=sprintf('%d',str1(72:76)); ln=sprintf('%d',str1(77)); St13=bin2dec({Nstr omegan tlambda deltaT deltaTdot Hn ln}); Mng=[1 zomegan*2^(-15) 2^(-5) zdeltaT*2^(-9) zdeltaTdot*2^(-14) 1 1]; Str13=(St13'.*Mng)'%вывод декодированных данных end; if num(kol) == 14 ztaun=1; zlambda=1;zdeltai=1; Nstr=sprintf('%d',str1(2:5)); CNA= sprintf('%d',str1(6)); Mn=sprintf('%d',str1(7:8)); nSV=sprintf('%d',str1(9:13)); if sprintf('%d',str1(14))=='1' ztaun = -1; end; taun=sprintf('%d',str1(15:23)); if sprintf('%d',str1(24))=='1' zlambda = -1; end; lambda=sprintf('%d',str1(25:44)); if sprintf('%d',str1(45))=='1' zdeltai= -1; end; deltai=sprintf('%d',str1(46:62)); ecs=sprintf('%d',str1(63:77)); 220 St14=bin2dec({Nstr Mn nSV taun lambda deltai ecs}); Mng=[1 1 1 ztaun*2^(-18) zlambda*2^(-20) zdeltai*2^(-20) 2^(-20)]; Str14=(St14'.*Mng)'%вывод декодированных данных end; %Строка 14 для 5 кадра if num(kol) == 14 zB1=1; zB2=1; Nstr=sprintf('%d',str1(2:5)); if sprintf('%d',str1(6))=='1' zB1 = -1; end; B1=sprintf('%d',str1(7:16)); if sprintf('%d',str1(17))=='1' zB2 = -1; end; B2=sprintf('%d',str1(18:26)); Kp=sprintf('%d',str1(27:28)); St14_5=bin2dec({Nstr B1 B2 Kp}); Mng=[1 zB1*2^(-10) zB2*2^(-16) 1]; Str14_5=(St14_5'.*Mng)'%вывод декодированных данных end; if num(kol) == 15 zomegan=1;zdeltaT=1; zdeltaTdot=1; Nstr=sprintf('%d',str1(2:5)); if sprintf('%d',str1(6))=='1' zomegan = -1; end; omegan= sprintf('%d',str1(7:21)); tlambda=sprintf('%d',str1(22:44)); if sprintf('%d',str1(43))=='1' zdeltaT = -1; end; deltaT=sprintf('%d',str1(44:64)); if sprintf('%d',str1(65))=='1' zdeltaTdot= -1; end; deltaTdot=sprintf('%d',str1(66:71)); Hn=sprintf('%d',str1(72:76)); ln=sprintf('%d',str1(77)); 221 St15=bin2dec({Nstr omegan tlambda deltaT deltaTdot Hn ln}); Mng=[1 zomegan*2^(-15) 2^(-5) zdeltaT*2^(-9) zdeltaTdot*2^(-14) 1 1]; Str15=(St15'.*Mng)'%вывод декодированных данных end; str1; end; %while (feof(fid)==0) | % while (kol < 14) end % if fid=-1 fclose(fid); %Технологические данные Qout=[num' cc_all] %Номер строки и проверка на четность %Qoutnum1=Qout(1,2:9); %SS1=sprintf('%d',str1); %Qout123=[Str1 Str2 Str3] %Qout45=[Str4 Str5] %Qout6789=[Str6 Str7 Str8 Str9] %Qout10_11_12=[Str10 Str11 Str12] %Qout13_14_15=[Str13 Str14 Str15] clear; 5.5.5 Пример выполнения файла : Decod_GL3.m В результате выполнения программы в командном окне Command Window MatLab отображаются декодированные данные по каждой из строк в последовательности и соответствии ИКД ГЛОНАСС. Так, например, структура строки 1согласно ИКД ГЛОНАСС имеет вид 1 2 - 5 6 - 7 8 - 9 10 - 21 22 - 45 85 84 -81 80 - 79 78 - 77 76 - 65 64 - 41 0 m P1 t k ) t ( n X b . Номер строки в навигацион- ном кадре Резерв Признак смены оператив- ной инфо- рмации Время начала кадра внутри текущих суток, исчисляемое в шкале бортового времени. Начало суток по бортовому времени спут- ника совпадает с началом очередного су- перкадра. Составляющие вектора скорости n-го спутника в системе коорди- нат ПЗ-90 на момент времени t b 46 - 50 51 - 77 1 - 8 1 - 30 40 - 36 35 - 9 8 - 1 1 - 30 ) t ( n X b .. ) t ( n X b Составляющие ускорения n-го спутника на момент времени t b , Координаты n-го спутника в системе координат ПЗ-90 на момент времени t b ; Код Хемминга Метка времени Рис. 5.9. - Структура 1 строки для (1- 4) кадров суперкадра 222 Декодированная информация из командного окна MatLab приведена на рис. 5.10. Рис. 5.10 Декодированные данные спутника ГЛОНАСС Данные, изображенные на рис. 5.10 соответствуют рис. 5.9, но записаны в столбец. 223 |