Objetivo
Diseñar un mo / dulator dem par odulator a transmitir los datos con precisión lo más rápidamente posible sobre simulado llanura de servicio telefónico antiguo (POTS) .
Pasos
- Genere algunos datos aleatorios (
/dev/random
o similares) que demorarán entre 3 y 4 segundos en transmitirse - Modula los datos con tu modulador para producir un archivo de audio
- Pase el archivo de audio a través del simulador POTS . Si no tiene Python / Scipy, puede cargar un archivo con el formulario o hacer una solicitud de API JSON.
- Demodular el archivo de audio de nuevo a datos binarios
- Valide que la entrada y la salida son iguales * (el límite 1 de cada 1000 bits puede estar dañado)
- La puntuación es el número de bits transmitidos dividido por la longitud del archivo de audio (bits / segundo)
Reglas
- El archivo de entrada debe ser de 3-4 segundos, 44,1 kHz, mono.
- Ejecute el simulador con una SNR de 30 dB (es el valor predeterminado)
- El demodulador debe reconstruir los datos transmitidos con una tasa de error de bits de no más de 10-3 (1 por cada mil bits).
- No se permite la compresión digital (es decir, comprimir los datos. Está fuera del alcance del desafío).
- No intentar introducir datos en frecuencias superiores a 4 kHz. (Mis filtros no son perfectos, pero son razonablemente similares a POTS con un número relativamente pequeño de toques).
- Si su protocolo de módem requiere un preámbulo corto (no más de 1 segundo) para sincronizar / calibrar el receptor, no se penaliza.
- Si es posible, aloje el archivo de audio en un lugar accesible para que podamos escuchar una cacofonía de pitidos y boops.
Ejemplo
Aquí hay un cuaderno de ejemplo que demuestra la modulación / demodulación con una simple "activación / desactivación" (¡muestras de audio incluidas!).
Anotaría 100 (bits / segundo). Tenga en cuenta que está transmitiendo con una SNR de 5 dB mucho peor.
code-challenge
audio
Nick T
fuente
fuente
wget wikipedia.org/Special:Random | grep title | texttospeech audio.wav
speechtotext POTSaudio.wav | wget wikipedia/wiki/$text
Respuestas:
MATLAB, 1960 pb
Aquí está mi intento actualizado:
Desde mi primer intento, he jugado un poco. Ahora hay un pequeño preámbulo al principio (períodos de 18 bits, pero podría ser más corto) que contiene solo una onda cosenoidal. Extraigo esto y lo repliqué para crear portadores de seno y coseno en fase correcta para la demodulación, ya que es un preámbulo muy corto, no lo he contado en la tasa de bits según sus instrucciones.
Además, desde el primer intento, ahora estoy usando una constelación QAM8 para lograr 3 bits por símbolo en lugar de 2. Esto efectivamente duplica la velocidad de transferencia. Entonces, con una portadora de ~ 2.4kHz, ahora estoy alcanzando 1960bps.
También he mejorado la detección de símbolos para que el promedio no se vea afectado por los tiempos de aumento lentos causados por el filtrado; básicamente, solo se promedia la segunda mitad de cada período de bits para eliminar el impacto de los tiempos de aumento.
Todavía no está cerca del ancho de banda del canal teórico de 40 kbps de la teoría de Shannon-Hartley (suponiendo que la SNR de )
Solo para aquellos a quienes les gustan los sonidos horribles , esta es la nueva entrada:
Y en caso de que alguien esté interesado, esta es la entrada anterior de 960bps
fuente