Récepteur GPS fait maison La photo ci-dessus est le premier mixeur avant et le premier amplificateur IF d'un récepteur GPS expérimental. Le SMA le plus à gauche est connecté à une antenne commerciale avec filtre LNA et SAW intégré. Un premier oscillateur local synthétisé entraîne le SMA inférieur. Les en-têtes de broches vers la droite sont l'entrée d'alimentation et la sortie IF. Ce dernier est connecté à un FPGA Xilinx qui non seulement exécute DSP, mais héberge également un synthétiseur de fréquence N fractionnaire. Plus d'informations ultérieurement. J'ai été motivé pour la conception de ce récepteur après avoir lu le travail 1 de Matjax017E Vidmar, S53MV, qui a développé un récepteur GPS à partir de zéro, en utilisant principalement des composants discrets, il ya plus de 20 ans. Son utilisation de DSP suite à une limitation de FI et 1-bit ADC m'a intéressé. Le récepteur décrit ici fonctionne sur le même principe. Son ADC à 1 bit est l'IC à 6 broches près des en-têtes de broche, un comparateur de sortie LVDS. Caché sous le bruit mais non oblitéré dans le bi-niveau quantised mush qui émerge sont des signaux de chaque satellite en vue. Tous les satellites GPS transmettent sur la même fréquence, 1575.42 MHz, en utilisant le spectre à diffusion directe (DSSS). Le transporteur L1 est étalé sur une bande passante de 2 MHz et sa résistance à la surface terrestre est de -130 dBm. La puissance de bruit thermique dans la même bande passante est de -111 dBm, de sorte qu'un signal GPS à l'antenne de réception est de 20 dB au-dessous du plancher de bruit. Que tous les signaux présents, superposés les uns aux autres et enterrés dans le bruit, soient récupérables après la quantification de deux niveaux semble contre-intuitive J'ai écrit une simulation pour me convaincre. Le GPS repose sur les propriétés de corrélation des séquences pseudo-aléatoires appelées Codes Or pour séparer les signaux du bruit et les uns des autres. Chaque satellite transmet une séquence unique. Tous les signaux non corrélés sont le bruit, y compris ceux d'autres satellites et les erreurs de quantification du limiteur. Le mélange avec le même code dans la phase correcte détruit le signal utile et répand tout le reste. Le filtrage à bande étroite supprime alors le bruit à large bande sans affecter le signal recherché (encore une fois étroit). Hard-limiting (1-bit ADC) dégrade SNR de moins de 3 dB, un prix à payer pour éviter l'AGC matériel. Mise à jour de mai 2013 Il s'agit maintenant d'un récepteur GPS 12 canaux, portable, alimenté par batterie et doté d'un logiciel clé en main, qui acquiert et suit les satellites et recalcule continuellement sa position sans intervention de l'utilisateur. Le système complet (ci-dessous, à gauche) comprend: écran LCD 16x2, ordinateur modèle A de framboise Pi, deux cartes imprimées personnalisées, antenne patch commerciale et batterie Li-Ion. La consommation totale de courant du système est de 0,4 A pour une autonomie de 5 heures. Le Raspberry Pi est alimenté par le câble ruban reliant son en-tête GPIO à la carte FPGA Frac7 et ne nécessite aucune autre connexion. Actuellement, le Pi fonctionne avec Raspbian Linux. Une distro plus petite raccourcit le temps à la première correction. Après le démarrage à partir de la carte SD, le logiciel d'application GPS démarre automatiquement. À la sortie, il fournit un moyen d'arrêter correctement le Pi avant de mettre hors tension. Pi développement logiciel a été fait sans tête via SSH et FTP sur un dongle USB Wi-Fi. Le code source et la documentation peuvent être trouvés en bas de cette page. Les deux PCB personnalisés sont des cartes PTH à 2 couches simples avec des plans de masse continus sur le fond. Dans le sens des aiguilles d'une montre autour du Xilinx Spartan 3 sur la carte FPGA Frac7: de 12 heures à 3 heures sont le filtre de boucle, VCO, répartiteur de puissance et prescaler du synthétiseur de fréquence hyperfréquence en bas à droite sont le joystick et le connecteur JTAG et, à 6 heures, Broche pour le câble ruban Raspberry Pi. À l'extrême gauche se trouve le connecteur LCD. Près de la gauche se trouve un oscillateur à cristaux contrôlés en tension (TCVCXO) à compensation de température qui fournit une fréquence de référence stable, vitale pour la réception GPS. Le TCVCXO est bon mais pas tout à fait à la norme de GPS quand l'opération un-boxed dans les endroits venteux. Le soufflage déplace l'oscillateur à quartz 10,000000 MHz d'environ 1 partie sur 10 millions ou 1 Hz, ce qui est amplifié 150 fois par le synthétiseur PLL. Cela suffit à momentanément déverrouiller les boucles de suivi par satellite, si fait soudainement. Le dispositif est également légèrement sensible aux infrarouges, par ex. Des ampoules halogènes et des télécommandes de télévision Lors de son premier affichage en 2011, il s'agissait d'un récepteur à quatre canaux, ce qui signifie qu'il ne pouvait suivre quatre satellites simultanément. Au moins quatre sont nécessaires pour résoudre la position de l'utilisateur et le biais d'horloge du récepteur, mais une plus grande précision est possible avec plus. Dans cette version originale, quatre instances identiques du module de suivi ont rempli le FPGA. Mais la plupart des flops n'étaient cadencés qu'une fois par milliseconde. Maintenant, une CPU personnalisée à cœur interne à l'intérieur du FPGA sérialise le traitement et seulement 50 du tissu FPGA est nécessaire pour un récepteur à 8 canaux ou 67 pour 12 canaux. Le nombre de canaux est un paramètre dans la source et pourrait aller plus haut. La précision de positionnement est meilleure quand l'antenne peut voir 360deg de ciel et recevoir des signaux de toutes les directions. Généralement, plus les satellites sont visibles, mieux ce sera. Deux ou plusieurs satellites sur le même roulement peuvent conduire à ce que l'on appelle la mauvaise géométrie. La meilleure solution à ce jour était plusmn1 mètres à un emplacement très ouvert à l'aide de 12 satellites, mais la précision est généralement plusmn5 mètres dans les endroits les plus pauvres avec moins de satellites. Mise à jour de septembre 2014 Le code source de ce projet a été relancé sous la GNU General Public License (GPL). Architecture Processus est divisé entre FPGA et Pi par la complexité et l'urgence. Le Pi s'occupe de la manutention intensive des mathématiques à son propre rythme. Le FPGA synthétise le premier oscillateur local, traite les événements prioritaires en temps réel et suit les satellites de façon autonome. Le Pi contrôle le FPGA via une interface SPI. De façon pratique, le même SPI est utilisé pour charger le bitstream de configuration FPGA et le code exécutable binaire pour le CPU incorporé. Le FPGA peut également être contrôlé via un câble Xilinx Platform USB JTAG à partir d'un PC Windows et détecte automatiquement quelle interface est utilisée. Les fréquences L1 sont converties vers le bas à un 1er IF de 22,6 MHz en se mélangeant à un oscillateur local à 1552,82 MHz sur la carte frontale GPS3. Tout le traitement des signaux IF et bande de base est effectué numériquement dans le FPGA. Deux régulateurs proportionnels-intégrés (PI) par satellite, porteur de voie et phase de code. Les données NAV transmises par les satellites sont collectées en mémoire FPGA. Ceci est téléchargé sur le Pi, qui vérifie la parité et extrait les éphémérides du flux binaire. Lorsque tous les paramètres orbitaux requis sont collectés, un instantané est pris de certains compteurs internes FPGA, à partir de laquelle le temps de transmission est calculé à plus de 15ns de précision. Une grande partie du synthétiseur 1552.82 MHz est implémenté dans le FPGA. On peut s'attendre à des problèmes de gigue, co-héberger un détecteur de phase avec d'autres logiques, mais ça marche. La pureté spectrale de la sortie du synthétiseur est excellente, même si le noyau FPGA se déplace loin furieusement et pas tous sur des fréquences harmoniquement liées. Cette approche a été prise parce qu'un conseil similaire à Frac7 existait déjà à partir d'un projet de synthétiseur antérieur. L'ajout d'un front-end était le chemin le plus court vers un récepteur prototype. Mais cette première version n'était pas portable: elle avait des exigences d'alimentation incommodes et pas de norme de fréquence embarquée. Traitement du signal jusqu'à et y compris le limiteur rigide: Le comparateur LMH7220 a une tension de décalage d'entrée maximale de 9,5 mV. Le bruit thermique amplifié doit dépasser confortablement ce pour le maintenir basculer. Pour estimer le niveau de bruit à l'entrée du comparateur, nous tabulons les gains, les pertes d'insertion et les chiffres de bruit: Le bruit intra-bande à la sortie du mélangeur est -1740.828-1.5-3.920- 610log10 (2,5e6) -73 dBm ou 52microV RMS. Le mélangeur est résistivement terminé en 50 ohms et les étages par la suite fonctionnent à une impédance plus élevée. La bande FI discrète a un gain de tension global de 1000, de sorte que le niveau d'entrée du comparateur est de 52mV RMS. Le LMH7220 ajoute 59 dB de gain pour un total de 119 dB pour l'ensemble du FI. Déployer autant de gain à une fréquence était un risque. Pour le minimiser, un circuit équilibré sur un plan de masse solide a été utilisé et une paire torsadée blindée transporte la sortie vers le FPGA. La motivation était la simplicité, évitant une seconde conversion. Dans la pratique, le circuit est stable, donc le pari payé-off. Le découpleur actif Q1 fournit 5V pour le LNA distant. L'amplificateur MMIC U2 fournit un gain de 20 dB (pas en IF) et garantit un faible bruit global du système, même si de longs câbles d'antenne sont utilisés. L1 et L2 sont des inductances micro-ondes à remontage manuel avec une fréquence d'auto-résonance très élevée, montées perpendiculairement l'une à l'autre et à l'écart du plan de masse. Vent de 14 tours, diamètre d'air intérieur de 1mm à partir de 7cm de longueur de 32swg fil de cuivre émaillé. Vérifié avec le générateur de suivi sur un Marconi 2383 SA, ceux-ci étaient bons à 4 GHz. Le Mini-Circuits MBA-15L DBM a été choisi pour sa faible perte de conversion de 6 dB à 1,5 GHz et son faible besoin de 4 dBm LO. R9 termine le port IF. Trois étages amplificateurs IF entièrement différentiels suivent le mélangeur. Les circuits accordés en parallèle faible-Q entre les collecteurs fixent la bande passante de -3 dB autour de 2,5 MHz et empêchent l'accumulation de décalages DC. L4, L5 et L6 sont des bobines Toko 7mm blindées. Le BFS17 a été choisi pour son haut (mais pas trop) 1 GHz f T. I e est 2mA pour le plus bas bruit et le betar e raisonnable. Le premier IF de 22,6 MHz est converti en numérique à 2,6 MHz par sous-échantillonnage à 10 MHz dans le FPGA. 2,6 MHz se trouve à proximité du centre de la bande passante de 5 MHz Nyquist. Il est préférable d'éviter le centre exact, pour des raisons qui seront expliquées plus loin. Plusieurs autres premières fréquences IF sont possibles: 27,5 MHz, qui produit l'inversion du spectre au 2ème IF, a également été essayé avec succès. Il existe un compromis entre les problèmes d'image à un gain BFS17 inférieur et disponible à des fréquences plus élevées. La détection des signaux implique la résolution de trois inconnues: quels satellites sont en vue, leurs décalages Doppler et les phases de code. Une recherche séquentielle de cet espace tridimensionnel à partir d'un soi-disant démarrage à froid pourrait prendre de nombreuses minutes. Un démarrage à chaud utilisant les données d'almanach pour prédire les positions et les vitesses nécessite toujours une recherche de code. Toutes les 1023 phases de code doivent être testées pour trouver le pic de corrélation maximum. Le calcul de 1023 intégrales de corrélation dans le domaine temporel est très coûteux et redondant. Ce récepteur GPS utilise un algorithme basé sur FFT qui teste toutes les phases de code en parallèle. Du froid, il faut 2,5 secondes sur un Pentium 1,7 GHz pour mesurer la force du signal, le décalage Doppler et la phase de code de chaque satellite visible. Le Raspberry Pi est un peu plus lent. La fonction de corrélation croisée y (Tau) du signal complexe s (t) et du code c (t) décalé par le décalage Tau est: Le théorème de corrélation indique que la transformée de Fourier d'une intégrale de corrélation est égale à Le produit du complexe conjugué de la transformée de Fourier de la première fonction et de la transformée de Fourier de la deuxième fonction: FFT (y) CONJUGUE (FFT) FFT (c) La corrélation est effectuée à la bande de base. Le code 1.023 Mbps CA est 1023 puces ou 1ms de long. La longueur FFT avant doit être un multiple de cette valeur. L'échantillonnage à 10 MHz pendant 4 ms donne une taille de bac FFT de 250 Hz. 41 Les changements Doppler doivent être testés en tournant les données du domaine fréquentiel, un bac à la fois, jusqu'à plusmn20 cases plusmn5 KHz. La rotation peut être appliquée à l'une ou l'autre fonction. Le premier IF de 22,6 MHz du convertisseur analogique-numérique à 1 bit est sous-échantillonné par une horloge de 10 MHz dans le FPGA, la convergeant numériquement vers un 2e IF de 2,6 MHz. Dans le logiciel, la 2ème IF est convertie vers le bas en bande de base complexe (IQ) en utilisant des oscillateurs locaux en quadrature. Pour les signaux bi-niveau, les mélangeurs sont des portes XOR simples. Bien que non représentés ci-dessus, les échantillons sont temporairement mis en mémoire tampon dans la mémoire FPGA. Le Pi n'est pas capable de les accepter à 10 Mbps. 1,023 Mbps et 2,6 MHz sont générés par des accumulateurs de phase à oscillateur à commande numérique (NCO). Ces fréquences sont assez importantes par rapport à la fréquence d'échantillonnage, et ne sont pas des sous-harmoniques exactes de celle-ci. Par conséquent, les NCO ont des spurs fractionnaires. Le nombre d'échantillons par puce de code se chiffre entre 9 et 10. Heureusement, les récepteurs DSSS tolèrent les brouilleurs à bande étroite, externes ou autogénérés. La bande de base complexe est transformée en domaine de fréquence par une FFT directe qui ne doit être calculée qu'une seule fois. Une FFT de chaque code de satellites CA est pré-calculée. Le temps de traitement est dominé par la boucle la plus interne qui effectue le décalage, la conjugaison, la multiplication complexe et un test FFT inversé par satellite-Doppler. Le GPU Raspberry Pis Videocore pourrait être utilisé pour accélérer les choses. À un taux d'échantillonnage de 10 MHz, la phase de code est résolue à 100ns près. La sortie CCF typique est illustrée ci-dessous: Le calcul de la puissance de crête à moyenne sur ces données donne une bonne estimation de SNR et est utilisé pour trouver les signaux les plus forts. Les éléments suivants ont été reçus à 20h14 GMT le 4 mars 2011 à Cambridge, au Royaume-Uni, avec l'antenne sur une corniche extérieure orientée vers le nord: des latitudes nord, plus de satellites GPS seront généralement trouvés dans le ciel du sud, c'est-à-dire vers l'équateur. Prendre des échantillons plus longs augmente SNR, révélant des signaux plus faibles, mais l'annulation se produit lorsque la capture s'étend sur les transitions de données NAV. La longueur FFT avant est un nombre entier de millisecondes cependant, la FFT inverse peut être raccourcie, simplement en jetant des données dans des casiers à fréquence plus élevée. Le SNR est préservé mais la phase de code n'est pas si nettement résolue. Néanmoins, une bonne estimation de la position de crête est obtenue en pondérant la moyenne des deux plus fortes cases adjacentes et des tests hors-air suggèrent que cela pourrait fonctionner même à des longueurs FFT inverses assez courtes. Après avoir détecté un signal, l'étape suivante consiste à le verrouiller, à le suivre et à démoduler les données NAV de 50 points de base. Cela nécessite deux boucles à verrouillage de phase (PLL) inter-dépendantes pour suivre le code et la phase de porteuse. Ces PLL doivent fonctionner en temps réel et sont implémentées en tant que fonctions DSP dans le FPGA. Le logiciel Pi a un rôle de supervision: décider quels satellites suivre, surveiller l'état du verrouillage et traiter les données NAV reçues. Les boucles de suivi sont bonnes à maintenir le verrou, parce qu'ils ont des largeurs de bande très étroites cependant, cette même caractéristique les rend pauvres à l'acquisition de verrou sans aide. Ils ne peuvent pas voir au-delà de la bande passante pour capturer quelque chose plus loin. Les phases et les fréquences initiales doivent être préréglées à la phase de code mesurée et au décalage Doppler du satellite cible. Ceci est orchestré sous le contrôle de Pi. Les boucles devraient être verrouillées dès le début et rester ainsi. La phase de code est mesurée par rapport à l'échantillon FFT. Le code NCO dans le FPGA est réinitialisé au début de l'échantillonnage et accumule la phase à une 1.023 MHz fixe. Il est ensuite aligné avec le code reçu en arrêtant brièvement l'accumulateur de phase. Le décalage Doppler sur le support 1575,42 MHz est plusmn5 KHz ou plusmn3 ppm. Elle affecte également le taux de code de 1,023 Mbps par plusmn3 chips par seconde. La longueur de la pause est ajustée pour le code de fluage dans le temps depuis l'échantillon a été pris. Heureusement, le code Doppler est proportionnel au vecteur Doppler pour lequel nous avons une bonne estimation. Logiciel matériel divisé Dans le diagramme ci-dessous, le codage couleur montre comment la mise en œuvre du DSP de suivi est désormais divisée entre le matériel et le logiciel. Auparavant, tout cela était fait en matériel, avec des instances parallèles identiques répétées pour chaque canal, rendant l'utilisation inefficace des ressources FPGA. Maintenant, le traitement plus lent 1 KHz est fait par logiciel, et deux fois plus de canaux peuvent être hébergés dans la moitié du FPGA immobilier. Les six accumulateurs d'intégration et de vidage (Sigma) sont verrouillés dans un registre à décalage à l'époque du code. Un indicateur de demande de service signale la CPU, qui lit le bit de données en série. Avec 8 canaux actifs, 8 de temps CPU est passé à exécuter l'instruction oprdBit Mais il ya beaucoup de temps, et IO série utilise le tissu FPGA économiquement. Des luxes comme la journalisation RSSI et IQ (par exemple pour des diagrammes de dispersion) peuvent maintenant être fournies. Les fonctions de transfert du filtre en boucle F (z) avalent 2 de la bande passante CPU par canal actif. Il s'agit de régulateurs standard proportionnels (PI): la précision de 64 bits est utilisée et les coefficients de gain KI et KP, bien que restreints aux puissances de 2, sont dynamiquement ajustables. Chaque canal devant attendre son tour, les mises à jour de débit NCO peuvent être retardées de dizaines ou de centaines de microsecondes après une époque de code, mais ceci introduit un déphasage négligeable aux fréquences où le marge de phase est déterminé. Les traces minces sont de 1 bit, représentant théoriquement plusmn1. Le transporteur de 2,6 MHz est d'abord déployé en mélangeant les codes précoces, tardifs et ponctuels. Les produits de bande de base complexes I et Q du deuxième rang des mélangeurs de portes XOR sont additionnés sur 10 000 échantillons ou 1 ms. Ce filtrage passe-bas réduit considérablement la bande passante de bruit et augmente ainsi le SNR. Le rééchantillonnage à 1 KHz nécessite des chemins de données plus larges dans le domaine du logiciel. La phase de code est suivie à l'aide d'une boucle à verrouillage retardé classique ou d'une porte retardée tardive. La puissance dans les canaux précoce et tardif est calculée en utilisant P I 2 Q 2 qui est insensible à la phase. Les codes précoce et tardif sont une puce séparée, c'est-à-dire la puce frac12 devant et derrière ponctuellement. Ce diagramme aide à obtenir le sens de l'erreur correct: Une boucle Costas est utilisée pour le suivi des opérateurs et la récupération des données NAV dans le canal ponctuel. Les données NAV, m, sont prises à partir du bit de signe de bras I avec une incertitude de phase de 180 degrés. K est l'amplitude du signal reçu et theta est la différence de phase entre le support reçu (sans modulation) et le NCO local. K varie d'environ 400 pour les signaux récupérables les plus faibles jusqu'à plus de 2000 pour les plus forts. Notez comment le terme d'erreur renvoyé au contrôleur de l'installation F (z) dans la boucle Costas est proportionnel à la puissance du signal reçu ksup2. La pente de suivi, et donc le gain de boucle, varient également avec la puissance du signal dans la boucle de code. Ci-dessous un graphique Bode de gain en boucle ouverte pour la boucle Costas à k500: la bande passante Costas Loop est d'environ 20 Hz, ce qui est idéal pour le suivi des porteurs. La bande passante de code est de 1 Hz. La puissance de bruit dans de telles bandes de fréquences est faible et les boucles peuvent suivre des signaux très faibles. Les kI et kP ci-dessus fonctionnent pour la plupart des signaux, mais ont besoin de tomber d'un cran pour le plus fort. Scilab prédit, et les diagrammes de dispersion confirment, le début de l'instabilité à kge1500. Les erreurs de parité ne se produisent pas à moins que les échantillons ne se déplacent dans la moitié opposée du plan IQ. (I) Instabilité à kge1500 Ce qui précède sont 2 trames consécutives de 5 sous-trames chacune. Les sous-trames ont une longueur de 300 bits et prennent 6 secondes pour être transmises. La colonne 1 est le préambule 10001011. Elle apparaît au début de chaque sous-trame mais peut se trouver n'importe où dans les données. Le compteur de 17 bits dans la colonne 5 est le temps de la semaine (TOW) et réinitialise à zéro à minuit dimanche. Le compteur à 3 bits de la colonne 7 est le sous-cadre ID 1 à 5. Les sous-trames 4 et 5 sont sous-commandées en 25 pages chacune et un message de données complet comprenant 25 trames pleines prend 12,5 minutes pour transmettre. Je n'utilise que les données des sous-trames 1, 2 et 3 à l'heure actuelle. Résolution pour la position de l'utilisateur Chaque satellite GPS transmet sa position et l'heure. Soustraire le temps envoyé du temps reçu et multiplier par la vitesse de la lumière est la façon dont un récepteur mesure la distance entre lui-même et les satellites. Le faire avec trois satellites donnerait trois équations simultanées en trois inconnues (position utilisateur: x, y, z) si le temps précis était disponible. En pratique, les horloges réceptrices ne sont pas suffisamment précises, l'heure exacte est une quatrième inconnue, quatre satellites sont donc nécessaires et quatre équations simultanées doivent être résolues: Une méthode itérative est utilisée parce que les équations sont non linéaires. En utilisant le centre terrestre (0, 0, 0) et le temps approximatif comme point de départ, l'algorithme converge en cinq ou six itérations. La solution est trouvée même si l'erreur d'horloge utilisateur est importante. Les satellites portent des horloges atomiques, mais elles ont aussi des erreurs et les coefficients de correction dans le sous-cadre 1 doivent être appliqués au moment de la transmission. Les ajustements typiques peuvent être des centaines de microsecondes. Le temps de transmission non corrigé est formé par l'échelle et l'addition de plusieurs compteurs. Heure de la semaine (TOW) en secondes depuis minuit Le dimanche est envoyé chaque sous-trame. Les bords de données marquent des intervalles de 20 ms dans des sous-trames de 300 bits. Le code se répète 20 fois par bit de données. La longueur du code est de 1023 puces et le taux de puce est de 1,023 Mbps. Enfin, les 6 bits les plus significatifs de la phase de code NCO sont ajoutés, fixant le temps de transmission à plusnn 15ns. Les positions des satellites au temps de transmission corrigé sont calculées à l'aide d'éphémérides dans les sous-trames 2 et 3. La position orbitale à un temps de référence (temps d'éphéméride) est fournie avec des paramètres permettant de calculer la position (x, y, z) Heures avant ou après. Les éphémérides sont régulièrement mis à jour et les satellites ne transmettent que les leurs. Les orbites à long terme de la constellation entière peuvent être prédites de façon moins précise en utilisant les données Almanac dans les sous-trames 4 et 5, mais cela n'est pas essentiel si une recherche rapide basée sur FFT est utilisée. Les solutions sont calculées en coordonnées terre-fixes (ECEF). La localisation de l'utilisateur est convertie en latitude, longitude et altitude avec une correction pour l'excentricité de la terre, qui se renfonce à l'équateur. Les diagrammes de dispersion ci-dessous illustrent la répétabilité, le bénéfice de la moyenne et l'effet de mauvais choix de satellites. Les carrés de grille sont 0,001 deg de chaque côté. Les points bleus marquent 1000 corrections. Les triangles jaunes marquent les centres de gravité: (i) rebord de fenêtre orienté vers le nord (ii) antenne de toit (iii) rebord de fenêtre orienté vers l'est Le groupe serré (ii) a été obtenu en utilisant des satellites dans quatre quartiers différents du ciel. Seule l'antenne sur le toit avait une vue dégagée dans toutes les directions. Mais les bonnes corrections ont été obtenues en faisant la moyenne, même lorsque la moitié du ciel était obscurcie. Les fixations sur le toit présentent également un étalement comme (i) et (iii) si les mauvais satellites sont choisis. Les solutions ci-dessus ont été générées sans compenser les retards de propagation ionosphérique en utilisant les paramètres de la page 18 de la sous-trame 4 qui doivent être appliqués car il s'agit d'un récepteur à fréquence unique. La réfraction ionosphérique augmente la longueur des trajets entre les utilisateurs et les satellites. En avril 2012, j'ai corrigé un bug qui causait des erreurs significatives dans les solutions de position des utilisateurs. À l'origine, en ne transformant pas les positions des satellites des coordonnées ECEF (Earth-Cented-Earth-Fixed-Earth-Fixed-Earth-Fixed-Earth-Centrale-Intégrale), j'ignorais effectivement la rotation de la Terre pendant les 60 à 80 ms que les signaux étaient en vol. Je vois maintenant des précisions de position positionnelle de plusmn 5 mètres après la moyenne, même avec une visibilité limitée des satellites. Ive a créé une annexe montrant comment la solution itérative est développée, à partir d'une équation de gamme géométrique, qui est linéarisé à l'aide d'une expansion de la série de Taylor, et résolu par des méthodes matricielles, pour le cas particulier de quatre satellites ou le cas général de plus, Option de l'utilisation de moindres carrés pondérés pour contrôler l'influence de satellites particuliers. Youll trouver ce code source et solution C dans les liens au bas de la page. Je suis reconnaissant à Dan Doberstein pour m'avoir envoyé un avant-projet de son livre GPS 2 qui m'a aidé à comprendre l'algorithme de solution. La spécification d'interface GPS 3 officielle du gouvernement américain est une référence essentielle. Moniteur de signal L'agencement de circuit ci-dessus, mis en œuvre pour la plupart en FPGA, se désexpide en prenant le produit du code IF 1 bit et du code ponctuel, laissant une modulation de données de 50 bps. Un petit cran dû à la suppression de porteuse BPSK peut simplement être vu: Ces spectres montrent la même transmission de propagation à différentes portées et largeurs de bande de résolution (RBW). Le décalage Doppler était de -1,2 KHz. Le bruit de fond est le bruit thermique de l'antenne amplifié et filtré par la bande IF. -3 dB de largeur de bande autour de 3 MHz, légèrement plus large que prévu. Le support de déploiement est de 5 dB au-dessus du bruit à 30 KHz RBW et de 25 dB au-dessus à 300 Hz RBW. La puissance du signal reçu à l'antenne peut être estimée à -174110log10 (30e3) 5 -123 dBm. Il m'étonne toujours comment bien l'information de domaine de fréquence est préservée par le hard-limiting L'émetteur de LVDS a un courant de sortie constant de 1mW dans 100 ohms. La puissance maximale observée à la SA ne peut pas dépasser 0 dBm. Ici, nous voyons cette puissance disponible répartis sur une gamme de fréquences. La densité spectrale de puissance intégrée à large bande doit être le premier oscillateur local Ive a été la construction de synthétiseurs expérimentaux fractionnaire-N en utilisant la logique programmable générale pour plusieurs années: Xilinx Spartan 3 FPGA Frac7 a été construit à cette fin, mais je n'avais aucune idée Frac5 serait utilisé dans un GPS Récepteur lorsque je l'ai conçu à l'origine. La photo ci-dessous montre comment la sortie ROS-1455 VCO sur Frac5 a été répartie de manière résistive entre la sortie SMA et un séparateur Hittite HMC363 diviser-par-8. La sortie du diviseur de 200 MHz est acheminée (de façon différentielle) dans le FPGA dont la phase le verrouille à une référence maître en utilisant des méthodes documentées dans mes projets antérieurs. Circuity micro-ondes sur Frac7 est similaire, mais utilise un diviseur Mini-Circuits 3dB. On obtient une grande stabilité et un faible bruit de phase, comme on peut le voir dans les spectres de sortie VCO présentés ci-dessous. Lorsque Frac5 a été développé à l'origine, en tant que synthétiseur de fréquence dédié, le basculement simultané sur des fréquences non harmoniquement liées a été évité pour minimiser les spurs d'intermodulation. Le FPGA était statique lorsque les impulsions d'horloge que la sortie du détecteur de phase à bascule traversaient le tissu. Ce n'est pas le cas lorsque le FPGA accueille un récepteur GPS, mais heureusement, la sortie de l'oscillateur local est assez bonne: les analyseurs de spectre Marconi 2383 50MHz STD OUTPUT ont été utilisés comme source de référence principale pour Frac5 et toutes les horloges internes du récepteur GPS. Les récepteurs GPS ont besoin d'une précision supérieure à 1 ppm (parties par million) pour mesurer des décalages Doppler de plus de 5 KHz sur le support L1 de 1575,42 MHz. Toute incertitude de fréquence nécessiterait une plage de recherche plus large. Embedded CPU Mon récepteur GPS d'origine ne pouvait suivre 4 satellites. Le tissu disponible n'a pas été utilisé efficacement et le FPGA était plein. Une logique identique a été répliquée pour chaque canal et seulement horloge activée à l'époque de code 1 KHz. Les taux de mise à jour GPS sont assez peu exigeants et la plupart des traitements parallèles peuvent facilement être effectués séquentiellement. L'incorporation d'une CPU pour cette tâche a à la fois augmenté le nombre de canaux et libéré de l'espace dans le FPGA. Cette CPU exécute directement des primitives FORTH en tant qu'instructions natives. Les visiteurs de ma page d'ordinateur FORTH de Mark 1 seront déjà conscients de mon intérêt pour la langue. FORTH n'est pas grand public et son utilisation ici pourrait être une barrière ésotérique cependant, je ne pouvais pas résister à faire une autre CPU FORTH, cette fois en FPGA, après avoir vu l'excellent projet J1, qui a été une source d'inspiration. FORTH est un langage basé sur la pile, ce qui signifie essentiellement que le CPU a des piles au lieu des registres à usage général. Wikipedia a un bon aperçu. FPGA: 360 tranches 2 BRAMs Exécution d'instructions à cycle unique Architecture de type FORTH et double pile Cheminée de 32 bits et trajectoires de données ALU Exploitation double-précision 64 bits Multiplicateur de matériel 2k octets (extensible à 4k octets) code et données RAM Macro Assembler développement de code Mémoire et IO Deux BRAM sont utilisés: un pour la mémoire principale, l'autre pour les piles. Xilinx bloc de RAM est à double portage, permettant à une instance d'accueillir les données et les piles de retour. Chaque pointeur de pile est supérieur à la moitié du tableau. Le double portage de la mémoire principale permet l'accès aux données en même temps que l'extraction d'instructions. Un port mémoire est adressé par le compteur de programme, l'autre par T, le haut de la pile. Les écritures vers le port adressé par PC sont également utilisées pour le téléchargement de code, le compteur de programme fournissant des adresses incrémentales. Le code et les données partagent la mémoire principale, qui est organisée en 1024 (extensible à 2048) mots de 16 bits. Les accès mémoire peuvent être de 16, 32 ou 64 bits, alignés sur les mots. Toutes les instructions sont de 16 bits. Le code total plus la taille des données de l'application GPS est inférieur à 750 mots, malgré le déroulement de toutes les boucles. IO n'est pas mappé en mémoire, occupant son propre espace de sélection de 36 bits (12 dans 12 sorties 12 événements). Un codage à chaud est utilisé pour simplifier le décodage de sélection. Les opérations d'E / S sont différentes en 1-bit, 16 ou 32 bits en parallèle. Les données série décalent 1 bit par cycle d'horloge. Les événements sont principalement utilisés en tant que stroboscopes matériels et diffèrent des écritures en ne faisant pas apparaître la pile. Format d'instruction 24 instructions sur 32 possibles sont actuellement attribuées dans l'espace opcode h80XX-h9FXX. Il s'agit principalement d'opérations ALU de pile à zéro-opérande. L'option ret, qui effectue le retour du sous-programme, s'exécute en parallèle, dans le même cycle. Add-immediate est la seule instruction d'un opérande. Une option de report étend la précision d'ajout (empilée, implicite). HF0000 - hFFFF est de rechange. Les chemins de données Stack et ALU sont 32 bits, cependant, les opérations 16, 32 et 64 bits sont prises en charge. Les valeurs 64 bits occupent deux endroits sur la pile, avec les bits les moins significatifs sur le dessus. Le sommet de la pile, T, et le suivant sur la pile, N, sont enregistrés en dehors du BRAM pour l'efficacité. Outre le décalage à gauche de 64 bits (opshl64) qui est câblé pour l'exécution d'un seul cycle, toutes les autres fonctions de double précision sont des sous-programmes logiciels. Langage d'assemblage Le binaire GPS intégré a été créé en utilisant Microsofts Macro Assembler MASM. Cela ne prend en charge que les mnémoniques x86 mais les opcodes sont déclarés en utilisant equ et le code est assemblé en utilisant les directives dw. MASM fournit non seulement une résolution d'étiquette, une expansion de macro et une évaluation d'expression mais même des structures de données L'opérateur dup () de MASM est utilisé de manière extensive pour dérouler des boucles, par ex. Dw N dup (opcall dest) appelle une sous-routine N fois. Ce fragment donne une certaine saveur de style source. Stack-effect est commenté sur chaque ligne: opfetch16 et opstore16 sont des primitives. Opstore32 et opstore64 sont des sous-routines ou des instructions composées utilisables comme si elles étaient des primitives. T est en fait 15: 0,31: 16 après opswap16. Mais nous ne nous soucions pas du 16 bits supérieur ici. Opstore16 laisse la profondeur de la pile d'adresses ne peut changer que plusmn1 par cycle. Les puristes pourraient préférer: dw N addi Host interfaces série Le FPGA peut être contrôlé via SPI par le Raspberry Pi, ou par un PC Windows à l'aide d'un câble Xilinx Platform USB JTAG. Il y a deux niveaux de priorité de la requête: Envoyer une nouvelle commande et un sondage pour la réponse aux précédentes Les nouvelles images de code sont copiées dans la mémoire principale par l'intermédiaire d'un troisième BRAM qui relie les domaines d'horloge CPU et série. Ainsi téléchargées, les images binaires s'exécutent automatiquement. Les commandes d'hôte sont capturées dans le BRAM de pont et la CPU est signalée pour les actionner. Ses réponses sont recueillies par l'hôte à partir du pont sur la prochaine analyse. Les sondages en boucle principale de niveau supérieur pour les demandes de service hôte. Le premier mot de tout message hôte est un code de commande. Les requêtes sont envoyées via la table de saut Commands: optor déplace le vecteur vers la pile de retour. Certaines demandes d'hôte (par exemple, CmdGetSamples) provoquent des réponses longues. Les ports de données du côté CPU du pont sont 16 bits. Le processeur peut lire et écrire ces données via la pile de données, mais il existe des chemins plus directs pour le chargement de la mémoire principale et des échantillons GPS IF. L'instruction opwrEvt GETMEMORY transfère un mot de mémoire directement au pont, en utilisant T comme un pointeur d'incrémentation automatique. GETMEMORY est le seul événement qui a un effet de pile. L'instruction opwrEvt GETSAMPLES transfère 16 bits de l'échantillonneur IF: Le déroulement des boucles au moment de l'assemblage avec dup () trades la taille du code pour la performance, en évitant un décrément-test de la branche et le binaire entier de l'application est encore minuscule, les boucles longues doivent être imbriquées , as illustrated above. CHANNEL data structure An array of structures holds state variables and buffered NAV data for the channels. MASM has excellent support for data structures. Field offsets are automatically defined as constants and the sizeof operator is useful. The epoch service routine (labelled Method: ) is called with a pointer to a CHANNEL structure on the stack. Affecting OO-airs, stack-effect comments refer to it as this throughout the routine. A copy is conveniently kept on the return stack for accessing structure members like so: The Chans array is regularly uploaded to the host. Raspberry Pi application software The Raspberry Pi software is multi-tasked using what are variously known as coroutines, continuations, user-mode or light-weight threads. These co-operatively yield control, in round-robin fashion, using the C library setjmplongjmp non-local goto, avoiding the cost of a kernel context-switch: Up to 16 threads can be active:Linear Programming - (as an optimization problem) Matlab is well suited to handle the so called linear programming problems. These are problems in which you have a quantity, depending linearly on several variables, that you want to maximize or minimize subject to several constraints that are expressed as linear inequalities with the same variables. Sometimes the number of variables and the number of constraints are high, or the constraints in the linear inequalities or the expression for the quantity to be optimized may be numerically complicated. We will illustrate the method of linear programming by means of a simple example giving a numerical solution. Matlab has some special functions such as simlp or linprog to tackle down this type of problems, but these built-in functions are not always available since they belong to special toolboxes ( Simulink or Optimization toolboxes). Therefore, we are going to formulate the problem as an optimization issue, and well use the instruction fminsearch , which is an always available instruction. Lets suppose that a merry farmer has 75 roods (4 roods 1 acre) on which to plant two crops: wheat and corn. To produce these crops, it costs the farmer (for seed, water, fertilizer, etc. ) 120 per rood for the wheat, and 210 per rood for the corn. The farmer has 15,000 available for expenses, but after the harvest the farmer must store the crops while awaiting favorable or good market conditions. The farmer has storage space for 4,000 bushels. Each rood yields an average of 110 bushels of wheat or 30 bushels of corn. If the net profit per bushel of wheat (after all the expenses) is 1.30 and for corn is 2.00, how should the merry farmer plant the 75 roods to maximize profit We begin by formulating the linear programming problem mathematically. We express the objective (profit) and the constraints. Let x denote the number of roods allotted to wheat and y the number of roods allotted to corn. Then the expression to be maximized is clearly P (110)(1.3) x (30)(2) y 143 x 60 y There are some constraint inequalities, specified by the limits on expenses, storage and roodage. They are: As we mentioned before, we are going to formulate this as an optimization problem using the fminsearch built-in function. In Matlab, the instruction works as follows: X FMINSEARCH(FUN, X0,OPTIONS) minimizes with the default optimization parameters replaced by values in the structure OPTIONS, created with the OPTIMSET function. FMINSEARCH uses these options: Display, TolX, TolFun, MaxFunEvals, MaxIter, FunValCheck, and OutputFcn. This is one possible approach for our objective function, which is saved as an m-file (in this case OFP. m): function OFValue OFP(x) Here we embed the constraints or inequalities. If the constraints are not met, we penalize the optimization by giving an arbitrary high value to the objective function. if 120 x(1) 210 x(2) gt 15000 . 110 x(1) 30 x(2) gt 4000 . x(1) x(2) gt 75 . x(1) lt 0 . x(2) lt 0 OFValue 10 return end fminsearch tries to minimize the function, so we invert its sign P 143 x(1) 60 x(2) OFValue - P Then, we can call it from another script, which includes the fminsearch function calling the objective function file (in OFP): clear clc format bank We have to start with a seed for the search x 1 10 We can perform the optimization with different number of iterations or tolerances options optimset(MaxFunEvals, 2000, TolX, 1e-2) xopt, FunVal, EF, output fminsearch(OFP, x, options) Finally, we display the profit using the found solution P 143 xopt(1) 60 xopt(2) And the Matlab response is: xopt 21.87 53.12 FunVal -6315.62 EF 1.00 output iterations: 121.00 funcCount: 243.00 algorithm: Nelder-Mead simplex direct search message: 1x196 char This means that the farmer should consider 21.87 roods for wheat, 53.12 roods for corn, and his profit would be 6,315.62. It is important to notice that this is a numerical approximation. which means that if we start with another seed or use other parameters in the options set, we can get to another result. The number found is a possible solution, but theres no guarantee that it is the best one, according to tolerances or to number of iterations or evaluations desired. For example, we can use the seed x 10 10 instead (without moving any other instruction), and the Matlab answer now is: xopt 32.31 14.88 FunVal -5512.50 EF 1.00 output iterations: 75.00 funcCount: 151.00 algorithm: Nelder-Mead simplex direct search message: 1x196 char Now, the best profit found is only 5,512.50. So, it is a good idea to try with several seeds and different parameters in the options set to compare with and select the best solution. Most of the times the solutions will be very close (at least for linear programming problems).
No comments:
Post a Comment