.::FILTRADO DE AUDIO EN MATLAB::.

MATPIC.COM

MATLAB - FILTRADO DE AUDIO EN MATLAB

FILTRADO DE AUDIO EN MATLAB

 

 

Un filtro digital es un sistema que, dependiendo de las variaciones de las señales de entrada en el tiempo y amplitud, se realiza un procesamiento matemático sobre dicha señal; generalmente mediante el uso de la Transformada rápida de Fourier; obteniéndose en la salida el resultado del procesamiento matemático o la señal de salida.

Los filtros digitales tienen como entrada una señal analógica o digital y en su salida tienen otra señal analógica o digital, pudiendo haber cambiado en amplitud, frecuencia o fase dependiendo de las características del filtro digital.

El filtrado digital es parte del procesado de señal digital. Se le da la denominación de digital más por su funcionamiento interno que por su dependencia del tipo de señal a filtrar, así podríamos llamar filtro digital tanto a un filtro que realiza el procesado de señales digitales como a otro que lo haga de señales analógicas.

Comunmente 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 estéreo del auto.

La gran ventaja de los filtros digitales sobre los analógicos es que presentan una gran estabilidad de funcionamiento en el tiempo.

El filtrado digital consiste en la realización interna de un procesado de datos de entrada.

En general el proceso de filtrado consiste en el muestreo digital de la señal de entrada, el procesamiento considerando el valor actual de entrada y considerando las entradas anteriores. El último paso es la reconstrucción de la señal de salida.

En general la mecánica del procesamiento es:

1. Tomar las muestras actuales y algunas muestras anteriores (que previamente habían sido almacenadas) para multiplicadas por unos coeficientes definidos.

2. También se podría 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 serán digitales, por lo que puede ser necesario una conversión analógica-digital o digital-analógica para uso de filtros digitales con señales analógicas.

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]

Pulsa el botón descargar para bajar los programas:

desc

Advertencia: los scripts reproducen el audio. Mantener bajo el volumen del PC.

%% Procesamiento de una señal de audio usando MATLAB

%% Crear señal de audio

% Frecuencia fundamental

f0=1e3; % 1KHz

% Amplitud

a=4; % V=4

% Frecuencia de muestreo

fs=44.1e3; % Frecuencia de una señal de audio

% Tiempo de duración en segundos

T=1.5;

L = round(T*fs); % Número 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 señal original

subplot(411)

plot((0:L-1)/fs,y)

title('SEÑAL ORIGINAL')% Título

xlabel('Tiempo (s)')         % Etiqueta del eje X

ylabel('Amplitud (V)')      % Etiqueta del eje Y

xlim([0 10/1000])            % Límite de la señal

%% Grabar y reproducir la señal de audio

%wavwrite(y,fs,'audio')

% wavplay(y,fs)

%% FFT de la señal

subplot(412)

% Llamado a la función que calcula la FFT

fft_signal(y,fs);title('ESPECTRO DE LA SEÑAL ORIGINAL')

xlim([0 2500])

%% Filtrado de la señal

% Frecuencia normalizada

fNorm = 1500 / (fs/2);

% Cálculo de los coeficientes del filtro (filtro pasa bajas)

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

% Filtrado de la señal

y_Low = filtfilt(b, a, y);

% Graficación de la señal en el tiempo

subplot(413)

plot((0:L-1)/fs,y_Low)

title('SEÑAL FILTRADA')

xlabel('Tiempo (s)')

ylabel('Amplitud (V)')

xlim([0 10/1000])

% Graficación de la señal en frecuencia

subplot(414)

% Llamado a la función que calcula la FFT

fft_signal(y_Low,fs);title('ESPECTRO DE LA SEÑAL FILTRADA')

xlim([0 2500])

%% Gráficas 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)

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')

%% Reproducción de audio de entrada y salida

pause(2)

disp('Audio de entrada')

wavplay(0.5*y,fs)

disp('Audio de salida (señal filtrada)')

wavplay(0.5*y_Low,fs)

 

 

 

%% Procesamiento de una señal de audio usando MATLAB

%% Selección del tipo de filtrado

% 1 -> Pasa bajo

% 2 -> Pasa alto

% 3 -> Pasa banda

tipo=3

%% Crear señal de audio

% Frecuencia fundamental

f0=1e3; % 1KHz

% Amplitud

a=2; % V=4

