Estoy tratando de transmitir datos binarios de un dispositivo a otro a través de un canal de audio (altavoz / micrófono). Utilizo AFSK (Audio Frequency Shift Keying) como en Packet Radio, con y dos frecuencias f m a r k = 1200 Hz y f s p a c e = 2200 Hz . Jugué un poco en Ruby y mi primera implementación simplemente imita un demodulador incoherente clásico, que funciona bien, hasta ahora.
El problema es que estoy intentando portar esto a una plataforma móvil donde el rendimiento es una preocupación y mi solución actual es demasiado lenta. He encontrado numerosas formas de demodular AFSK en software:
- DFT deslizante (FFT)
- Filtro deslizante de Görtzel
- Fase de bucle bloqueado
- No hay paso
¿Cuál sería el camino a seguir? Hay demasiadas opciones para elegir. Estoy seguro de que hay aún más opciones disponibles. ¿Quizás existen soluciones aún mejores que las que mencioné anteriormente? ¿Alguien tiene un código de ejemplos para mí? Estoy preocupado con
- Rendimiento (debe ejecutarse en la plataforma móvil, por ejemplo, un dispositivo iOS o Android)
- Estabilidad (debería poder manejar algo de ruido)
Cualquier sugerencia y sugerencias son muy apreciadas!
fuente
Respuestas:
Creo que podría obtener el mejor rendimiento en términos de tasa de error de bits del demodulador (BER) con un bucle de fase bloqueada. Sin embargo, necesitas que sea rápido. Creo que su mejor apuesta para un algoritmo rápido que aún funcione razonablemente bien es el cruce por cero.
En una nota al margen, me gustaría sugerir que cambie los 2200 Hz a 2400 Hz. Una implementación ingenua del esquema de 1200/2200 Hz produciría discontinuidades, como se ve alrededor de dos tercios en el gráfico a continuación, donde las transiciones de 2200 Hz a 1200 Hz.
Para minimizar el ancho de banda que está utilizando y evitar discontinuidades que distorsionarán la señal que necesitará para que la fase sea continua. Sin embargo, incluso si hace que la fase del transmisor sea continua, seguirá existiendo el problema de que los símbolos de 2200 Hz no siempre tendrán el mismo número de cruces por cero debido a las diferentes fases. Por lo general, tendrán cuatro cruces por cero, pero a veces tendrán tres. Los símbolos de 1200 Hz, por otro lado, siempre tendrán dos cruces por cero porque la velocidad en baudios se divide uniformemente en la frecuencia FSK.
Puede resolver ambos problemas cambiando los 2200 Hz a 2400 Hz. Entonces, los símbolos siempre comenzarán y terminarán a 0 grados (lo que los convierte automáticamente en fase continua), y siempre tendrán el mismo número de cruces por cero: dos y cuatro.
fuente
Hice un decodificador para AFSK (estándar Bell 202) usando receptores de correlación para 1200 Hz y 2200 Hz, con muy buenos resultados.
La amplitud resultante es bastante independiente de la fase de señal, y la SNR de salida es muy buena.
fuente
En el caso de RTTY 45.45 baudios, también tendrá símbolos que no son un número entero de muestras, por lo que necesita una función que pueda llamarse cada muestra y luego indicar su valor de retorno cuando ese símbolo haya finalizado. Y necesita un acumulador de fase, que mantiene una cuenta corriente de dónde está la fase de la onda sinusoidal.
Para enviar símbolos cuya longitud no sea un múltiplo entero de la frecuencia de muestreo, necesita esta función ...
Para usarlo, genere la siguiente muestra de onda sinusoidal y llame a esta función, luego verifique si el valor de retorno NO es igual a dos. Si no es igual a dos, avance al siguiente símbolo y decida si está enviando una marca de espacio, luego llame a esta función nuevamente dentro del bloque de código que se ejecuta cuando descubrió que el valor de retorno no es igual a dos.
Y aquí está el acumulador de fase del firmware de Rockbox, con un cambio para permitir cambios en la amplitud (el volumen total es 32767, el volumen completo desfasado 180 grados es -32768).
fuente