Ejemplo de un filtro Digital FIR en Octave

En este blog vamos a ver un ejemplo de como crear cargar un archivo wav en Octave y aplicarle un filtro pasabajos FIR.

Como no tengo licencias de Matlab he instalado Octave, el cual corro dentro de un Centos dentro de Vmware, pero este ejemplo deberia funcionar sin importar el sistema operativo que se use.

1) Busquemos un audio (archivo wav) el cual cargar como un vector en Octave, existe una pagina interesante con un banco interesante de archivos wav gratuitos, los cuales podemos usar como ejemplo, la URL es la siguiente:

https://freesound.org/

Una vez ahi adentro creamos un usuario y ya podemos descargar de manera legal archivos de audio wav de corta duracion que pueden ser utiles para estos ejercicio.

2) Para escuchar, graficar, procesar nuestro archivo de audio, me gusta usar WavePad, el cual es un software gratuido, la URL para descargar el Software es:

http://www.nch.com.au/wavepad/es/index.html

Abramos en WavePad nuestro archivo recien descargodo de freesound.org:



Este es un riff de guitarra electrica estilo los intros de Metallica.

Normalmente estos audios vienen en estereo, asi que cuando convirtamos el audio a un Vector de Octave, este vector va a ser una matriz con dos columnas (una por cada canal), asi que usando el mismo WavePad he grabado el mismo archivo pero en MONO (Editar --- Convertir Canales ---- Mono).

3) Bueno ya teniendo el audio listo, vamos a cargarlo en Octave (recuerden que uso un Centos, pero en windows debe ser paracido...), para esto vamos a dejar el archivo de audio en la carpeta por default del centos:



en mi caso es /home/vendetta

La funcion clave es "wavread", si escribimos "help wavread" obtenemos lo siguiente:

 -- Function File: [Y, FS, BPS] = wavread (FILENAME)

Y: Es el vector con las amplitudes de cada muestra.
FS: Es la frecuencia de muestro, recordemos que el archivo wav tiene esta informacion.
BPS: Son los Bits per Sample, asi que el comando que se ejecuta es el siguiente:

octave:3> [Y,FS,BPS]=wavread('sample1.wav');
octave:4>

Revisemos los resultados:

Aca podemos ver las amplitudes por muestra:

Y =

   0.00000
  .............
   0.00003
   0.00006
   0.00009
   0.00012
   0.00015
   0.00012
  -0.00003
  -0.00040
  -0.00089
  -0.00134
  -0.00171
  -0.00186
  -0.00186
  -0.00156
  -0.00098
  -0.00034

El sample fue hecho a 44.1 Khz
 octave:5> FS
FS =  44100

Ahora los bits por muestra:

octave:6> BPS
BPS =  16
Nota: seria interesante bajar a 8 bits para que suene como consola viaje de comienzos de los 90s....

4) Ahora grafiquemos la señal desde Octave, lo cual deberia generar un grafico similar a WavePad, para esto necesitamos definor los valores de los ejes X y Y:

octave:8> x=1:length(Y);
octave:9> plot(x,Y);









5) Ahora creemos el filtro FIR pasabajos, el filtro lo tomé de la siguiente pagina:

https://www.allaboutcircuits.com/technical-articles/design-of-fir-filters-design-octave-matlab/

Pero cambie un poco las frecuencias para que estuvieran en el rango de la guitarra:

f1 = 4000;
f2 = 7000;
delta_f = f2-f1;
Fs = 192000;
dB  = 40;
N = dB*Fs/(22*delta_f);

f =  [f1 ]/(Fs/2)
hc = fir1(round(N)-1, f,'low')

Nota: Es posible que se tenga que Instalar y cargar el paquete Signal dentro del Centos para correr la funcion fir1.

6) Para aplicar el filtro "hc" a nuestra señal Y, debemos hacer la convolucion de los dos vectores:

octave:26> ZZ=conv(Y,hc);

ZZ es el mismo audio pero luego de pasarlo por el filtro FIR pasa bajo.

7) Ahora generemos un archivo de audio con ZZ para poder escuchar como quedó el audio despues del filtrado, para eso usamos la funcion "wavwrite", si damos "help wavwrite":

 -- Function File: wavwrite (Y, FS, BPS, FILENAME)

Asi que el comando es:

octave:28> wavwrite(ZZ,44100,16,'sample1filtrado.wav');

Ahora si abra el archivo en wavpad y escuchelo!

8) Usando el mismo wavepad podemos ver el audio en frecuencia, aca abajo podemos ver la señal original respecto a la filtrada y se puede observar como las muestras en frecuencias altas se han eliminado:



Cosas interesantes ocurren si se cambia la frecuencia de muestro, o los bits por muestra, asi que no esta de mas experimentar.

saludos.

Comentarios

Entradas populares