% Frecuencia de muestreo

fs=44.1e3; % Frecuencia de una señal de audio CD

% Tiempo de duración en segundos

T=2;

% Vector de tiempo

t=linspace(0,T,T*fs);

% Creación de la señal

% Primer señal (tono 1)

s1=a*sin(2*pi*f0*t);

% Segunda señal (tono 2)

s2=0.75*a*sin(2*pi*(1.5*f0)*t);

% Tercera señal (tono 3)

s3=0.5*a*sin(2*pi*(2*f0)*t);

% Señal compuesta (suma de dos tonos)

y = s1 + s2 + s3;

% Graficar la señal original

subplot(411)

plot(t,y)

title('SEÑAL ORIGINAL')% Título

xlabel('Tiempo (s)')         % Etiqueta del eje X

ylabel('Amplitud (V)')      % Etiqueta del eje Y

xlim([0 20/1000])            % Límite de la señal

%% Grabar y reproducir la señal de audio

% wavwrite(0.1*y,fs,'audio')

%  wavplay(0.1*y,fs)

%% FFT de la señal

subplot(412)

% Llamado a la función que calcula la FFT

fft_signal(y,fs);title('ESPECTRO DE LA SEÑAL ORIGINAL')

xlim([0 2500])

%% Filtrado de la señal

switch tipo

    case 1

        % Cálculo de los coeficientes del filtro (filtro pasa bajas)

        % Este filtrado deja solo la señal de 1000 Hz

        % Frecuencia normalizada

        titutlo='FILTRO PASA BAJAS';

        fNorm = 1200 / (fs/2);

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

    case 2

        %- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        % Cálculo de los coeficientes del filtro (filtro pasa bajas)

        % Este filtrado deja solo la señal de 2000 Hz

        % Frecuencia normalizada

        titutlo='FILTRO PASA ALTAS';

        fNorm = 1900 / (fs/2);

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

    otherwise

        %- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        % Cálculo de los coeficientes del filtro (filtro pasa banda)

        % Este filtrado deja solo la señal 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 señal

y_Low = filtfilt(b, a, y);

% Graficación de la señal en el tiempo

subplot(413)

plot(t,y_Low)

title('SEÑAL FILTRADA')

xlabel('Tiempo (s)')

ylabel('Amplitud (V)')

xlim([0 20/1000])

% Graficación de la señal en frecuencia

subplot(414)

% Llamado a la función que calcula la FFT

fft_signal(y_Low,fs);title('ESPECTRO DE LA SEÑAL FILTRADA')

xlim([0 2500])

%% Gráficas 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')

%% Reproducción 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 (señal filtrada)')

% Se multiplica por 0.1 para atenuar la salida del tono por la bocina

 wavplay(0.1*y_Low,fs)

 

 

 

%% Procesamiento de una señal de audio usando MATLAB

%% Selección del tipo de filtrado

% 1 -> Pasa bajo

% 2 -> Pasa alto

% 3 -> Pasa banda

tipo=1;

%% Crear señal de audio

% Frecuencia fundamental

f0=8e3; % 8KHz

% Amplitud

a=3; % V=4

% Frecuencia de muestreo

fs=44.1e3; % Frecuencia de una señal de audio CD

% Tiempo de duración en segundos

T=1.5;

% Vector de tiempo

t=linspace(0,T,T*fs);

% Creación de la señal

% Primer señal (tono 1)

s1=a*sin(2*pi*f0*t);

% Segunda señal (tono 2)

s2=0.75*a*sin(2*pi*(1.5*f0)*t);

% Tercera señal (tono 3)

s3=0.5*a*sin(2*pi*(2*f0)*t);

% Señal compuesta (suma de dos tonos)

y = s1 + s2 + s3;

% Graficar la señal original

subplot(411)

plot(t,y)

title('SEÑAL ORIGINAL')% Título

xlabel('Tiempo (s)')         % Etiqueta del eje X

ylabel('Amplitud (V)')      % Etiqueta del eje Y

xlim([0 20/f0])            % Límite de la señal

%% Grabar y reproducir la señal de audio

% wavwrite(0.1*y,fs,'audio')

% wavplay(0.1*y,fs)

%% FFT de la señal

subplot(412)

% Llamado a la función que calcula la FFT

fft_signal(y,fs);title('ESPECTRO DE LA SEÑAL ORIGINAL')

