ELO-330: Programación de Sistemas
Tarea 2: Reparración de audio afectado por pérdidas de paquetes

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

   La transmisión de audio paquetizado usando UDP genera pérdidas de paquetes debido a paquetes descartados por la red y descartados en receptor por llegada tardía. Varias técnicas se han estudiado para reparar la pérdia de tales paquetes [1], entre ellas están: sustitución por silencio, parte superior de Figura 1; sustitución por ruido, similar a la anterior pero poner ruido gausiano de fondo en lugar de ceros; repetición del paquete previo; y sustitución de forma de onda. Ver referencia [1] por más técncias si usted lo desea. La literatura indica que la reparación se mejora en el mismo orden en que estas técnicas son listadas aquí. En esta tarea exploraremos el resultado de reemplazar paquetes permidos por silencio y repetir el paquete previo.


Figura 1: Señal de archivo saludo. Superior: segmento de señal original; señal inferior: misma señal con segmentos de 20 [ms] perdidos, tasa de pérdida 20%.

 Cuando la señal es reempalzada por silencio o cuando se repite el paquete previo, se producen discontinuidades de la señal. En esta tarea usted escuchará el efecto de ambas técnicas y usando interpolación polinomial de matlab u octave mitigará en parte la distorsión generada por la discontinuidad al replicar un paquete.
 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: rpas : reparador de pérdidas en audio streaming.

Sintaxis: rpas   <archivo_de_audio_original>  <tasa_de_pérdida> <offset> <srand> [p]

El archivo de audio original contiene 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 tasa de pérdida es un número real entre 0 y 30% y corresponde al porcentaje de paquetes perdidos a simular en la reparación.

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

srand es un número entero usado para definir la semilla para el cálculo de los números aleatorios.

Si el parámetro p es ingresado, rpas reproduce el archivo de audio completo usando reparación con silencios, luego la versión reparada con repetición de paquetes y finalmente la original.

Descripción
   rpas muestra tres gráficos de 400 milisegundos desde el tiempo especificado por offset respecto del inicio del archivo: el primer gráfico muestra el segmento de señal de audio reparado con silencios, el segundo muestra el segmento de la señal reparada con repetición de paquetes y el tercero muestra el segmento de la señal original.  Si bien los gráficos muestran solo 400 milisegundos de la señal, el procesamiento se hace sobre toda la señal. Para reducir la distorsión de los extremos del paquete intertado reemplace las primeras 10 muestras de éste por la interpolación obtenida al tomar las últimas 5 muestras de señal de audio previas a la pérdida y las 5 muestras de audio posteriores a esas 16 muestras a reemplazar. Haga la mejora equivalente en el extremo con el paquete siguiente.
   Luego de mostrar los tres gráficos, rpas 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.
   rpas termina cuando el usuario presiona cualquier tecla.

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

Recomendaciones
* Para analizar el archivo de audio, este código puede ser de ayuda.
* Revise uso de octave y ejemplo para generar gráficos.
* Sobre interpolación: Su grupo debe reemplazar los primeros y últimos 10 puntos por los resultantes de evaluar un polinomio de orden 6 que ajuste de mejor forma los 10 puntos. Insito que el detalle fino no es tan relevante para esta tarea.  La tarea de obtener el polinomio de 6° 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.

Referencias
[1] Perkins, C.; Hodson, O.; Hardman, V., "A survey of packet loss recovery techniques for streaming audio", IEEE Network, 1998, Volume: 12, Issue: 5, Pages: 40 - 48.