Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Proyecto
Filtros digitales
Índice
Índice 1
Objetivo 2
Introducción 2
Transformada Z inversa 2
Transformada discreta de Fourier 2
Transformada rápida de Fourier 3
Filtros digitales 3
Material 4
Desarrollo 4
Resultados 9
Conclusiones 11
Bibliografía 11
Anexos 12
Código 12
1
Objetivo
Entender que son y como es que funcionan los filtros digitales, implementando lo visto
en el curso como son la transformada z, transformada z inversa, transformada rápida
de Fourier y comprender la clasificación de los filtros digitales, así como sus diversas
formas de calcular sus coeficientes.
Introducción
Transformada Z inversa
La transformada Z inversa es una técnica matemática utilizada en el análisis de
sistemas de tiempo discreto. Se utiliza para transformar una función de transferencia
de la variable de tiempo discreta (Z) a la variable de tiempo continua (s).
Se define de la siguiente forma:
1
𝑥 (𝑛 ) = ∮ 𝑋(𝑧)𝑧 𝑛−1𝑑𝑧
2 𝜋𝑗 𝑐
𝑁−1
2
reconocimiento de patrones, la medición de frecuencia, la ingeniería de control y las
comunicaciones.
Filtros digitales
Los filtros digitales son algoritmos matemáticos que se utilizan para manipular señales
discretas en el tiempo. Estos algoritmos toman una señal de entrada, la procesan
mediante una serie de operaciones matemáticas y producen una señal de salida
modificada. Los filtros digitales son ampliamente utilizados en una variedad de
aplicaciones, como el procesamiento de señales, la transmisión de datos, las
comunicaciones, el audio y la imagen.
• Filtros Butterworth
3
• Filtros Chebyshev
• Filtros elípticos
Material
Computadora con Matlab que tenga por lo menos las siguientes características
● Sistema operativo Windows 10 o superior
● Mínimo de procesador Intel o AMD x86-64
● Mínimo 4 GB de memoria RAM
Desarrollo
Declaramos las variables que se usaran en el código como son las frecuencias de los
tonos (en mi caso son “fruido1=55” y “fruido2=1015”), en número de muestras, el
ancho de banda de frecuencia de corte.
clear;
clc;
ei=5;
fs = 10000;
fruido1 = 10 + 9*ei;
fruido2 = 1000 + 3*ei;
df1=2;
f1 = fruido1-df1 ;
f2 = fruido1+df1 ;
D = 3;
pi = 3.14159;
4
podemos utilizar para el programa, en este caso la frase que decidí gravar dice “Hola
mi nombre es Crystian este es una prueba del programa , saludos”
%grabar voz
recording = audiorecorder(10000,16,1);
recordblocking(recording,5);
voz = getaudiodata(recording);
save('Voz.mat','voz');
% cargar voz
Voz = load("Voz.mat");
muestravoz = transpose(Voz.voz);
MIVoz = muestravoz(1:50000);
N = length(MIVoz);
A continuación, se calculan los valores de los coeficientes del oscilador para los dos
tonos
% tono1
bf0 = sin(2*pi*fruido1/fs); % Coeficiente para la señal de entrada
af1 = -2*cos(2*pi*fruido1/fs); % Coeficiente para y(n-1)
af2 = 1; % Coeficiente para y(n-2)
t = 1:fs*5; % Indice de tiempo
xf = sin(2*pi*fruido1/fs*t);
yf = zeros(size(xf)); % Inicializar señal de salida
% tono2
Bf0 = sin(2*pi*fruido2/fs); % Coeficiente para la señal de entrada
Af1 = -2*cos(2*pi*fruido2/fs); % Coeficiente para y(n-1)
Af2 = 1; % Coeficiente para y(n-2)
Xf = sin(2*pi*fruido2/fs*t);
Yf = zeros(size(Xf)); % Inicializar señal de salida
% tono1
for i = 3:length(xf)
yf(i) = bf0*xf(i) + af1*yf(i-1) - af2*yf(i-2);
end
% tono2
for k = 3:length(Xf)
Yf(k) = Bf0*Xf(k) + Af1*Yf(k-1) - Af2*Yf(k-2);
end
A continuación, se define la relación señal ruido y se hacen los cálculos para poder
ajustarlos a los tonos que se quieren agregar a la grabación, y se obtiene la señal
“Vozruido” con los tonos sumados.
Tonoruido=yf+Yf;
Asenial = MIVoz;
Aruido=Tonoruido;
n = 0:(N-1);
s=0;
S=0;
for j=1:fs/2
5
s=(Asenial(j)^2)+(Asenial(j+1)^2);
S=(Aruido(j)^2)+(Aruido(j+1)^2);
end
Psenial=((1/4000)^2)*s;
Pruido=((1/4000)^2)*S;
%SNR =10*log10(Psenial/Pruido); % Relación señal-ruido (dB) menor 5
SNR = 3;
A_senial = max(MIVoz);
A_ruido = A_senial/(10^(SNR/10));
Tono1=A_ruido*yf;
Tono2=A_ruido*Yf;
Vozfiltrada1=zeros(1,N);
Vozfiltrada1=conv(Vozruido,h1,"same");
6
Se vuelve a realizar los pasos anteriores paro esta ves para filtrar el segundo tono
teniendo como código lo siguiente:
Vozfiltrada2=zeros(1,N);
Vozfiltrada2=conv(Vozruido,h2,"same");
%graficas
figure(1);
subplot(4,1,1)
plot(n,MIVoz);grid on;title("Voz");
xlabel("Tiempo");ylabel("amplitud");
subplot(4,1,2)
plot(n,Vozruido);grid on;title("Voz con 2 tonos");
xlabel("Tiempo");ylabel("amplitud");
subplot(4,1,3)
plot(n,Vozfiltrada1);grid on;title("Voz filtrada del primer tono");
xlabel("Tiempo");ylabel("amplitud");
subplot(4,1,4)
plot(n,Vozfiltrada2);grid on;title("Voz filtrada del segundo tono");
xlabel("Tiempo");ylabel("amplitud");
figure(2);
subplot(4,1,1)
plot(20*log(abs(H1)));title('Respuesta en Frecuencia, Filtro FIR en db para tono
1');
7
xlabel("Frecuencia HZ");ylabel("db");
subplot(4,1,2)
plot(20*log(abs(H2)));title('Respuesta en Frecuencia, Filtro IIR en db para tono
1');
xlabel("Frecuencia HZ");ylabel("db");
subplot(4,1,3)
plot(20*log(abs(H12)));title('Respuesta en Frecuencia, Filtro FIR en db para tono
2');
xlabel("Frecuencia HZ");ylabel("db");
subplot(4,1,4)
plot(20*log(abs(H22)));title('Respuesta en Frecuencia, Filtro FIR en db para tono
2');
xlabel("Frecuencia HZ");ylabel("db");
figure(3);
subplot(3,1,1)
plot(ex(1:fs/2));title('Espectro de entrada tono 1');
xlabel("Frecuencia HZ");ylabel("amplitud");
subplot(3,1,2)
plot(ey(1:fs/2));title('Espectro Filtro FIR tono1');
xlabel("Frecuencia HZ");ylabel("amplitud");
subplot(3,1,3)
plot(ey2(1:fs/2));title('Espectro Filtro IIR tono1');
xlabel("Frecuencia HZ");ylabel("amplitud");
figure(4);
subplot(3,1,1)
plot(ex2(1:fs/2));title('Espectro de entrada tono 2');
xlabel("Frecuencia HZ");ylabel("amplitud");
subplot(3,1,2)
plot(eyf2(1:fs/2));title('Espectro Filtro FIR tono 2');
xlabel("Frecuencia HZ");ylabel("amplitud");
subplot(3,1,3)
plot(ey2f2(1:fs/2));title('Espectro Filtro IIR tono 2');
xlabel("Frecuencia HZ");ylabel("amplitud");
%Reproducir
sound(MIVoz,fs)
pause(5)
sound(Vozruido,fs)
pause(5)
sound(Vozfiltrada1,fs)
pause(5)
sound(Vozfiltrada2,fs)
8
Resultados
Ya que se implementó dos filtros en cascada como se muestra en la siguiente imagen,
los resultados gráficos los veremos divididos en varias ventanas con su respectivas
graficas.
Se aprecia que al aplicar el primer filtro la señal no es mu distinta a la señal con los
tonos agragados.
9
La ventana con el nombre de “figure(3)” muestra los espectros de la señal de entra,
y de los filtros del tono1. Donde notamos que el espectro del filtro FIR del tono 1 se
encuentra en sobre 55 Hz.
10
Además, se escuchan los cuatro audios que se mandaron a reproducir.
El primer audio es de la voz sin ningún ruido, el segundo audio es la voz, pero ya con
los tonos agregados, el tercer audio es cuando ya se aplico el filtro del primer tono y
el ultimo audio es cuando se filtró el segundo tono.
Conclusiones
Bibliografía
• Conceptos básicos de procesamiento digital de señales - Larry Hipólito
Escobar Salguero - Facultad de Ingeniería UNAM - 2008
http://www.itq.edu.mx/carreras/IngElectronica/archivos_contenido/Apuntes%20de
%20materias/CDF1202_Comm_Digitales/1_Proc_conversion_AD.pdf
11
• Diseño de filtros digitales - Larry Hipólito Escobar Salguero - Facultad de
Ingeniería UNAM - 2006
http://odin.fi-
b.unam.mx/labdsp/files/libros/filtros.pdf#scrollbar=1&toolbar=0&statusbar=0&mes
sages=0
Anexos
Código
Codificado en Matlab
clear;
clc;
ei=5;
fs = 10000;
fruido1 = 10+9*ei;
fruido2 = 1000 +3*ei;
df1= 2;
f1 = fruido1-df1 ;
f2 = fruido1+df1 ;
D = 3;
pi = 3.14159;
%grabar voz
recording = audiorecorder(10000,16,1);
recordblocking(recording,5);
%sound(getaudiodata(recording),10000);
voz = getaudiodata(recording);
save('Voz.mat','voz');
% cargar voz
Voz = load("Voz.mat");
muestravoz = transpose(Voz.voz); %Pasa senial de voz a un arreglo
MIVoz = muestravoz(1:50000);
N = length(MIVoz);
% tono1
bf0 = sin(2*pi*fruido1/fs); % Coeficiente para la señal de entrada
af1 = -2*cos(2*pi*fruido1/fs); % Coeficiente para y(n-1)
af2 = 1; % Coeficiente para y(n-2)
t = 1:fs*5; % Indice de tiempo
xf = sin(2*pi*fruido1/fs*t);
yf = zeros(size(xf)); % Inicializar señal de salida
% tono2
Bf0 = sin(2*pi*fruido2/fs); % Coeficiente para la señal de entrada
Af1 = -2*cos(2*pi*fruido2/fs); % Coeficiente para y(n-1)
Af2 = 1; % Coeficiente para y(n-2)
Xf = sin(2*pi*fruido2/fs*t);
Yf = zeros(size(Xf)); % Inicializar señal de salida
% tono1
12
for i = 3:length(xf)
yf(i) = bf0*xf(i) + af1*yf(i-1) - af2*yf(i-2);
end
% tono2
for k = 3:length(Xf)
Yf(k) = Bf0*Xf(k) + Af1*Yf(k-1) - Af2*Yf(k-2);
end
Tonoruido=yf+Yf;
Asenial = MIVoz;
Aruido=Tonoruido;
n = 0:(N-1);
s=0;
S=0;
for j=1:fs/2
s=(Asenial(j)^2)+(Asenial(j+1)^2);
S=(Aruido(j)^2)+(Aruido(j+1)^2);
end
Psenial=((1/4000)^2)*s;
Pruido=((1/4000)^2)*S;
%SNR =10*log10(Psenial/Pruido); % Relación señal-ruido (dB) menor 5
SNR = 3;
A_senial = max(MIVoz);
A_ruido = A_senial/(10^(SNR/10));
Tono1=A_ruido*yf;
Tono2=A_ruido*Yf;
13
Vozfiltrada1=zeros(1,N);
Vozfiltrada1=conv(Vozruido,h1,"same");
Vozfiltrada2=zeros(1,N);
Vozfiltrada2=conv(Vozruido,h2,"same");
%graficas
figure(1);
subplot(4,1,1)
plot(n,MIVoz);grid on;title("Voz");
xlabel("Tiempo");ylabel("amplitud");
subplot(4,1,2)
plot(n,Vozruido);grid on;title("Voz con 2 tonos");
xlabel("Tiempo");ylabel("amplitud");
subplot(4,1,3)
plot(n,Vozfiltrada1);grid on;title("Voz filtrada del primer tono");
xlabel("Tiempo");ylabel("amplitud");
subplot(4,1,4)
plot(n,Vozfiltrada2);grid on;title("Voz filtrada del segundo tono");
xlabel("Tiempo");ylabel("amplitud");
figure(2);
subplot(4,1,1)
plot(20*log(abs(H1)));title('Respuesta en Frecuencia, Filtro FIR en db para tono
1');
xlabel("Frecuencia HZ");ylabel("db");
subplot(4,1,2)
plot(20*log(abs(H2)));title('Respuesta en Frecuencia, Filtro IIR en db para tono
1');
xlabel("Frecuencia HZ");ylabel("db");
14
subplot(4,1,3)
plot(20*log(abs(H12)));title('Respuesta en Frecuencia, Filtro FIR en db para tono
2');
xlabel("Frecuencia HZ");ylabel("db");
subplot(4,1,4)
plot(20*log(abs(H22)));title('Respuesta en Frecuencia, Filtro FIR en db para tono
2');
xlabel("Frecuencia HZ");ylabel("db");
figure(3);
subplot(3,1,1)
plot(ex(1:fs/2));title('Espectro de entrada tono 1');
xlabel("Frecuencia HZ");ylabel("amplitud");
subplot(3,1,2)
plot(ey(1:fs/2));title('Espectro Filtro FIR tono1');
xlabel("Frecuencia HZ");ylabel("amplitud");
subplot(3,1,3)
plot(ey2(1:fs/2));title('Espectro Filtro IIR tono1');
xlabel("Frecuencia HZ");ylabel("amplitud");
figure(4);
subplot(3,1,1)
plot(ex2(1:fs/2));title('Espectro de entrada tono 2');
xlabel("Frecuencia HZ");ylabel("amplitud");
subplot(3,1,2)
plot(eyf2(1:fs/2));title('Espectro Filtro FIR tono 2');
xlabel("Frecuencia HZ");ylabel("amplitud");
subplot(3,1,3)
plot(ey2f2(1:fs/2));title('Espectro Filtro IIR tono 2');
xlabel("Frecuencia HZ");ylabel("amplitud");
%Reproducir
sound(MIVoz,fs)
pause(5)
sound(Vozruido,fs)
pause(5)
sound(Vozfiltrada1,fs)
pause(5)
sound(Vozfiltrada2,fs)
15