2011-09-19 11 views
6

Actualmente estoy trabajando en algún código para transmitir mensajes/archivos/y otros datos sobre los láseres que utilizan transformación de audio. Mi código actual usa la función hexlify del módulo binascii en python para convertir los datos a binarios, y luego emite un tono para un 1 y un tono diferente para un 0. Esto en teoría funciona, aunque no es la manera más rápida de codificar/decodificar , pero en las pruebas hay algunos errores.Cambio de fase binario Keying en Python

  1. los tonos generados no son acertadas, es decir: emitir 150Hz puede llegar a ser 145-155Hz en el extremo receptor, esto no es un gran problema ya que sólo puede establecer los límites en el extremo receptor más bajo o más alto

  2. el problema real es que si emito un tono, y se reproduce, la computadora en el extremo receptor puede leerlo varias veces o no leerlo en absoluto en función de la frecuencia con que muestrea el audio entrante. Intenté reproducir los tonos a la misma velocidad que muestrea, pero eso es muy dudoso.

En total, he tenido un par de carreras con éxito utilizando mensajes cortos, pero esto es muy poco fiable e inexacta debido a los problemas anteriormente mencionados.

He analizado esto más a fondo y una solución a esto parece que podría involucrar BPSK o Binary Phase Shift Keying, aunque no estoy seguro de cómo implementar esto. ¡Cualquier sugerencia o muestra de código sería apreciada!

Mi código para el proyecto se puede encontrar here pero los archivos principales en los que estoy trabajando son para decodificación binaria y codificación que es here y here. No soy un experto en Python, así que, por favor, perdónenme si algo que dije es incorrecto, mi código no es el mejor, o si he pasado por alto algo básico.

Gracias! :-)

Respuesta

7

¡Eche un vistazo a la Radio GNU!

http://gnuradio.org/redmine/projects/gnuradio/wiki

GNU Radio es un proyecto para hacer, en software, lo más posible de la transmisión de señales de radio o recepción. Debido a que la radio ya usa la manipulación por desplazamiento de fase, los chicos de la Radio GNU ya han resuelto el problema, ¡y la Radio GNU ya es un proyecto de Python! Y el material DSP complicado está escrito en C++ para la velocidad, pero envuelto para su uso en Python.

Aquí hay una página que trata sobre un proyecto que utiliza la codificación de desplazamiento de fase binaria diferencial (DBPSK)/desplazamiento de fase en cuadratura diferencial (DQPSK) para transmitir datos binarios (en el ejemplo, una imagen JPEG). El código fuente de Python está disponible para descargar.

http://www.wu.ece.ufl.edu/projects/softwareRadio/

veo que su proyecto está bajo la licencia MIT. GNU Radio está bajo GPL3, lo que puede ser un problema para usted. Debe averiguar si puede usar GNU Radio sin necesidad de convertir su proyecto en un trabajo derivado, lo que le obligará a cambiar su licencia. Debería ser posible crear un "demonio emisor" independiente y un "daemon receptor" independiente, cuyo código fuente sería GPL3, y luego tener su código MIT conectado a ellos en un socket o algo así.

Por cierto, una de mis búsquedas encontraron esta muy clara explicación de cómo funciona BPSK:

http://cnx.org/content/m10280/latest/

Buena suerte!

+0

¡Gracias, esto ayudará mucho! – sbrichards

4

En respuesta a la primera cuestión relativa a la frecuencia:

En cuanto a su decodificador, veo que la frecuencia de muestreo es de 44100 y el tamaño del fragmento es 2048. Si estoy leyendo esto, eso significa que su tamaño de la FFT es 2048. Eso pondría el tamaño de tu FFT en ~ 21hz. ¿Has intentado cero rellenar tu FFT? Zero-padding FFT no cambiará la frecuencia, pero le dará una mejor resolución. Veo que está utilizando una interpolación cuadrática para mejorar su estimación de frecuencia. No he usado esa técnica, así que no estoy familiarizado con la mejora que se obtiene de eso. Tal vez un equilibrio entre cero relleno y hacer una interpolación cuadrática le dará una mejor precisión de frecuencia.

Además, dependiendo del hardware que realiza la transmisión y la recepción, el error de frecuencia puede ser el resultado de diferentes relojes que accionan el A/D: uno o ambos relojes no están exactamente a 44100Hz. Algo así podría afectar la frecuencia que ves en tu salida de FFT.

+0

+1 para relleno cero. Aún mejor si solo puedes aumentar el tamaño del fragmento y procesar más datos. http://zone.ni.com/devzone/cda/tut/p/id/4880 – steveha

+0

¡Gracias también! Sin embargo, no puedo aceptar dos respuestas: / – sbrichards

Cuestiones relacionadas