ELO-330: Programación de Sistemas
Tarea 2: Procesando audio usando código libre

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 corregir este problema, se debe reducir el nivel de la señal a grabar, bajando su volumen, o reducir la sensibilidad de la entrada grabadora, 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 saturación.

 Cuando a saturación es leve, es posible un buen nivel de restauración través de interpolación. Para esto primero se debe atenual la señal saturada y luego reemplazar los puntos saturados por puntos interpolados en esa zona. En esta tarea se experimentará con interpolación polinomial. 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 fecuencia 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.

Offset permite especificar el tiempo en [ms] desde el inicio del archivo a mostrar en los gráficos generados por la aplicación.

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 E se calcula usando:
   E = Suma de i=0 a i=N de (Si - si)2. donde Si es la señal original, si es la señal corregida, N es el número de muestras del archivo de audio. Para uniformar el indicador de error, csa aplica una atenuación de igual valor que la ganancia. Así las muestras no saturadas logran aproximar bien a las muestras de la señal original.   
   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 interpolación: Previo a la interpolación atenúe la señal saturada en el mismo factor usada para amplificarla. Así si bien hay varias técnicas para corregir este tipo de distorsión cuando ésta es leve, en esta tarea se pide usar solo interpolación. Para ello su grupo debe reemplazar los puntos saturados por los resultantes de evaluar un polinomio de orden 4 que ajuste de mejor forma al menos dos puntos previos a aquellos saturados y dos puntos posteriores a aquellos saturados (los extremos de cada lado de la zona saturada pueden ser considerados). En lo posible considerar más puntos de cada lado en la medida que la pendiente de la señal no cambie de signo. Insito que el detalle fino no es tan relevante para esta tarea.  La tarea de obtener el polinomio de 4° orden que ajuste los puntos seleccionados  será encargada a octave. Para ello revise la función p = polyfit (x, y, n). La evaluación del polimonio resultante puede ser hecha usando al función  y = polyval (p, x). 
* 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 opió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.