Está en la página 1de 11

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

FILTROS DE AUDIO EN MATLAB


Un filtro digital es un sistema que, dependiendo de las variaciones de las seales de entrada en
el tiempo y amplitud, se realiza un procesamiento matemtico sobre dicha seal;
generalmente mediante el uso de la Transformada rpida de Fourier; obtenindose en la salida
el resultado del procesamiento matemtico o la seal de salida.
Los filtros digitales tienen como entrada una seal analgica o digital y en su salida tienen otra
seal analgica o digital, pudiendo haber cambiado en amplitud, frecuencia o fase
dependiendo de las caractersticas del filtro digital.
El filtrado digital es parte del procesado de seal digital. Se le da la denominacin de digital
ms por su funcionamiento interno que por su dependencia del tipo de seal a filtrar, as
podramos llamar filtro digital tanto a un filtro que realiza el procesado de seales digitales
como a otro que lo haga de seales analgicas.
Comnmente se usa para atenuar o amplificar algunas frecuencias, por ejemplo se puede
implementar un sistema para controlar los tonos graves y agudos del audio del estreo del
auto.
La gran ventaja de los filtros digitales sobre los analgicos es que presentan una gran
estabilidad de funcionamiento en el tiempo.
El filtrado digital consiste en la realizacin interna de un procesado de datos de entrada.
En general el proceso de filtrado consiste en el muestreo digital de la seal de entrada, el
procesamiento considerando el valor actual de entrada y considerando las entradas anteriores.
El ltimo paso es la reconstruccin de la seal de salida.
En general la mecnica del procesamiento es:
1. Tomar las muestras actuales y algunas muestras anteriores (que previamente haban sido
almacenadas) para multiplicadas por unos coeficientes definidos.
2. Tambin se podra tomar valores de la salida en instantes pasados y multiplicarlos por
otros coeficientes.
3. Finalmente todos los resultados de todas estas multiplicaciones son sumados, dando una
salida para el instante actual.
El procesamiento interno y la entrada del filtro sern digitales, por lo que puede ser necesario
una conversin analgica-digital o digital-analgica para uso de filtros digitales con seales
analgicas.
Un tema muy importante es considerar las limitaciones del filtro de entrada debido a Teorema
de muestreo de Nyquist-Shannon que en pocas palabras; si quiero procesar hasta una
frecuencia de 10KHz, debo muestrear a por lo menos 20 KHz.
Los filtros digitales se usan frecuentemente para tratamiento digital de la imagen o para
tratamiento del sonido digital. [1]

%% Procesamiento de una seal de audio usando MATLAB


%% Crear seal de audio

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 1

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

% Frecuencia fundamental
f0=1e3; % 1KHz
% Amplitud
a=4; % V=4
% Frecuencia de muestreo
fs=44.1e3; % Frecuencia de una seal de audio
% Tiempo de duracin en segundos
T=1.5;
L = round(T*fs); % Nmero de muestras
% Frecuencia normalizada
fn=f0/fs;
y = a*sin(2*pi*fn*(0:L-1))+0.5*a*sin(2*pi*2*fn*(0:L-1));
% Graficar la seal original
subplot(411)
plot((0:L-1)/fs,y)
title('SEAL ORIGINAL')% Ttulo
xlabel('Tiempo (s)')
% Etiqueta del eje X
ylabel('Amplitud (V)')
% Etiqueta del eje Y
xlim([0 10/1000])
% Lmite de la seal
%% Grabar y reproducir la seal de audio
%wavwrite(y,fs,'audio')
% wavplay(y,fs)
%% FFT de la seal
subplot(412)
% Llamado a la funcin que calcula la FFT
fft_signal(y,fs);title('ESPECTRO DE LA SEAL ORIGINAL')
xlim([0 2500])
%% Filtrado de la seal
% Frecuencia normalizada
fNorm = 1500 / (fs/2);
% Clculo de los coeficientes del filtro (filtro pasa bajas)
[b,a] = butter(10, fNorm, 'low');
% Filtrado de la seal
y_Low = filtfilt(b, a, y);
% Graficacin de la seal en el tiempo
subplot(413)
plot((0:L-1)/fs,y_Low)
title('SEAL FILTRADA')
xlabel('Tiempo (s)')
ylabel('Amplitud (V)')
xlim([0 10/1000])
% Graficacin de la seal en frecuencia
subplot(414)
% Llamado a la funcin que calcula la FFT
fft_signal(y_Low,fs);title('ESPECTRO DE LA SEAL FILTRADA')
xlim([0 2500])
%% Grficas del filtro
% Respuesta en frecuencia del filtro
[H,w]=freqz(b,a,512,1);
figure(2)
%Trazado de la respuesta en Magnitud
subplot(221)
plot(w,20*log10(abs(H)));
grid on;
title ('Filtro pasa-altos, Respuesta en magnitud');
xlabel('frecuencia');
ylabel('H(f) db')
xlim([0 0.4])
% Respuesta en fase
subplot(222)

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 2

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

