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.