La semana pasada,
hablé sobre cómo Yandex. Las estaciones se activan a través del sonido. Resultó que la contraseña de WiFi se transmite en texto claro. Me preguntaba por qué era necesario hacer la activación de esta manera, y no de alguna manera depurada.
Como resultado, llegué a la conclusión de que el programa es importante en este proceso. Pero, ¿qué sucederá si hacemos un protocolo de transferencia de datos que esté completamente enfocado en la experiencia del usuario? Así nació el proyecto Octave: para la transferencia de datos melódicos.

Debajo del corte, le diré cómo se hizo el prototipo y le daré un enlace a la demostración. Puedes escuchar cómo suena cualquier mensaje :)
Resumen del articulo anterior
Grabé el sonido con el que se activa la estación, miré la visualización de la transformada de Fourier en movimiento y me di cuenta de cómo se organiza la señal y dónde se encuentra la contraseña de WiFi.

Se transmite una cadena hexadecimal, donde para cada carácter 0 - F hay una frecuencia de 1 kHz - 4.6 kHz con un paso de 240 Hz. Me preguntaba por qué era necesario hacer la activación de esta manera, y no a través de Bluetooth, como por ejemplo con las aspiradoras robotizadas chinas, y llegué a la conclusión de que en este caso, la eficiencia es más importante que la seguridad o la velocidad.
Inspiración
De verdad! Después de todo, el protocolo de comunicación es siempre un compromiso entre rango, velocidad y confiabilidad. Pero, ¿qué pasa si todas estas características se desvanecen en el fondo y el factor decisivo es el factor de impresión para el usuario?
Me gustó la idea simple, como un martillo, de los desarrolladores de Yandex: elegir 16 frecuencias: una para cada símbolo hexadecimal. Y también tenía un receptor de señal de un estudio anterior, así que decidí desarrollar esta idea y no pensar en nada desde cero.
Dos mejoras
Eliminar salto de fase
En primer lugar, cuando analicé la señal de activación de la estación, me confundió el ruido en todas las frecuencias al momento de cambiar el símbolo. Estas son las barras verticales en el espectrograma:

En estos momentos, se escuchan clics. La razón de este efecto es una brecha de fase entre los personajes. El hecho es que la longitud de un símbolo no se ajusta a un número entero de períodos de vibraciones de sonido. Por lo tanto, al momento de cambiar la frecuencia, la amplitud de la señal cambia dramáticamente. Algo como esto:

Existen varios métodos en la radio para evitar este efecto. Decidí reducir suavemente la amplitud de la señal al momento de cambiar la frecuencia y luego aumentarla suavemente, suena más suave. Se ve así:

Quizás los clics no fueron un error, sino características y dieron un sonido más "futurista", pero me gusta más sin ellos :)
Agregar música
Transmitimos datos a través del sonido. ¿Por qué no usar frecuencias de nota para esto? Probé diferentes opciones, al final elegí 16 notas, comenzando desde Antes de la primera octava.

Usar notas más altas hará que tus oídos estén menos cómodos. Y las notas más bajas se transmiten peor debido a las características de la respuesta de frecuencia de altavoces y micrófonos. Además, las frecuencias de las notas bajas están más cercanas entre sí, lo que afecta la recepción.
Resultó una especie de modulación de frecuencia musical. Llamémoslo "Croup-modulation" :)
Lanzamos
Como suena eso Para que pueda intentarlo directamente en el navegador, reescribí el transmisor modulado Krup de python a js e hice una interfaz simple.
Aprovecho esta oportunidad para saludar:
Uso utf-8, lo que significa que también se pueden transmitir caracteres cirílicos e incluso emojis. Las parcelas con ellos son más largas, ya que cada personaje tiene más de 1 byte.
Suena un poco menos agradable que el latín, ya que cada carácter cirílico contiene el mismo byte de dirección. Pero sigue siendo interesante :)
Puedes probar cualquier frase
aquí . (Duplicado al final del artículo)
¿Pero qué hay del receptor?
Por supuesto, es divertido escuchar sonidos aleatorios basados en texto, pero la transmisión de datos solo se puede llamar si la señal se recibe, demodula y decodifica.
Hice un prototipo de un receptor python como prueba de concepto. Así es como funciona:
Ya ves, la transferencia de datos es como por notas! Por supuesto, no hay ninguna producción en este momento. No hay sincronización, codificación de corrección de errores y control de integridad. Pero si la comunidad muestra interés y presenta un par de opciones para uso práctico, puedo implementar la funcionalidad anterior y envolverla en una biblioteca normal :)
Para resumir
Fue un proyecto interesante para un par de noches con un resultado bastante espectacular. Dicha transferencia de datos se puede utilizar, por ejemplo, como un "código QR de sonido", para compartir una cuenta desde un teléfono a un sitio web, etc.
Alternativamente, puede usarlo para crear tonos de llamada para marcas. Aquí, por ejemplo,
suena como habr .
Todos los desarrollos actuales están disponibles en el
github : puede intentar desarrollar el proyecto usted mismo.
Duplique el
enlace a la demostración que se ejecuta en el navegador.Gracias por leer! Espero que te haya interesado.
Buena suerte