plot(w,angle(H));
grid on;
title ('Filtro pasa-altos, Respuesta en fase');
xlabel('frecuencia')
ylabel('ngulo de H rad')
xlim([0 0.4])
%Respuesta al impulso
subplot(223)
[y_eje,t]= impz(b,a,60);
stem(t,y_eje);
title ('Filtro pasa-altos, Respuesta al impulso');
%Ploteo de los polos y ceros
z= roots(b); % Ceros
p = roots(a); % Polos
subplot(224)
zplane(z,p)
title('Polos y ceros')
legend('Ceros','Polos')
%% Reproduccin de audio de entrada y salida
pause(2)
disp('Audio de entrada')
wavplay(0.5*y,fs)
disp('Audio de salida (seal filtrada)')
wavplay(0.5*y_Low,fs)

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 3

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

%% Procesamiento de una seal de audio usando MATLAB


%% Seleccin del tipo de filtrado
% 1 -> Pasa bajo
% 2 -> Pasa alto
% 3 -> Pasa banda
tipo=3
%% Crear seal de audio
% Frecuencia fundamental
f0=1e3; % 1KHz
% Amplitud
a=2; % V=4
% Frecuencia de muestreo
fs=44.1e3; % Frecuencia de una seal de audio CD
% Tiempo de duracin en segundos
T=2;
% Vector de tiempo
t=linspace(0,T,T*fs);
% Creacin de la seal
% Primer seal (tono 1)
s1=a*sin(2*pi*f0*t);
% Segunda seal (tono 2)
s2=0.75*a*sin(2*pi*(1.5*f0)*t);
% Tercera seal (tono 3)
s3=0.5*a*sin(2*pi*(2*f0)*t);
% Seal compuesta (suma de dos tonos)
y = s1 + s2 + s3;
% Graficar la seal original
subplot(411)
plot(t,y)
title('SEAL ORIGINAL')% Ttulo
xlabel('Tiempo (s)')
% Etiqueta del eje X
ylabel('Amplitud (V)')
% Etiqueta del eje Y
xlim([0 20/1000])
% Lmite de la seal
%% Grabar y reproducir la seal de audio
% wavwrite(0.1*y,fs,'audio')
% wavplay(0.1*y,fs)
%% FFT de la seal
subplot(412)
% Llamado a la funcin que calcula la FFT
fft_signal(y,fs);title('ESPECTRO DE LA SEAL ORIGINAL')
xlim([0 2500])
%% Filtrado de la seal
switch tipo
case 1
% Clculo de los coeficientes del filtro (filtro pasa bajas)
% Este filtrado deja solo la seal de 1000 Hz
% Frecuencia normalizada
titutlo='FILTRO PASA BAJAS';
fNorm = 1200 / (fs/2);
[b,a] = butter(10, fNorm, 'low');
case 2
%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Clculo de los coeficientes del filtro (filtro pasa bajas)
% Este filtrado deja solo la seal de 2000 Hz
% Frecuencia normalizada
titutlo='FILTRO PASA ALTAS';
fNorm = 1900 / (fs/2);

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 4

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

[b,a] = butter(10, fNorm, 'high');


