sábado, 23 de marzo de 2024

Ocultando imágenes en el espectro de un sonido con R

Un clásico juego de encriptación consiste en incrustar imágenes en el espectro de un archivo de audio. Escuchándolo va a sonar horrible, pero si dibujamos su espectrograma las imágenes aparecerán por arte de magia.

Se me ocurren tres formas de abordarlo:

  • Generar una señal de ruido blanco y filtrarla de forma adaptativa en el tiempo según la imagen a codificar
  • Considerar la imagen a codificar directamente como un espectrograma y calcular sobre él la FFT inversa en tramos temporales
  • Construir un generador multitono y modular la amplitud de sus distintas frecuencias en el tiempo en base a la imagen a codificar

~~~

A estas alturas ya solo está a mi alcance la tercera opción que es la más sencilla, así que he escrito una rutina en R que la implementa tomando los siguientes parámetros de entrada:

  • Rango de frecuencias en el que codificar la información (entre 0,5kHz y 20kHz en el ejercicio)
  • Número total de frecuencias (100 frecuencias). Se plantea la posibilidad de que sigan un equiespaciado lineal o logarítmico (concentrará la información en las bajas frecuencias)
  • Duración del clip de audio a generar (30s)
  • Frecuencia de muestreo de dicho clip de audio (48kHz). Para evitar aliasing debe ser superior al doble de la frecuencia máxima usada

La matriz que contiene las señales sinusoidales de distintas frecuencias tendrá tantas filas como frecuencias hayamos parametrizado, y tantas columnas como se requieran para abarcar la duración solicitada para la frecuencia de muestreo. Esta matriz adquiere el siguiente aspecto (se muestra el primer ms de las 10 frecuencias más bajas):


Esta batería de sinusoides se modula en amplitud multiplicándola elemento a elemento por una versión en escala de grises de la imagen a codificar, previamente reescalada al tamaño de la matriz. El remuestreo de la imagen a un tamaño de mayor longitud al de partida asegura la progresividad de los valores, haciendo innecesario enventanar la modulación.

El clip de audio generado puede bajarse de aquí. El espectrograma muestra claras bandas correspondientes a las frecuencias discretas usadas. El resultado probablemente se podría suavizar añadiendo cierto jitter en las frecuencias base para ensanchar su espectro:


La imagen original junto con su réplica oculta en el espectrograma se muestran a continuación (hacer clic para ver en su tamaño original):


Creamos una animación que reproduce el audio al mismo tiempo que muestra el espectrograma, indicando el punto exacto que se está escuchando. Del rango disponible de 24kHz (mitad de la frecuencia de muestreo de 48kHz), puede verse que solo usamos desde 0,5kHz a 20kHz (hacer clic para ver el vídeo):


~~~

Con herramientas externas a R podemos ver que no hay trampa ni cartón y verdaderamente el audio esconde nuestras imágenes. Por ejemplo mostrando la forma de onda y el espectrograma con Audacity (hacer clic para ver a tamaño original):


O directamente reproduciendo el audio y analizando su espectro con Spectroid en el móvil (clic para tamaño original):


~~~

Ahora en lugar de crear un audio sintético desde cero, tomamos un audio real y aprovechamos la parte prácticamente inaudible de su espectro (17kHz-23kHz) para codificar en ella un texto que acompañe a la banda sonora.

Para el ejemplo he tomado el inicio de 'Star Wars' pero bien podría hacerse con la letra de cualquier canción por ejemplo. El archivo de sonido puede bajarse de aquí. El siguiente vídeo reproduce el audio mostrando su espectrograma que es donde puede leerse el texto (hacer clic para ver el vídeo):



Este concepto de aprovechar a posteriori una capacidad preexistente infrautilizada para hacer "otras cosas" con ella, es en lo que se han venido basando varios sistemas comerciales como el Teletexto (usa las líneas no visibles de la señal de TV para codificar páginas informativas), la mensajería SMS (usa la capacidad libre en la red de señalización móvil para transportar mensajes de texto entre usuarios) o las conexiones a Internet por ADSL y PLC (usan respectivamente la red telefónica de cobre o la red eléctrica del hogar, el primero como acceso y el segundo como red local).

~~~

Repositorio con el código R y archivos de audio e imagen: GitHub.


No hay comentarios:

Publicar un comentario

Por claridad del blog, por favor trata de utilizar una sintaxis lo más correcta posible y no abusar del uso de emoticonos, mayúsculas y similares.