Universidad de Granada
Ingeniería Electrónica Industrial
PRÁCTICA 2: SISTEMAS EN TIEMPO
DISCRETO
Tratamiento y Transmisión de Señales
Autor:
Antonio Domingo Moreno Crespo
Marzo 2022
0
Índice general
1. Introducción ........................................................... 2
2. Desarrollo de la práctica........................................ 2
2.1. Filtros IIR .................................................................... 2
2.2. Filtros FIR ................................................................... 7
2.3. Decodificación de audio analógica ........................... 12
1
1. Introducción
Un sistema discreto se define como aquel que responde con una señal discreta ante una
excitación discreta.
La respuesta de un sistema discreto se expresa mediante el producto de convolución:
∞
𝑦(𝑛) = ∑ ℎ(𝑙)𝑥(𝑛 − 𝑙) = ℎ(𝑛) ∗ 𝑥(𝑛) = 𝑥(𝑛) ∗ ℎ(𝑛)
𝑙=0
Donde h(n) representa la respuesta impulsiva del sistema discreto y x(n) la señal de
entrada. Sin embargo, el producto de convolución no se puede implementar bien en un
ordenador, debido a que se extiende en el infinito, por lo que se calcula mediante la
ecuación en diferencias:
𝑁 𝑀
1
𝑦(𝑛) = − 𝑎 ∑ 𝑎𝑘𝑦(𝑛 − 𝑘) + ∑ 𝑏𝑙𝑥(𝑛 − 𝑙)
0
𝑘=𝑙 𝑙=0
A partir de esta expresión, podemos diferencias dos tipos de sistemas:
-Sistemas de Respuesta Impulsiva Infinita (IIR)
-Sistemas de Respuesta Impulsiva Finita (FIR)
2. Desarrollo de la práctica
2.1 Filtros IIR
Utilizamos la siguiente ecuación de un sistema IIR:
𝑦(𝑛) + 0.9𝑦(𝑛 − 2) = 0.3𝑥(𝑛) + 0.6𝑥(𝑛 − 1) + 0.3𝑥(𝑥 − 2)
1. Obtener las 30 primeras muestras de la respuesta impulsiva del sistema.
x=[1 zeros(1,29)];
a=[1. 0. 0.9];
b=[0.3 0.6 0.3];
xn=[0. 0. 0.];
yn=[0. 0. 0.];
for n=1:length(x)
xn(3)=xn(2); xn(2)=xn(1); xn(1)=x(n);
yn(3)=yn(2); yn(2)=yn(1); yn(1)=0.;
y(n) = -a*yn' +b*xn';
yn(1)=y(n);
end
stem (y)
2
Respuesta del sistema
Podemos observar como la respuesta del sistema converge en 0.
También podemos ver la respuesta del sistema con la función plot.
2. Comprobar el resultado utilizando la función ‘filter’ de Matlab.
y1=filter(b,a,x);
stem(y1)
3
Como podemos observar, obtenemos el mismo resultado de las dos formas.
3. Obtener la respuesta del sistema a un escalón unitario.
x1=ones(1,30);
y2=filter(b,a,x1);
stem(y2)
Respuesta del sistema
4. ¿Es estable el sistema anterior?
Para que un sistema sea estable, la respuesta al impulso debe de converger y la
sumatoria de todos sus valores tienen que ser un término totalmente sumable.
Primero comprobamos si la salida converge:
4
x2=[1 zeros(1,499)];
y3=filter(b,a,x2);
stem (y3)
Como podemos observar, la salida converge a 0.
Ahora comprobamos si todos sus términos son totalmente sumables.
sumavalores=zeros(1,500);
for i=1:500;
sumavalores(i)=sum(abs(y3(1:i)));
end
plot(sumavalores)
A partir de 150, los valores se vuelven constantes, por lo que podemos decir que sus
terminos si son totalmente sumables, por lo que el sistema es estable.
5
5. Determinar la estabilidad del siguiente sistema IIR:
𝒚(𝒏) − 𝟐. 𝟓𝒚(𝒏 − 𝟏) + 𝒚(𝒏 − 𝟐) = 𝟒𝒙(𝒏)
a1=[1 -2.5 1];
b1=[4 0 0];
x3=[1 zeros(1,49)];
y4=filter(b1,a1,x3);
stem(y4)
sumavalores1=zeros(1,50);
for i=1:50;
sumavalores1(i)=sum(abs(y4(1:i)));
end
plot(sumavalores1)
Obtenemos los siguientes resutados:
Respuesta del sistema al impulso unitario
Sumatoria de sus valores
6
Como podemos observar, el sistema ni converge ni sus términos son totalmente
sumables ante un impulso. Por lo que podemos decir que este sistema no es estable.
2.2 Filtros FIR
Tenemos que utilizar un filtro FIR que nos proporcione como salida la media de las
10 últimas muestras de entrada, incluyendo la entra actual. Para ello utilizamos la
mediamóvil:
𝑀
1
𝑦(𝑛) = ∑ 𝑥(𝑛 − 𝑘)
𝑀+1
𝑘=0
1. Obtener y dibujar la respuesta impulsiva del sistema (30 muestras).
x=[1 zeros(1,29)];
a=[1 zeros(1,9)];
M=10;
b=1/M*ones(1,10);
y=filter(b,a,x);
stem(y)
Respuesta del sistema ante un impulso
7
2. Obtener la respuesta a un escalón unitario del sistema haciendo uso de la
función ‘filter’. ¿Cuál es el retardo del sistema? Realizar la misma operación, pero
con la función ‘conv’ y señalar la diferencia en el resultado respecto a ‘filter’.
x1=ones(1,30);
y2=filter(b,a,x1);
stem(y2)
Respuesta del sistema ante entrada escalón
%Calculamos el retardo del filtro utilizando grpdelay,
utilizando la respuesta ante el impulso
grpdelay(y);
8
Como podemos observar, el retardo introducido por el filtro tiene un valor de 4.5,
siendo el mismo valor para todos los componentes, por lo que es un retardo lineal.
Este es el retardo de grupo, que está asociado a las componentes frecuenciales.
%Calculamos la respuesta al escalón con conv
y3=conv(b,x1);
stem(y3)
Respuesta del sistema utilizando ‘conv’
Ahora vamos a ver la diferencia entre ‘filter’ y ‘conv’ comparado las dos gráficas.
stem (y3) %conv en azul
hold on
stem (y2) %filter en naranja
hold off
9
Como podemos ver, la diferencia entre ‘filter’ y ‘conv’ es que la función ‘conv’ nos da
todos los datos hasta que la entrada se vuelve cero, mientras que ‘filter’ solo nos
proporciona los datos de las 30 muestras.
3. Repetir el apartado anterior para el siguiente filtro:
𝒏 + 𝟏; 𝟎 ≤ 𝒏 ≤ 𝑵𝟎 = 𝟖
𝒉(𝒏) = {
𝟐𝑵𝟎 − 𝒏 + 𝟏; 𝑵𝟎 < 𝒏 ≤ 𝟐𝑵𝟎
%Calculamos la respuesta al impulso unitario
x=[1 zeros(1,29)];
a=[1 zeros(1,9)];
for n=0:8
b1(n+1)=n+1; %Ponemos b1(n+1) porque 'for' no nos deja empezar con
0, es decir, b1(0)
end
for n=9:16
b1(n+1)=2*8-n+1;
end
y7=filter(b1,a,x);
stem(y7)
Respuesta al escalón unitario
10
%Calculamos la respuesta al impulso unitario
x1=ones(1,30);
y4=filter(b1,a,x1);
stem(y4)
Respuesta del sistema ante escalón unitario con ‘filter’
%Calculamos el retardo con una entrada impulso
grpdelay(y7);
Retardo del filtro
11
El retardo tiene un valor de 8 para todos sus componentes, siendo este un retardo lineal.
%Utilizamos conv
y6=conv(b1,x1);
stem(y6)
Respuesta del sistema ante entrada escalón utilizando ‘conv’
2.3 Decodificación de audio de TV analógica de pago
%Cargamos el audio origal
[s,Fs]=audioread ('[Link]');
plot(s)
12
%Aplicamos el filtro FIR para quitar el ruido, eliminando
los componentes de alta frecuencia
a=[1 zeros(1,9)];
M=10;
b=1/M*ones(1,10);
y=filter(b,a,s);
plot(y)
%Codificamos la señal
y1=zeros(1,length(y))';
for n=1:length(y)
y1(n)=((-1)^n)*y(n);
end
plot(y1)
13
%Descodificamos la señal
y2=zeros(1,length(y1))';
for n=1:length(y1)
y2(n)=((-1)^n)*y1(n);
end
plot(y2)
Vemos como la señal filtrada y la señal codificada son iguales, ya que al aplicar el filtro
ℎ(𝑛) = (−1)𝑛 dos veces, podemos recuperar la señal original.
14