Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Re: [GPS] Codificacion PRN

Última Actualización: 19 de enero de 2006 - Jueves

References: <510254154.20060110194716@telefonica.net>
Message-ID:  <43C4F1B3.5070502@argo.es>
Date: Wed, 11 Jan 2006 12:53:23 +0100
From: Jesus Cea <jcea@ARGO.ES>
Subject: Re: [GPS] Codificacion PRN
To: GPS@LISTSERV.REDIRIS.ES
In-Reply-To:  <510254154.20060110194716@telefonica.net>

Jose Angel Navarro wrote:
> No es un articulo sobre gps, es una propuesta sobre el sistema
> mas conveniente de codificacion para buscar señales
> extraterrestres y que relata la bondades de la codificacion
> gps/prn y lo describe bastante bien.

El artículo probablemente sea demasiado técnico para el común de los mortales, incluso aunque ese mortal sea un experto en el uso práctico del GPS :-).

La idea básica es que la correlación entre un código PRN concreto y cualquiero otro código (incluyendo versiones diferidas del mismo código) es mínima. La correlación SOLO es máxima cuando se compara el código consigo mismo. Ello permite enviar múltiples señales en una misma frecuencia, mediante el procedimiento de modular cada señal con un código PRN diferente. Las señales se "machacan" entre sí, pero al recibir usamos un código PRN concreto, por lo que la señal correcta se ve realzada y el resto de señales desaparecen. Es lo que se hace en el GPS. Un receptor GPS "normal" tendrá 12-16 correladores trabajando en paralelo, cada uno usando el código PRN de un satélite concreto. El código concreto a usar se obtiene sabiendo la hora, la posición aproximada del receptor y teniendo un almanaque "reciente" de la constelación GPS. Con esa info sabemos qué satélites están sobre el horizonte, y usamos sus códigos PRN para buscarlos. No tiene sentido intentar buscar un satélite que está debajo del horizonte.

Es por ello que si apagamos el GPS y nos vamos a las antípodas, el GPS tardará bastantes minutos en darnos un "fix", en vez de los 45 segundos normales.

Un buen código PRN debe cumplir ciertas propiedades matemáticas (correlación cruzada mínima) y algorítmicas (fácil de generar y representación compacta), pero como ejemplo se puede usar una señal aleatoria cualquiera.

Algo a destacar es que cuanto más largo sea el código, mejor. Lamentablemente eso implica también tiempos de "alineamiento" del código más elevados, ya que el código PRN generado por el receptor de forma local debe sincronizarse exactamente con el código PRN de la señal que llega.

PRN significa Pseudo Random Noise (Ruido pseudo aleatorio). Ese nombre proviene de que la señal parece ruido (de hecho una señal aleatoria larga funciona "casi" igual de bien) y lo de "pseudo" es porque no es realmente aleatorio, sino que se obtiene de una fórmula. Eso es así por una cuestión de pura eficiencia y compacidad. Pero, como digo, una señal aleatoria, en promedio, es casi igual de buena.

Envío un pequeño ejemplo en lenguaje de programación python, para ver qué es eso de PRN, correlación y demás. Utilizaré un código aleatorio (no PRN) por sencillez.

=====
# Creacion del codigo aleatorio
import random
codigo=[]
for i in xrange(1024) :
  codigo.append(2*random.randint(0,1)-1)

# Imprimimos correlacion cruzada consigo mismo
correlacion=0
for i in codigo :
  correlacion+=i*i

print correlacion

# Imprimimos correlacion cruzada consigo mismo desplazado
correlacion=0
# Desplazamos el codigo 17 espacios.
# Vale cualquier valor, incluso 1 :)
codigo2=codigo[:17]+codigo[17:]
for i in codigo :
  j=codigo2.pop()
  correlacion+=i*j

print correlacion

# Imprimimos la correlacion cruzada con una señal aleatoria
correlacion=0
for i in codigo :
  correlacion+=i*(2*random.randint(0,1)-1)

print correlacion
=====

Los resultados variarán de ejecución a ejecución, por estar trabajando con valores aleatorios. La tendencia, por supuesto, debería ser clara.

En una ejecución cualquiera, yo obtengo 1024 para la correlación consigo mismo (la longitud del código), 72 para la correlación consigo mismo desplazado y -26 correlando con otro código aleatorio.

La diferencia entre 1024 y 72 o (-)26 es muy alta, que es lo que interesa.

Cuanto más lárgo sea el código, mayor diferencia. Por ejemplo, para un código de 16386 unidades de largo, en un ejemplo cualquiera de ejecución (los valores cambian en cada ejecución, recordemos), los valores son 16384, -160 y 266, respectivamente.

Espero que la explicación sea útil.

--
Jesus Cea Avion                         _/_/      _/_/_/        _/_/_/
jcea@argo.es http://www.argo.es/~jcea/ _/_/    _/_/  _/_/    _/_/  _/_/
                                      _/_/    _/_/          _/_/_/_/_/
PGP Key Available at KeyServ   _/_/  _/_/    _/_/          _/_/  _/_/
"Things are not so easy"      _/_/  _/_/    _/_/  _/_/    _/_/  _/_/
"My name is Dump, Core Dump"   _/_/_/        _/_/_/      _/_/  _/_/
"El amor es poner tu felicidad en la felicidad de otro" - Leibniz

----------------------------------------------------
Archivos de GPS: http://listserv.rediris.es/archives/gps.html
------------------------------------------------------



Python Zope ©2006 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS