ELO330 - Programación de Sistemas - Tarea 2
===========================================

Descripción
-----------

### Corrector de saturación de audio (csa)

Programa que permite amplificar (y/o saturar) un archivo de audio para luego intentar restaurarlo.

La restauración funciona atenuando la señal saturada a un nivel práctico para luego aplicar la Transformada Rápida de Fourier (FFT, por sus siglas en inglés), y con ello eliminar las componentes de alta frecuencia que son producidas por efecto de la saturación. Una vez eliminadas estas componentes, se transforma nuevamente la señal al dominio del tiempo con la Transformada Inversa de Fourier (IFFT). Adicionalmente se optó por eliminar componentes de muy baja frecuencia, sin comprometer aquellas que son características de la voz humana (85 a 255 Hz).

Los detalles podrán ser encontrados en el código donde se han comentado los aspectos importantes.

![Diagrama de flujo](./img/diagram.pdf)

Requisitos
----------

Este programa hace uso de GNU Octave y aplay (alsa-utils), los cuales pueden ser instalados de la siguiente manera:

#### Debian / Ubuntu
    $ sudo apt-get update
    $ sudo apt-get install octave alsa-utils

#### Red Hat / CentOS / Fedora
    $ sudo yum update
    $ sudo yum install octave alsa-utils

Compilación
-----------

En la carpeta raíz del proyecto, ejecutar:

    make clean
    make

Forma de uso
------------

    ./csa  <archivo_audio_original>  <ganancia>  <offset>  [p]

Al término de la ejecución se muestra un gráfico que muestra las formas de onda de las 3 muestras de audio, en un intervalo de 40 [ms] desde el tiempo indicado por el argumento `offset` medido en milisegundos.

Si el argumento `p` está presente, se intentará reproducir las 3 muestras de audio (original, amplificada/saturada y recuperada).

### Consideraciones:

- El archivo de audio debe estar en formato RAW (mono, 16 bits por muestra) y con una frecuencia de muestreo de 8 kHz.

- La ganancia debe ser estrictamente mayor a 1 (en la práctica, mayor o igual a 1.000001).

- El offset debiera mapear a una posición válida del archivo de audio. De todas formas, en caso contrario el programa intentará corregirlo a una posición valida.
