sábado, 25 de abril de 2015

Filtro digital de audio butterworth utilizando MATLAB

MATLAB dispone de funciones que facilitan el diseño de filtros, tanto analógicos como digitales. Lo primero que necesitamos saber a la hora de diseñar un filtro Butterworth es conocer el orden, para ello disponemos de la función [N,Wn]= buttord(Wp,Ws,Rp,Rs) donde:
  • Wp es la frecuencia de corte normalizada 
  • Ws es la frecuencia de atenuación normalizada
  • Rp la atenuación para la frecuencia de corte en dB
  • Rs la atenuación para la banda rechazada en dB
Función de transferencia para un filtro pasa bajas

Wp y Ws deben ser entre (0 y 1) siendo 1 la frecuencia de Nyquist( esto nos dice que hay que normalizar las frecuencias contra la frecuencia de Nyquist). la salida N es el orden del filtro y Wn la frecuencia de 3dB. Si queremos encontrar el orden del filtro pero analógico es tan sencillo como modificar  la función [N,Wn]= buttord(Wp,Ws,Rp,Rs,'s') aquí las frecuencias de Wp y Ws pueden toma cualquier valor en radianes. 


Lo siguiente es calcular los coeficientes del filtro, esto lo haremos utilizando la función [B,A] = butter(N,Wn) B y A son los coeficientes del numerador y denominador respectivamente. Y como es lógico N es el orden del filtro y Wn la frecuencia de corte, calculadas previamente. Además es necesario especificar si queremos un filtro pasa altas o pasa bajas, rechaza banda o, pasa bandas. Esto lo haremos de la siguiente manera:


  • Filtro pasa bajas:
[B,A] = butter(N,Wn,'low')
  • Filtro pasa altas:
[B,A] = butter(N,Wn,'high')
  • Filtro pasa bandas:
[B,A] = butter(N,[W1 W2])
Wn en este caso es un vector que especifica las frecuencias de pasabanda.
  • Filtro rechaza banda:
[B,A] = butter(N,[W1 W2],'stop')

Añadiendo a los comandos anteriores la opción 's', los vectores B y A son los coeficientes del filtro analógico correspondiente. Sigue siendo valido lo que se ha mencionado con el handicap que Wn no está limitada a un valor dentro del rango (0,1).

Veamos un ejemplo con un audio DEMO de MATLAB.

load handel.mat
y = y';
Wp = 1000/Fs; %%Frecuencia de corte normalizada
Ws = 2000/Fs; %%Frecuencia de atenuación normalizada
[n,Wn] = buttord(Wp,Ws,3,60); %%orden de butterworth
[b,a] = butter(n,Wn,'low');   %%coeficientes de butterworth 
yh = filter(b, a, y);       %%Filtro de la señal
L=length(y);
NFFT = 2^nextpow2(L); % Siguiente potencia de 2 del vector y
f = Fs/2*linspace(0,1,NFFT/2+1);

figure(1)
yf=fft(y,NFFT)/L;
plot(f,2*abs(yf(1:NFFT/2+1)))
title('Espectro de la señal')
xlabel('Frecuencia [Hz]')
grid on

figure(2)
yf2=fft(yh,NFFT)/L;
plot(f,2*abs(yf2(1:NFFT/2+1)))
title('Espectro de la señal filtrada')
xlabel('Frecuencia [Hz]')
grid on

figure(3)
[H,W] = freqz(b,a,1000);
plot(Fs.*W./pi,abs(H))
title('Respuesta en frecuencia del filtro')
xlabel('Frecuencia [Hz]')
grid on
sound(yh)

sound (y)

La función [H,W] = freqz(b,a,N) retorna el vector H de N-puntos de la respuesta en frecuencia y el vector de frecuencia de N-puntos W en radianes/muestra del filtro.
Observen unas gráficas del filtro que acabamos de realizar





Si queremos cargar un audio propio, primero debemos guardarlo en la carpeta matlab de mis documentos y utilizaremos la instrucción [y Fs]= wavread('nombredelaudio.wav')

Estos filtros son muy útiles para eliminar componentes de ruido de alta y baja frecuencia que se introducen por interferencia o mala calidad de equipos.

No hay comentarios:

Publicar un comentario

¿Dudas?