Está en la página 1de 16

Procesamiento digital de señales

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 𝜋𝑗 𝑐

También se puede obtener por los siguientes métodos:


• Método de división directa
• Método computacional
• Fracciones parciales y uso de tablas
• Polos de orden superior
• Polos conjugados complejos

Transformada discreta de Fourier


La transformada discreta de Fourier (DFT) es una técnica matemática utilizada para
transformar una señal discreta en el tiempo a una representación discreta en el
dominio de la frecuencia. La DFT toma una secuencia finita de datos discretos y los
convierte en una serie de complejos números que representan la amplitud y la fase
de cada frecuencia presente en la señal original. Estos números se conocen como
coeficientes de la DFT.

La DFT se realiza utilizando una serie de operaciones matemáticas, incluyendo


multiplicaciones y sumas, sobre los datos de entrada y se representa

𝑁−1

𝑋(𝑘 ) = ∑ 𝑥 (𝑛)𝑒 −𝑗(2𝜋𝑘𝑛/𝑁)


𝑛=0

La DFT tiene una gran cantidad de aplicaciones en la tecnología moderna, como el


procesamiento de señales, la transmisión de datos, la visión artificial, el

2
reconocimiento de patrones, la medición de frecuencia, la ingeniería de control y las
comunicaciones.

Transformada rápida de Fourier


La Transformada Rápida de Fourier (FFT) es un algoritmo específico diseñado para
calcular la Transformada Discreta de Fourier (DFT) de una señal discreta de manera
mucho más eficiente que el algoritmo tradicional. En lugar de calcular la DFT mediante
la sumatoria de la señal de entrada multiplicado por una serie de funciones
trigonométricas complejas, la FFT utiliza un enfoque de dividir y conquistar para
calcular la DFT de manera más rápida.

La idea fundamental detrás de la FFT es dividir la señal de entrada en subseñales


más pequeñas y luego calcular la DFT de cada una de estas subseñales. Estas
subseñales se combinan luego para obtener la DFT final de la señal de entrada. Este
enfoque de dividir y conquistar se basa en las propiedades de las funciones
trigonométricas y permite reducir el número de operaciones matemáticas necesarias
para calcular la DFT de una señal.

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.

Hay varios tipos de filtros digitales, algunos de los cuales incluyen:


• Filtro paso bajo: que permiten pasar las señales de frecuencia baja y atenuar
las señales de frecuencia alta.
• Filtro paso alto: que permiten pasar las señales de frecuencia alta y atenuar
las señales de frecuencia baja.
• Filtro paso banda: que permiten pasar un rango específico de frecuencias y
atenuar las señales fuera de ese rango.
• Filtro supresor de banda: que permiten atenuar un rango específico de
frecuencias y pasar las señales fuera de ese rango.

La clasificación de los filtros digitales de acuerdo con su aproximación polinómica se


refiere a la forma en que se representa matemáticamente la respuesta en frecuencia
del filtro. Estos filtros incluyen:

• 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;

En la siguiente parte se escribe el código para poder grabar por medio de un


micrófono durante cinco segundo a un numero de 10000 muestras, se guarda y lo

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;

% Agregar los dos tonos a la voz


Vozruido = MIVoz + Tono1 + Tono2;

En seguida asignamos la señal de entrada “Vozruido” para filtrar el primer tono,


además definir los datos para poder calcular a “m” del polinomio de Butterworth,
teniendo como resultado “m1=0.3977” se dice que el filtro será de primer orden, donde
“a=[1, -1.9950, 0.9962]”, “b=[0.9981,-1.9950,0.9981]”, se coloca el código de una
ventana de Hamming para diseñar un filtro FIR y se hacen las conversiones para
obtener su frecuencias, se aplica la transformada rápida de Fourier para obtener sus
espectros.

%filtro del primer tono


xn1 = Vozruido;
wc = [2*(fruido1-D)/fs 2*(fruido1 +D)/fs] ;

% Cálculo de coeficients para ai y bi tono 1


Ap=3;
Asup=14;
Wsup=55;
Wc=1;
m1=log((10^(Asup/10)-1)/(10^(Ap/10)-1))/(2*log(Wsup/Wc));
c=cot(pi*Wc/fs);
if m1 - floor(m1) >= 0.5
m1 = ceil(m1);
else
m1 = ceil(m1);
end
[b, a] = butter(m1,wc,'stop');
h1 = fir1(N,wc,'stop' );
[H1, w1] = freqz(h1,1,fs/2);
[H2, w2] = freqz(b,a,fs/2);
y = filter(h1,1,xn1);
y2 = filter(b,a,xn1);
ex = abs(fft(xn1));
ey = abs(fft(y,fs));
ey2 =abs(fft(y2,fs));

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:

%filtro del segundo tono


df2= 2;
f12 = fruido2-df2 ;
f22 = fruido2+df2 ;
xn2 = xn1;
wc2 = [2*(fruido2-D)/fs 2*(fruido2 +D)/fs] ;
h2 = fir1(N,wc2,'stop' );