xlim([0 f0*3])

%% Filtrado de la señal

switch tipo

    case 1

        % Cálculo de los coeficientes del filtro (filtro pasa bajas)

        % Este filtrado deja solo la señal de 1000 Hz

        % Frecuencia normalizada

        titutlo='FILTRO PASA BAJAS';

        fNorm = 8.5e3 / (fs/2);

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

    case 2

        %- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        % Cálculo de los coeficientes del filtro (filtro pasa bajas)

        % Este filtrado deja solo la señal de 2000 Hz

        % Frecuencia normalizada

        titutlo='FILTRO PASA ALTAS';

        fNorm = 15e3 / (fs/2);

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

    otherwise

        %- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        % Cálculo de los coeficientes del filtro (filtro pasa banda)

        % Este filtrado deja solo la señal de 1500 Hz

        % Frecuencias normalizadas

        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 señal

y_Low = filtfilt(b, a, y);

% Graficación de la señal en el tiempo

subplot(413)

plot(t,y_Low)

title('SEÑAL FILTRADA')

xlabel('Tiempo (s)')

ylabel('Amplitud (V)')

xlim([0 20/f0])

% Graficación de la señal en frecuencia

subplot(414)

% Llamado a la función que calcula la FFT

fft_signal(y_Low,fs);title('ESPECTRO DE LA SEÑAL FILTRADA')

xlim([0 3*f0])

%% Gráficas 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')

%% Reproducción 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 (señal filtrada)')

% Se multiplica por 0.1 para atenuar la salida del tono por la bocina

  wavplay(0.1*y_Low,fs)

 

%% Procesamiento de una señal de audio usando MATLAB

%% Selección del tipo de filtrado

% 1 -> Pasa bajo

% 2 -> Pasa alto

% 3 -> Pasa banda

tipo=3;

%% Leer la señal de audio

[y,fs]=wavread('Yabu_mono');

% y -> muestras de la señal

% fs-> frecuencia de muestreo

% Graficar la señal original

subplot(411)

T=length(y)/fs;

t=linspace(0,T,T*fs);

plot(t,y)

title('SEÑAL ORIGINAL')% Título

xlabel('Tiempo (s)')         % Etiqueta del eje X

ylabel('Amplitud (V)')      % Etiqueta del eje Y

% xlim([0 20/])            % Límite de la señal

%% Reproducir la señal de audio

% wavplay(0.1*y,fs)

%% FFT de la señal

subplot(412)

% Llamado a la función que calcula la FFT

fft_signal(y,fs);title('ESPECTRO DE LA SEÑAL ORIGINAL')

xlim([0 4e3])

%% Filtrado de la señal

switch tipo

    case 1

        % Cálculo de los coeficientes del filtro (filtro pasa bajas)

        % Este filtrado deja solo la señal por debajo de 500 Hz        

        titulo='FILTRO PASA BAJAS';

        % Frecuencia normalizada

        fNorm = 1000 / (fs/2);

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

    case 2

        %- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        % Cálculo de los coeficientes del filtro (filtro pasa altas)

        % Este filtrado deja solo la señal por encima de 500 Hz

        titulo='FILTRO PASA ALTAS';

        % Frecuencia normalizada

        fNorm = 1000 / (fs/2);

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

    otherwise

        %- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

        % Cálculo de los coeficientes del filtro (filtro pasa banda)

        % Este filtrado deja solo la señal 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       

        %- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

end

% Filtrado de la señal

y_Low = filtfilt(b, a, y);

% Graficación de la señal en el tiempo

subplot(413)

plot(t,y_Low)

title('SEÑAL FILTRADA')

xlabel('Tiempo (s)')

ylabel('Amplitud (V)')

% xlim([0 20/f0])

% Graficación de la señal en frecuencia

subplot(414)

% Llamado a la función que calcula la FFT

fft_signal(y_Low,fs);title('ESPECTRO DE LA SEÑAL FILTRADA')

xlim([0 4e3])

%% Gráficas 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')

%% Reproducción 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 (señal filtrada)')

% Se multiplica por 0.2 para atenuar la salida del tono por la bocina

%  wavplay(0.2*y_Low,fs)

 

 

Referencias

[1]. http://es.wikipedia.org/wiki/Filtro_digital

©2015 MATPIC

Prohibida cualquier copia parcial o total del contenido de esta web