ELO-330: Programación de Sistemas
Tarea 2: Reparación de audio distorsionado

Objetivos: En esta tarea usted aplicará: creación de procesos, manejo de señales, comunicación entre procesos usando pipes e integración de servicios provistos por otras aplicaciones. En este caso se solicitará servicios de GNU octave y aplay (Player for ALSA sound-card driver, Linux).

Introducción

En grabaciones de audio se produce saturación de la señal cuando ésta supera el valor máximo posible para cada muestra de audio grabada. Para evitar este problema, se debe reducir el nivel de la señal a grabar -bajando su volumen- o reducir la sensibilidad de la entrada de grabación -bajando la sensibilidad del "micrófono". Cuando la grabación queda recortada y no podemos repetir la grabación, se introduce distorsión como se aprecia en la Figura 1 (señal superior altamente saturada).


Figura 1: Señal inferior: original; señal superior: misma señal con alto grado de distorsión (audio saturado).

 Cuando a saturación es leve, es posible un buen nivel de restauración través de interpolación. Para esto primero se debe atenuar la señal saturada y luego reemplazar los puntos saturados por puntos interpolados en esa zona. Ésta fue la estrategia usada el año 2014. Este año su grupo debe utilizar otra estrategia. Cuando la señal es recortada se generan componentes de alta frecuencia. Se trabajará con señal de audio codificada en PCM, little endian, con signo y 16 bits. En lugar de atenuar la señal, usted puede representar cada muestra en 32 bits. Se pide usar la siguiente heurística: filtrar la señal con filtro pasa bajos, luego reemplazar  la sección recortada de la señal por la porción obtenida luego de filtrar. Así se obtiene la misma señal original, excepto los intervalos donde la señal estaba recortada donde éstos son reemplazados por los segmentos de la señal filtrada. Para filtrar la señal, se pide tomar la FFT (Fast Fourier Transform), extraer las componentes de alta frecuencia y volver al plano del tiempo tomando la FFT inversa. Recordar que el foco es experimentar con los mecanismos útiles en la programación de sistemas, no llegar a una solución óptima para el problema.

Nombre: csa : corrector de saturación de audio.

Sintaxis: csa   <archivo_de_audio_original>  <ganancia> <offset> [p]

Como archivo de audio original usa uno con muestras de audio mono canal en formato PCM, little endian, con signo y de 16 bits. La frecuencia de muestreo debe ser de 8KHz.  Puede usar este archivo de ejemplo.

La ganancia es un número real mayor que 1 usado para simular saturación en el proceso de grabado. Es decir, la saturación será generada artificialmente amplificando la señal y recortándola para valores fuera del rango [- 2^15,2^15).

Offset permite especificar el tiempo en [ms] desde el inicio del archivo a mostrar en los gráficos generados su programa.

Si el parámetro p es ingresado, csa reproduce el archivo de audio original completo, luego la versión saturada y finalmente la corregida.

Descripción
   csa muestra tres gráficos de 40 milisegundos desde el tiempo especificado por offset respecto del inicio del archivo: el primero muestra el segmento de señal de audio original, el segundo muestra el segmento de la señal saturada, y el tercero el segmento de la señal corregida.  Si bien los gráficos muestran solo 40 milisegundos de la señal, el procesamiento se hace sobre toda la señal.
   Luego de mostrar los tres gráficos, csa muestra un índice de error para la corrección hecha. El índice de error se calcula usando:

   Donde Si es la señal original, si es la señal corregida, N es el número de muestras del archivo de audio.  
   csa termina cuando el usuario presiona cualquier techa.

Evaluación de la Tarea y qué entregar: revisar las instrucciones para entregar y evaluar su tarea.

Recomendaciones
* Revise uso de octave y ejemplo para generar gráficos.
* Sobre FFT en octave.
* Sobre reproducción de audio en Linux: Su programa se apoyará en la aplicación aplay para reproducir las muestras de audio. Por ejemplo, para reproducir el archivo de ejemplo, usted puede ejecutar:
$aplay --format=S16_LE -t raw SaludoAudacity.raw
  Naturalmente su aplicación no será probada en aragorn con la opción p.
* Más ayuda puede ser incluida en la medida que surjan vuestras preguntas.
* Haga su tarea de a poco y con tiempo. Con gusto atenderé todas sus preguntas en especial en clases y horas de atención.