% Cálculo de coeficients para ai y bi tono2


Ap=3;
Asup=14;
Wsup=1015;
Wc2=900;
m2=(log((10^(Asup/10)-1)/(10^(Ap/10)-1))/(2*log(Wsup/Wc)));
c2=cot(pi*Wc/fs);
if m2 - floor(m2) >= 0.5
m2 = ceil(m2);
else
m2 = ceil(m2);
end
[b2, a2] = butter(m2,wc2,'stop');
[H12, w12] = freqz(h2,1,fs/2);
[H22, w22] = freqz(b2,a2,fs/2);
yf2 = filter(h2,1,xn2);
y2f2 = filter(b2,a2,xn2);
ex2 = abs(fft(xn2));
eyf2 = abs(fft(yf2,fs));
ey2f2 = abs(fft(y2f2,fs));

Vozfiltrada2=zeros(1,N);
Vozfiltrada2=conv(Vozruido,h2,"same");

Se manda a graficar en cuatro pestañas las graficas de la voz en el tiempo, en


frecuencia, y en espectros.

%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");

Por ultimo se manda a llamar las señales que se quieren escuchar

%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.

La ventana con el nombre de “figure(1)” muestra la señal de voz en el tiempo, la


primera grafica es la voz sin los tonos, la segunda grafica es la voz ya con los tonos
agregados, la tercera grafica es cuando se filtro el primer tono y la cuarta cuando se
filtro el segundo tono.

Se aprecia que al aplicar el primer filtro la señal no es mu distinta a la señal con los
tonos agragados.

La ventana con el nombre de “figure(2)” muestra la respuesta en frecuencia de los


filtros de los dos tonos, en las primeras dos graficas se ve que están en los 55 Hz,
que es lo que corresponde al tono1,las siguientes dos graficas corresponden a la
respuesta en frecuencias del tono2 que es de 1015 Hz.

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.

La ventana con el nombre de “figure(4)” muestra los espectros de la señal de entra,


y de los filtros del tono2. Donde notamos que el espectro del filtro FIR del tono 1 se
encuentra en sobre 1015 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

Sandoval Martinez Crystian Alberto:


Con el desarrollo de este trabajo se uso lo visto en clase como es el ir de un dominio
a otro realizando las transformaciones necesarias, esto se implemento en el
desarrollo del código elaborado en el entorno de Matlab para poder filtrar la grabación
de la voz de dos tonos que se agregaron.
Donde podemos observar que el no se nota un cambio notable en el el filtro del primer
tono ya que la frecuencia es muy pequeña, para el filtro del segundo tono es mejor ya
que ese es mucho mas grande que el primero donde se ve y se escucha una gran
diferencia.

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;

% Agregar los dos tonos a la voz


Vozruido = MIVoz + Tono1 + Tono2;

%filtro del primer tono


xn1 = Vozruido;
wc = [2*(fruido1-D)/fs 2*(fruido1 +D)/fs] ;

% Cálculo de coeficients para ai y bi tono 1


Ap=3;
Asup=14;
Wsup=55;
Wc=1;
m1=log((10^(Asup/10)-1)/(10^(Ap/10)-1))/(2*log(Wsup/Wc));
c=cot(pi*Wc/fs);
if m1 - floor(m1) >= 0.5
m1 = ceil(m1);
else
m1 = ceil(m1);
end
[b, a] = butter(m1,wc,'stop');
h1 = fir1(N,wc,'stop' );
[H1, w1] = freqz(h1,1,fs/2);
[H2, w2] = freqz(b,a,fs/2);
y = filter(h1,1,xn1);
y2 = filter(b,a,xn1);
ex = abs(fft(xn1));
ey = abs(fft(y,fs));
ey2 =abs(fft(y2,fs));

13
Vozfiltrada1=zeros(1,N);
Vozfiltrada1=conv(Vozruido,h1,"same");

%filtro del segundo tono


df2= 2;
f12 = fruido2-df2 ;
f22 = fruido2+df2 ;
xn2 = xn1;
wc2 = [2*(fruido2-D)/fs 2*(fruido2 +D)/fs] ;
h2 = fir1(N,wc2,'stop' );

% Cálculo de coeficients para ai y bi tono2


Ap=3;
Asup=14;
Wsup=1015;
Wc2=900;
m2=(log((10^(Asup/10)-1)/(10^(Ap/10)-1))/(2*log(Wsup/Wc)));
c2=cot(pi*Wc/fs);
if m2 - floor(m2) >= 0.5
m2 = ceil(m2);
else
m2 = ceil(m2);
end
[b2, a2] = butter(m2,wc2,'stop');
[H12, w12] = freqz(h2,1,fs/2);
[H22, w22] = freqz(b2,a2,fs/2);
yf2 = filter(h2,1,xn2);
y2f2 = filter(b2,a2,xn2);
ex2 = abs(fft(xn2));
eyf2 = abs(fft(yf2,fs));
ey2f2 = abs(fft(y2f2,fs));

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

También podría gustarte