Activación de cambio de fase binaria en Python

Actualmente estoy trabajando en un código para transmitir mensajes / archivos / y otros datos a través de láseres utilizando la 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 sea la forma más rápida de codificar / decodificar , pero en las pruebas hay algunos errores.

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

  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 según la frecuencia con la que muestrea el audio entrante. He intentado tocar los tonos a la misma velocidad que muestra, pero eso es muy dudoso.

En general, he tenido un par de ejecuciones exitosas usando mensajes cortos, pero esto es muy poco confiable e inexacto debido a los problemas mencionados anteriormente.

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

Mi código para el proyecto se puede encontrar aquí, pero los archivos principales en los que estoy trabajando son para deencoding y encoding binaria, que están aquí y aquí . No soy un experto en python, así que perdóneme si algo de lo que he dicho está mal, mi código no es el mejor, o si he pasado por alto algo básico.

¡Gracias! 🙂

¡Echa un vistazo a GNU Radio!

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

GNU Radio es un proyecto para hacer, en software, la mayor cantidad posible de transmisión o recepción de señales de radio. Debido a que la radio ya usa el cambio de fase, los chicos de GNU Radio ya han resuelto el problema por ti, ¡y GNU Radio ya es un proyecto de Python! Y las cosas complicadas de DSP están escritas en C ++ para velocidad, pero envueltas para usar en Python.

Aquí hay una página en la que se discute un proyecto que utiliza la encoding de cambio de fase binario diferencial (DBPSK) / la encoding de cambio de fase de 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 tener que convertir su proyecto en un trabajo derivado, lo que lo obliga a cambiar su licencia. Debería ser posible hacer un “demonio de envío” independiente y un “demonio de recepción” independiente, cuyo código fuente sea GPL3, y luego hacer que su código MIT se conecte a ellos a través de un socket o algo.

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

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

¡Buena suerte!

En respuesta al primer número de la frecuencia:

Mirando su decodificador, veo que su frecuencia de muestreo es 44100 y su tamaño de fragmento es 2048. Si estoy leyendo esto correctamente, eso significa que su tamaño FFT es 2048. Eso pondría su tamaño de contenedor FFT en ~ 21 hz. ¿Has intentado poner a cero tu FFT? Rellene con Cero la 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 obtienes de eso. Tal vez un equilibrio entre el relleno cero y la interpolación cuadrática le proporcionará una mejor precisión de frecuencia.

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