otherwise
%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Clculo de los coeficientes del filtro (filtro pasa banda)
% Este filtrado deja solo la seal de 1500 Hz
% Frecuencias normalizadas
titutlo='FILTRO PASA BANDA';
fNorm_1 = 1000 / (fs/2); % 1250
fNorm_2 = 2000 / (fs/2); % 1700
[b_alta,a_alta] = butter(10, fNorm_1, 'high');
[b,a] = butter(10, fNorm_2, 'low');
y_alta=filtfilt(b_alta, a_alta, y);
y=y_alta;
%
Wp = [1490 1510]/(fs/2); Ws = [1410 1560]/(fs/2);
%
Rp = 3; Rs = 40;
%
[n,Wn] = buttord(Wp,Ws,Rp,Rs)
%
[b,a] = butter(n,Wn);
%
y_Low = filtfilt(b,a,y);
%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - end
% Filtrado de la seal
y_Low = filtfilt(b, a, y);
% Graficacin de la seal en el tiempo
subplot(413)
plot(t,y_Low)
title('SEAL FILTRADA')
xlabel('Tiempo (s)')
ylabel('Amplitud (V)')
xlim([0 20/1000])
% Graficacin de la seal en frecuencia
subplot(414)
% Llamado a la funcin que calcula la FFT
fft_signal(y_Low,fs);title('ESPECTRO DE LA SEAL FILTRADA')
xlim([0 2500])
%% Grficas del filtro
% Respuesta en frecuencia del filtro
[H,w]=freqz(b,a,512,fs);
figure(2)
%Trazado de la respuesta en Magnitud
subplot(221)
plot(w,20*log10(abs(H)));
grid on;
title ([titutlo, 'Respuesta en magnitud']);
xlabel('Frecuencia (Hz)');
ylabel('H(f) db')
% xlim([0 0.4])
% Respuesta en fase
subplot(222)
plot(w,angle(H));
grid on;
title ([titutlo,'Respuesta en fase']);
xlabel('Frecuencia (Hz)')
ylabel('ngulo de H rad')
% xlim([0 0.4])
%Respuesta al impulso
subplot(223)
[y_eje,tt]= impz(b,a,60);
stem(tt,y_eje);
title ([titutlo,'Respuesta al impulso']);

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 5

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

%Ploteo de los polos y ceros


z= roots(b); % Ceros
p = roots(a); % Polos
subplot(224)
zplane(z,p)
title('Polos y ceros')
legend('Ceros','Polos')
%% Reproduccin de audio de entrada y salida
pause(2)
disp('Audio de entrada')
% Se multiplica por 0.1 para atenuar la salida del tono por la bocina
wavplay(0.1*y,fs)
disp('Audio de salida (seal filtrada)')
% Se multiplica por 0.1 para atenuar la salida del tono por la bocina
wavplay(0.1*y_Low,fs)

%% Procesamiento de una seal de audio usando MATLAB


%% Seleccin del tipo de filtrado
% 1 -> Pasa bajo

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 6

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

% 2 -> Pasa alto


