ČESKÉ VYSOKÉ UČENÍ TECHNICKÉ V PRAZE K13137 - Katedra radioelektroniky A2M37RSY Jméno Stud. rok Stud. skupina Ročník Lab. skupina Václav Dajčar 2011/2012 2. 101 - Datum zadání Datum odevzdání Klasifikace 29.11.2011 13.12.2011 Číslo úlohy 2 Dálkoměrný signál služby SPS systému GPS: vlastnosti, měření zpoždění a výpočet polohy
1. Úvod Služba SPS (Standard Positioning Service) využívá dálkoměrných signálů družic GPS na kmitočtu L1 s modulací kódem C/A (Coarse Acquisition). Zpracování dálkoměrných signálů v kanálech přijímače GPS probíhá korelační metodou. Výrazné maximum korelační funkce se využívá pro udržování synchronizace mezi přijímaným signálem a lokálně generovaným signálem referenčním. Přítomnost signálu družice je možné identifikovat na základě výpočtu vzájemné korelační funkce (modelu) přijímaného signálu a repliky generované přijímačem. Poloha maxima této korelační funkce určuje fázi kódu. Fáze kódu odpovídá zpoždění signálu během šíření od družice k přijímači. Přijímač GNSS musí vyhledat signály družic, tedy zjistit přítomnost signálu a určit pro signál každé družice zpoždění kódu a Dopplerův kmitočet. Tím jsou vytvořeny počáteční podmínky pro algoritmy sledování signálů družic. Parametry přijímaného signálu musí být určeny s takovou přesností, aby následně došlo k zavěšení zpětnovazebních obvodů pro sledování signálu. Nalezení správného odhadu dvou parametrů signálu si můžeme představit jako prohledávání dvourozměrného prostoru. Fáze kódu se vyhledává přes celou periodu kódu obvykle s krokem 1/2 chipu (dáno tvarem autokorelační funkce C/A kódu). Dopplerův kmitočet se prohledává v symetrickém intervalu, který pokrývá rozsah radiálních rychlostí daných součtem příspěvku z pohybu družice po oběžné dráze a příspěvku z pohybu přijímače (dle předpokládané maximální rychlosti). Rozsah prohledávaných kmitočtů je také ovlivněn kvalitou lokálního oscilátoru přijímače. Krok prohledávání ve zpoždění i v kmitočtu se v angličtině označuje slovem bin. 2. Úkoly 1. Vypočtěte a vykreslete autokorelační funkci signálu s C/A kódem. 2. Vykreslete vzájemnou korelační funkci dvou signálů s různými C/A kódy. Pro body 1 a 2 zvolte vzorkování jeden vzorek na jeden bit kódu. 3. Určete jaké C/A kódy se vyskytují v signálu ze souboru (záznam o délce 1 ms) a jaké jsou fáze kódů přítomných signálů. 4. Implementujte iterační algoritmus výpočtu polohy v programu Matlab. Odhadněte polohu přijímače použitou při generování modelu signálu. K dispozici máte polohy vysílačů (pro jednoduchost uvažujeme místo družic nepohyblivé vysílače nazývané pseudolity), které spolu se změřenými fázemi kódů (viz bod 3.) použijte pro výpočet polohy. Zaznamenejte, jak se s každou iterací zmenšuje vzdálenost odhadu polohy rˆ od bodu r0. 3. Postup řešení Zadané datové soubory obsahují: funkce pro generování signálu s GPS kódy soubor s modelem přijímaného signálu a. Řešení úkolu 1 V tomto bodě byla vypočtena a vykreslena (viz obr. 1) autokorelační funkce signálu s C/A kódem. K výpočtu byla použita funkce korelace implementující standardní funkci xcorr z Matlabu. Jako parametry byly funkci zadány vygenerované komplexní obálky signálu s C/A kódem GPS, které byly získány pomocí funkce sgpsgen a Cacode (viz příloha). Z výsledného průběhu je možné odečíst maximum autokorelační funkce. function Rp=korelace(s1,s2) N=length(s1); Rp2=xcorr([s1 s1], s2)/n; Rp=Rp2(2*N:3*N-1);
Obr. 1 Autokorelační funkce signálu s C/A kódem b. Řešení úkolu 2 Na obrázku č. 2 je zobrazen průběh vzájemné korelační funkce signálu s různými C/A kódy. Různé kódy zajistí, aby vzájemná korelační funkce neměla maximum. Obr. 2 Vzájemná korelační funkce s různými C/A kódy
c. Řešení úkolu 3 Pro určení, jaké kódy se vyskytují v přijatém signálu, bylo nutné provést vzájemnou korelační funkci mezi přijatým signálem a 12 vygenerovanými GPS signály odlišenými použitým PRN kódem. Z celkových dvanácti průběhů vykazovali 4 viditelné maximum, z něhož se dala odečíst fáze, která odpovídá zpoždění signálu během šíření od družice k přijímači. Obr. 3 Korelační funkce dálkoměrného signálu GPS s C/A kódem č. 1 Obr. 4 Korelační funkce dálkoměrného signálu GPS s C/A kódem č. 2
Obr. 5 Korelační funkce dálkoměrného signálu GPS s C/A kódem č. 6 Obr. 6 Korelační funkce dálkoměrného signálu GPS s C/A kódem č. 12 Jednotlivá maxima průběhu vzájemné korelační funkce umožnila určit následující zpoždění ke sledovaným družicím: 1 0,1117ms, 2 0,0782ms, 3 0,1020ms, 4 0,1040ms.
d. Řešení úkolu 4 Implementován byl iterační algoritmus výpočtu polohy v programu Matlab (viz příloha), díky němuž mohla být odhadnuta poloha přijímače, která byla použita pri generování modelu signálu. K dispozici byly dány polohy vysílačů (pro jednoduchost uvažujeme místo družic nepohyblivé vysílače nazývané pseudolity), které byly spolu se změřenými fázemi kódů (viz bod c.) použity pro výpočet polohy. Přijímač GNSS provádí výpočet polohy na základě změřených pseudovzdáleností. Výpočet je založen na řešení následující soustavy nelineárních rovnic. Kde di jsou pseudovzdálenosti vypočtené ze změřených zpoždění k sledovaným družicím odlišeným indexem i, 0 je chyba časové základny přijímače, wi reprezentuje chybu měření, r je hledaná poloha přijímače a si jsou polohy družic. Jednou z možností řešení dané soustavy je linearizace pomocí Taylorovy řady v okolí bodu se souřadnicemi r0. Dostaneme soustavu lineárních rovnic. Kde dio je vzdálenost mezi bodem r0 a danou družicí. Soustavu můžeme vyjádřit maticovou rovnicí: Matici A nazýváme maticí směrových kosinů. Za předpokladu nekorelovaných chyb měření vzdálenosti se stejným rozptylem pro měření ke všem družicím, je odhad: Počáteční bod byl zvolen náhodně (využit generátor náhodných čísel rand). Výsledkem je vždy pozice přijímače r0 (viz obr. 7 a 8), zelené kroužky označené S1-S4 představují vysílače.
Dále určíme matici A a b a dopočítáme odhad x^, který obsahuje ve třech prvních hodnotách vzdálenosti, které přičteme k původnímu r0 a čtvrtou hodnotou je c 0, kterou dále nepotřebujeme. Tento postup představuje jeden iterační krok. Obr. 7 Kroky iterace, r0 postupně určuje konečnou polohu (červeně) Pro představu uvádím souřadnice bodu r0 (formát x, y, z) v metrech v jednotlivých krocích iterace: r0 = [230, 485, 4117], r0 = [7250, 5748, 583], r0 = [3692, 3482, 583], r0 = [4012, 3524, 760]. zvolený počáteční bod 1. krok iterace 2. krok iterace 3. krok iterace
Obr. 8 Detail zaměřený na konečný výsledek (červeně) 4. Závěr V rámci semestrální práce byl zpracován přijatý signál (s_rec10103.mat), pomocí něhož se daly určit jednotlivé fáze(viz bod 3.c.). Ke zpracování byl využit výpočetní software Matlab, v němž byl vytvořen skript (viz příloha) implementující iterační algoritmus pro určení polohy přijímače, který již ve třetím kroku konverguje k výsledku, tzn. poloze přijímače (hodnoty v km) na souřadnicích [4.0117, 3.5236, 0.7608].Tvorba této práce přispěla k lepšímu pochopení dané problematiky, nutno však podotknout, že celá situace byla velmi zjednodušena, jelikož byly uvažovány nepohyblivý přijímač i vysílače.
Příloha skript z Matlabu, použité funkce % % % % Semestralka c. 2 - V. Dajcar % % % % % % % % % % % % %A2M37RSY% % % % % % % % % % close all; clear all; load -mat s_rec10103.mat Np0=1023; Np=4500; T=1; figure(14) plot(korelace(sgpsgen(3,np0,t,0,0),sgpsgen(3,np0,t,0,0))); title('autokorelacni funkce signalu s C/A kodem'); xlabel('tau [k]') ylabel('r(tau)') figure(15) plot(korelace(sgpsgen(3,np0,t,0,0),sgpsgen(7,np0,t,0,0))); title('vzajemna korelacni funkce signalu s ruznymi C/A kody'); xlabel('tau [k]') ylabel('r(tau)') % generovani GPS signalu s=[12 4500]; for i=1:12 a=sgpsgen(i,np,t,0,0); for j=1:4500 s(i,j)=a(j); ; % vypocet korelacnich funkci R=[12 4500]; for i=1:12 Rr=korelace(s_rec,s(i,:)); for j=1:4500 R(i,j)=Rr(j); ; osa=0:1/4500:length(r(i,:))/4500-1/4500; % zobrazeni korelacnich funkci for i=1:12 figure(i) plot(osa,abs(r(i,:)),'linewidth',1); title(sprintf('korelacni funkce dalkomerneho signalu GPS s C/A kodem c.%d',i)); xlabel('tau [ms]') ylabel('r(tau)') % urceni zpozdeni tau z vypoctenych autokorelacnich funkci for i=1:12 [pmax(i),imax(i)] = hledejmax(abs(r(i,:)),np); %#ok<agrow,agrow> if pmax(i)>0.6 tau(i) = imax(i); %#ok<agrow> tau(tau==0)=[];
%Polohy vysilacu s1 s4 (PRNs1 < PRNs2 < PRNs3 < PRNs4) v metrech %tau=sort(tau); s1 = [8000 8000 15000]; s2 = [0 0 0]; s3 = [16000 0 0]; s4 = [8000 16000 0]; c = 299792458; % vypoctene pseudovzdalenosti ze zmerenych zpozdeni k sledovanym druzicim for i=1:4 d0(i)=c*tau(i)*1e-3; %#ok<agrow> % nahodne zvolene souradnice pocatecniho bodu r0=[fix(5000*rand(1)) fix(5000*rand(1)) fix(5000*rand(1))]; r01=r0; % vypocet vydalenosti bodu r0 od jednotlivych druzic d=[sqrt((r0(1)-s1(1))^2+(r0(2)-s1(2))^2+(r0(3)-s1(3))^2); sqrt((r0(1)-s2(1))^2+(r0(2)-s2(2))^2+(r0(3)-s2(3))^2); sqrt((r0(1)-s3(1))^2+(r0(2)-s3(2))^2+(r0(3)-s3(3))^2); sqrt((r0(1)-s4(1))^2+(r0(2)-s4(2))^2+(r0(3)-s4(3))^2)]; d=d'; % vypocet matice b, tj. rozdil mezi pseudovzdalenosti a vzdalenosti bodu r0 % od druzic b=[d0(1)-d(1) d0(2)-d(2) d0(3)-d(3) d0(4)-d(4)]; % iteracni algoritmus en=3; figure(16) for i=1:en hold on grid on plot3(r01(1),r01(2),r01(3),'x') text(r01(1),r01(2),r01(3),'\leftarrow r0','horizontalalignment','left') A=[(r0-s1)/d(1) 1;(r0-s2)/d(2) 1;(r0-s3)/d(3) 1;(r0-s4)/d(4) 1]; x = ((A'*A)^-1)*A'*b'; r0=r0+x(1:3)'; d=[sqrt((r0(1)-s1(1))^2+(r0(2)-s1(2))^2+(r0(3)-s1(3))^2); sqrt((r0(1)-s2(1))^2+(r0(2)-s2(2))^2+(r0(3)-s2(3))^2); sqrt((r0(1)-s3(1))^2+(r0(2)-s3(2))^2+(r0(3)-s3(3))^2); sqrt((r0(1)-s4(1))^2+(r0(2)-s4(2))^2+(r0(3)-s4(3))^2)]; d=d'; b=[d0(1)-d(1) d0(2)-d(2) d0(3)-d(3) d0(4)-d(4)]; plot3(s1(1),s1(2),s1(3),'ogreen') text(s1(1),s1(2),s1(3),'\leftarrow S1','HorizontalAlignment','left') plot3(s2(1),s2(2),s2(3),'ogreen') text(s2(1),s2(2),s2(3),'\leftarrow S2','HorizontalAlignment','left') plot3(s3(1),s3(2),s3(3),'ogreen') text(s3(1),s3(2),s3(3),'\leftarrow S3','HorizontalAlignment','left') plot3(s4(1),s4(2),s4(3),'ogreen') text(s4(1),s4(2),s4(3),'\leftarrow S4','HorizontalAlignment','left') pause(2); if i==en plot3(r0(1),r0(2),r0(3),'xred') text(r0(1),r0(2),r0(3),'\leftarrow r0','horizontalalignment','left') else plot3(r0(1),r0(2),r0(3),'x') text(r0(1),r0(2),r0(3),'\leftarrow r0','horizontalalignment','left') title('urceni polohy prijimace'); xlabel('x [m]')
ylabel('y [m]') zlabel('z [m]') Použité funkce: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function Rp=korelace(s1,s2) N=length(s1); Rp2=xcorr([s1 s1], s2)/n; Rp=Rp2(2*N:3*N-1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [pmax imax] = hledejmax(prubeh,npc) imax = 1; pmax = 0.001; for i = 1: length(prubeh) if abs(prubeh(i)) > pmax pmax = abs(prubeh(i)); imax = i; imax = imax/npc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function s = sgpsgen(prnno, Npc, Np, fd, tau); % PRNno - Cislo PRN kodu % Npc - pocet vzorku na periodu kodu % Np - pocet period % fd - doppleruv kmitocet v Hz % tau - zpozdeni kodu v ms PRN = CAcode(PRNno); k = 1:Npc*Np; sc = PRN.PRN11(floor(mod((k/Npc-tau)*1023,1023))+1); fn = exp(2*pi*1j*k*fd/1000/npc); s = sc.*fn; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Function CAcode generates C/A code for a given number PRN. % It generates one period of the code. % Code is provided in three formats % 1. sequences containing 1, 0 - a vector length 1023 for each satellite % 2. sequences containing 1, -1 (mapping from ad 1: 1->1, 0->-1) % - a vector length 1023 for each satellite % % Syntax: % PRNcode = CAcode(PRNnumber) % % PRNcode - structure containing vectors PRN10, PRN11, PRNhex % PRN10(1, 1023) - Gold code in representation ad 1 % PRN11(1, 1023) - Gold code in representation ad 2 % function PRN = CAcode(PRNno) % Jiri Fajt, October 2001, Josef Spacek 2008 if (PRNno<1) (PRNno>37) msgbox('wrong PRN number requested.', 'Error', 'error'); exit; G1SR = ones(1,10); % G1 shift register initial
G2SR = ones(1,10); % G2 shift refister initial G1mask = [0 0 1 0 0 0 0 0 0 1]'; % Shift register masks G2mask = [0 1 1 0 0 1 0 1 1 1]'; G2jmask = zeros(10, 37); G2jmask([2, 6], 1) = 1; % PRN = 1 G2jmask([3, 7], 2) = 1; % PRN = 2 G2jmask([4, 8], 3) = 1; % PRN = 3 G2jmask([5, 9], 4) = 1; % PRN = 4 G2jmask([1, 9], 5) = 1; % PRN = 5 G2jmask([2, 10], 6) = 1; % PRN = 6 G2jmask([1, 8], 7) = 1; % PRN = 7 G2jmask([2, 9], 8) = 1; % PRN = 8 G2jmask([3, 10], 9) = 1; % PRN = 9 G2jmask([2, 3], 10) = 1; % PRN = 10 G2jmask([3, 4], 11) = 1; % PRN = 11 G2jmask([5, 6], 12) = 1; % PRN = 12 G2jmask([6, 7], 13) = 1; % PRN = 13 G2jmask([7, 8], 14) = 1; % PRN = 14 G2jmask([8, 9], 15) = 1; % PRN = 15 G2jmask([9, 10], 16) = 1; % PRN = 16 G2jmask([1, 4], 17) = 1; % PRN = 17 G2jmask([2, 5], 18) = 1; % PRN = 18 G2jmask([3, 6], 19) = 1; % PRN = 19 G2jmask([4, 7], 20) = 1; % PRN = 20 G2jmask([5, 8], 21) = 1; % PRN = 21 G2jmask([6, 9], 22) = 1; % PRN = 22 G2jmask([1, 3], 23) = 1; % PRN = 23 G2jmask([4, 6], 24) = 1; % PRN = 24 G2jmask([5, 7], 25) = 1; % PRN = 25 G2jmask([6, 8], 26) = 1; % PRN = 26 G2jmask([7, 9], 27) = 1; % PRN = 27 G2jmask([8, 10], 28) = 1; % PRN = 28 G2jmask([1, 6], 29) = 1; % PRN = 29 G2jmask([2, 7], 30) = 1; % PRN = 30 G2jmask([3, 8], 31) = 1; % PRN = 31 G2jmask([4, 9], 32) = 1; % PRN = 32 G2jmask([5, 10], 33) = 1; % PRN = 33 G2jmask([4, 10], 34) = 1; % PRN = 34 G2jmask([1, 7], 35) = 1; % PRN = 35 G2jmask([2, 8], 36) = 1; % PRN = 36 G2jmask([4, 10], 37) = 1; % PRN = 37 % generation G1 and G2 codes for i = 1:1023 G1(i) = G1SR(10); G2(i) = G2SR(10); G2j = mod(g2sr * G2jmask(:,PRNno), 2); G1SR = [mod(g1sr * G1mask, 2), G1SR(1:9)]; G2SR = [mod(g2sr * G2mask, 2), G2SR(1:9)]; PRN10(i) = xor(g1(i), G2j); % conversion to 1, -1 sequence PRN11 = 2 * PRN10-1; PRN.PRN10 = PRN10; PRN.PRN11 = PRN11; %%%%%% of CAcode.m %%%%%%