% 3 -> Pasa banda
tipo=1;
%% Crear seal de audio
% Frecuencia fundamental
f0=8e3; % 8KHz
% Amplitud
a=3; % V=4
% Frecuencia de muestreo
fs=44.1e3; % Frecuencia de una seal de audio CD
% Tiempo de duracin en segundos
T=1.5;
% Vector de tiempo
t=linspace(0,T,T*fs);
% Creacin de la seal
% Primer seal (tono 1)
s1=a*sin(2*pi*f0*t);
% Segunda seal (tono 2)
s2=0.75*a*sin(2*pi*(1.5*f0)*t);
% Tercera seal (tono 3)
s3=0.5*a*sin(2*pi*(2*f0)*t);
% Seal compuesta (suma de dos tonos)
y = s1 + s2 + s3;
% Graficar la seal original
subplot(411)
plot(t,y)
title('SEAL ORIGINAL')% Ttulo
xlabel('Tiempo (s)')
% Etiqueta del eje X
ylabel('Amplitud (V)')
% Etiqueta del eje Y
xlim([0 20/f0])
% Lmite de la seal
%% Grabar y reproducir la seal de audio
% wavwrite(0.1*y,fs,'audio')
% wavplay(0.1*y,fs)
%% FFT de la seal
subplot(412)
% Llamado a la funcin que calcula la FFT
fft_signal(y,fs);title('ESPECTRO DE LA SEAL ORIGINAL')
xlim([0 f0*3])
%% Filtrado de la seal
switch tipo
case 1
% Clculo de los coeficientes del filtro (filtro pasa bajas)
% Este filtrado deja solo la seal de 1000 Hz
% Frecuencia normalizada
titutlo='FILTRO PASA BAJAS';
fNorm = 8.5e3 / (fs/2);
[b,a] = butter(10, fNorm, 'low');
case 2
%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Clculo de los coeficientes del filtro (filtro pasa bajas)
% Este filtrado deja solo la seal de 2000 Hz
% Frecuencia normalizada
titutlo='FILTRO PASA ALTAS';
fNorm = 15e3 / (fs/2);
[b,a] = butter(10, fNorm, 'high');
otherwise
%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Clculo de los coeficientes del filtro (filtro pasa banda)
% Este filtrado deja solo la seal de 1500 Hz
% Frecuencias normalizadas

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 7

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

titutlo='FILTRO PASA BANDA';


Wp = [11.5e3 12.5e3]/(fs/2); Ws = [11e3 13e3]/(fs/2);
Rp = 3; Rs = 40;
[n,Wn] = buttord(Wp,Ws,Rp,Rs)
[b,a] = butter(n,Wn);
%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - end
% Filtrado de la seal
y_Low = filtfilt(b, a, y);
% Graficacin de la seal en el tiempo
subplot(413)
plot(t,y_Low)
title('SEAL FILTRADA')
xlabel('Tiempo (s)')
ylabel('Amplitud (V)')
xlim([0 20/f0])
% Graficacin de la seal en frecuencia
subplot(414)
% Llamado a la funcin que calcula la FFT
fft_signal(y_Low,fs);title('ESPECTRO DE LA SEAL FILTRADA')
xlim([0 3*f0])
%% Grficas del filtro
% Respuesta en frecuencia del filtro
[H,w]=freqz(b,a,512,fs);
figure(2)
%Trazado de la respuesta en Magnitud
subplot(221)
plot(w,20*log10(abs(H)));
grid on;
title ([titutlo, 'Respuesta en magnitud']);
xlabel('Frecuencia (Hz)');
ylabel('H(f) db')
% xlim([0 0.4])
% Respuesta en fase
subplot(222)
plot(w,angle(H));
grid on;
title ([titutlo,'Respuesta en fase']);
xlabel('Frecuencia (Hz)')
ylabel('ngulo de H rad')
% xlim([0 0.4])
%Respuesta al impulso
subplot(223)
[y_eje,tt]= impz(b,a,60);
stem(tt,y_eje);
title ([titutlo,'Respuesta al impulso']);
%Ploteo de los polos y ceros
z= roots(b); % Ceros
p = roots(a); % Polos
subplot(224)
zplane(z,p)
title('Polos y ceros')
legend('Ceros','Polos')
%% Reproduccin de audio de entrada y salida
pause(2)
disp('Audio de entrada')
% Se multiplica por 0.1 para atenuar la salida del tono por la bocina
wavplay(0.1*y,fs)
disp('Audio de salida (seal filtrada)')

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 8

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

% Se multiplica por 0.1 para atenuar la salida del tono por la bocina
wavplay(0.1*y_Low,fs)

%% Procesamiento de una seal de audio usando MATLAB


%% Seleccin del tipo de filtrado
% 1 -> Pasa bajo
% 2 -> Pasa alto
% 3 -> Pasa banda
tipo=3;
%% Leer la seal de audio
[y,fs]=wavread('Yabu_mono');
% y -> muestras de la seal
% fs-> frecuencia de muestreo
% Graficar la seal original
subplot(411)
T=length(y)/fs;
t=linspace(0,T,T*fs);
plot(t,y)
title('SEAL ORIGINAL')% Ttulo
xlabel('Tiempo (s)')
% Etiqueta del eje X
ylabel('Amplitud (V)')
% Etiqueta del eje Y
% xlim([0 20/])
% Lmite de la seal
%% Reproducir la seal de audio
% wavplay(0.1*y,fs)
%% FFT de la seal
subplot(412)
% Llamado a la funcin que calcula la FFT
fft_signal(y,fs);title('ESPECTRO DE LA SEAL ORIGINAL')
xlim([0 4e3])
%% Filtrado de la seal
switch tipo
case 1
% Clculo de los coeficientes del filtro (filtro pasa bajas)
% Este filtrado deja solo la seal por debajo de 500 Hz
titulo='FILTRO PASA BAJAS';
% Frecuencia normalizada
fNorm = 1000 / (fs/2);
[b,a] = butter(10, fNorm, 'low');
case 2
%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Clculo de los coeficientes del filtro (filtro pasa altas)
% Este filtrado deja solo la seal por encima de 500 Hz
titulo='FILTRO PASA ALTAS';
% Frecuencia normalizada
fNorm = 1000 / (fs/2);
[b,a] = butter(10, fNorm, 'high');
otherwise
%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Clculo de los coeficientes del filtro (filtro pasa banda)
% Este filtrado deja solo la seal de 2KHz a 3KHz
% Frecuencias normalizadas
titulo='FILTRO PASA BANDA';
Wp = [2e3 3e3]/(fs/2); Ws = [1.5e3 3.5e3]/(fs/2);
Rp = 3; Rs = 40; % Rizado de la banda de paso y de parada (s)
[n,Wn] = buttord(Wp,Ws,Rp,Rs);% Orden del filtro y frecuencia de corte ptima
[b,a] = butter(n,Wn);
% Coeficientes del filtro

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 9

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

%- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - end
% Filtrado de la seal
y_Low = filtfilt(b, a, y);
% Graficacin de la seal en el tiempo
subplot(413)
plot(t,y_Low)
title('SEAL FILTRADA')
xlabel('Tiempo (s)')
ylabel('Amplitud (V)')
% xlim([0 20/f0])
% Graficacin de la seal en frecuencia
subplot(414)
% Llamado a la funcin que calcula la FFT
fft_signal(y_Low,fs);title('ESPECTRO DE LA SEAL FILTRADA')
xlim([0 4e3])
%% Grficas del filtro
% Respuesta en frecuencia del filtro
[H,w]=freqz(b,a,512,fs);
figure(2)
%Trazado de la respuesta en Magnitud
subplot(221)
plot(w,20*log10(abs(H)));
grid on;
title ([titulo, ' Respuesta en magnitud']);
xlabel('Frecuencia (Hz)');
ylabel('H(f) db')
xlim([0 5e3])
% Respuesta en fase
subplot(222)
plot(w,angle(H));
grid on;
title ([titulo,' Respuesta en fase']);
xlabel('Frecuencia (Hz)')
ylabel('ngulo de H rad')
xlim([0 5e3])
%Respuesta al impulso
subplot(223)
[y_eje,tt]= impz(b,a,60);
stem(tt,y_eje);
title ([titulo,' Respuesta al impulso']);
xlabel('n')
ylabel('h[n]')
%Ploteo de los polos y ceros
z= roots(b); % Ceros
p = roots(a); % Polos
subplot(224)
zplane(z,p)
title('Polos y ceros')
legend('Ceros','Polos')
%% Reproduccin de audio de entrada y salida
pause(2)
disp('Audio de entrada')
% Se multiplica por 0.2 para atenuar la salida del tono por la bocina
% wavplay(0.2*y,fs)
disp('Audio de salida (seal filtrada)')
% Se multiplica por 0.2 para atenuar la salida del tono por la bocina
% wavplay(0.2*y_Low,fs)

Dr. Arroyo Daz Salvador Antonio

FCE BUAP

Pgina 10

Benemrita Universidad Autnoma de Puebla

I.P.D.S.

Dr. Arroyo Daz Salvador Antonio

Pgina 11

FCE BUAP