Ejercicio: 2Eva2010TI_T1 LTI DT Bloques de H[z] para ecuación de diferencias

litera a. La función de transferencia H(z)
El diagrama mostrado se reordena y añade anotaciones para facilitar la escritura de la ecuación de diferencias:

Dado que hay dos bloques (1/z) o de retraso hacia abajo, se identifica que los polinomios son de segundo orden (N=2).
Los coeficientes de retraso se leen de arriba hacia abajo como a0,-a1,-a2 ordenados en la siguiente tabla:
| retraso | adelanto |
|---|---|
| a0 = 1 | b0 = 0 |
| a1 = -(1.6) = -1.6 | b1 = 4 |
| a2 = -(-0.63) = 0.63 | b2 = -4 |
Se aplica lo mismo para los coeficientes de adelanto y se completa el modelo para los polinomios del numerador y denominador:
H[z] = \frac{b_0 z^N +b_1 z^{N-1} + \text{ ... } + b_{N-1} z + b_N}{z^N + a_1 z^{N-1} +\text{ ... } + a_{N-1}z +a_N} H[z] = \frac{4z-4}{z^2 -1.6 z + 0.63}Con el polinomio del denominador Qz se encuentran las raíces
polos: {0.70: 1, 0.90: 1}
se aplican fracciones parciales modificadas al dividir cada lado para z,
\frac{H[z]}{z} = \frac{4}{z}\frac{z-1}{(z-0.7)(z-0.9)} = \frac{k_1}{z-0.7} +\frac{k_2}{z-0.9}+\frac{k_3}{z}aplicando el método de Heaviside:
k_1 = \frac{4}{z}\frac{z-1}{\cancel{(z-0.7)}(z-0.9)}\Big|_{z=0.7} = \frac{4}{0.7}\frac{(0.7)-1}{((0.7)-0.9)} = 8.5714 k_2 = \frac{4}{z}\frac{z-1}{(z-0.7)\cancel{(z-0.9)}}\Big|_{z=0.9} = \frac{4}{0.9}\frac{(0.9)-1}{((0.9)-0.7)} = -2.2222 k_3 = \frac{4}{\cancel{z}}\frac{z-1}{(z-0.7)(z-0.9)}\Big|_{z=0} = 4\frac{(0)-1}{((0)-0.7)((0)-0.9)} = -6.3492 \frac{H[z]}{z} = \frac{8.5714}{z-0.7} -\frac{2.2222}{z-0.9}-\frac{6.3492}{z}restaurando a fracciones parciales al multiplicar por z
H[z] = \frac{8.5714z}{z-0.7} -\frac{2.2222z}{z-0.9}-6.3492usando la tabla de transformadas z
h[n] = 8.5714 (0.7)^n \mu[n] -2.2222(0.9)^n \mu[n] -6.3492 \delta[n]Algoritmo en Python
Usando el algoritmo de la sección X[z] Fracciones parciales modificadas con Python
con entrada:
Pz = 4*z-4
Qz = z**2-1.6*z+0.63
y resultado:
Hz:
4*z - 4
-----------------
2
z - 1.6*z + 0.63
Hz en fracciones parciales
8.57142857142857*z 2.22222222222222*z
------------------ - ------------------ - 6.34920634920635
z - 0.7 z - 0.9
Hz en factores
4*(z - 1)
-------------------
(z - 0.9)*(z - 0.7)
{Q_polos:veces}: {0.700000000000000: 1, 0.900000000000000: 1}
{P_ceros:veces}: {1: 1}
estabilidad asintótica en z:
circ1_dentro : 2
circ1_repetidos : 0
circ1_sobre : 0
circ1_fuera : 0
unicos : 2
repetidos : 0
asintota : estable
h[n]:
/ n n\
\8.57142857142857*0.7 - 2.22222222222222*0.9 /*Heaviside(n)
- 6.34920634920635*DiracDelta(n)
señal discreta h[n]
n : [0 1 2 3 4 5 6 7 8 9]
h[n]: [ 0. 4. 2.4 1.32 0.6 0.1284
-0.17256 -0.356988 -0.462468 -0.51504636]


Observaciones:
Las raíces características o frecuencias naturales del sistema se encuentran dentro del círculo de radio unitario. El sistema es asintóticamente estable, que implica que es BIBO estable.
literal c. Ecuación de diferencias
H[z] = \frac{4z-4}{z^2 -1.6 z + 0.63} Y[z](z^2 -1.6 z+ 0.63) = (4z-4)X[z] y[n+2] - 1.6 y[n+1] + 0.63y[n] = 4x[n+1]-4x[n]literal d. entrada x[n]
x(t) = cos(1500t) = cos (2πf) con intervalo de muestreo Ts = 0.0015 = 1/fs.
De la señal de entrada se tiene que 2πf=1500, por lo que f = 1500/(2π)
Para un buen muestreo de la señal de entrada, se debe cumplir la frecuencia de Nyquist, es decir fs>2f
fs = \frac{1}{0.0015} = 666.66 \text{ ; } f= \frac{1500}{2 \pi}=238.73 fs > 2*f = 2(238.73) = 477.46que cumple con la frecuencia mínima de muestreo y no se presentan inconvenientes para el funcionamiento de la señal por sub-muestreo
Algoritmo en Python
# Transformada z- Fracciones parciales
# https://blog.espol.edu.ec/algoritmos101/senales/ss-unidades/ss-unidad-7/
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt
import telg1001 as fcnm
#sym.SYMPY_DEBUG=True
# INGRESO
z = sym.Symbol('z')
n = sym.Symbol('n', real=True)
# coeficientes como racional en dominio 'ZZ' enteros
Pz = 4*z-4
Qz = z**2-1.6*z+0.63
F = Pz/Qz
# para graficar
f_nombre = 'H' # nombre de función[z]: H,X,Y, etc
muestras_fn = 10 # muestras para f[n]
# PROCEDIMIENTO
Fz = fcnm.apart_z(F)
Fz_factor = sym.factor(F.evalf())
Fz_factor = fcnm._round_float_is_int(Fz_factor)
# polos y ceros de Hz
[P,Q] = F.as_numer_denom()
P = sym.poly(P,z)
Q = sym.poly(Q,z)
P_ceros = sym.roots(P)
Q_polos = sym.roots(Q)
estable_z = fcnm.estabilidad_asintotica_z(Q_polos)
# Inversa de transformada z
fn = 0*n ; Fz_revisar = [] ; Qz2_term =[]
term_sum = sym.Add.make_args(Fz)
for term_k in term_sum:
term_kn = fcnm.inverse_z_transform(term_k,z,n)
if type(term_kn)==tuple:
fn = fn + term_kn[0]
elif term_kn is not None:
fn = fn + term_kn
elif term_kn is None:
f_noeval = f_noeval + term_k
Qz2 = fcnm.Q_cuad_z_parametros(term_k)
if Qz2:
Qz2_term.append(Qz2)
fn = fn.collect(sym.Heaviside(n))
fn = fn.collect(sym.DiracDelta(n))
fn = fcnm._round_float_is_int(fn)
# SALIDA
print('\n '+f_nombre+'z:')
sym.pprint(F)
print('\n '+f_nombre+'z en fracciones parciales')
sym.pprint(Fz)
print('\n '+f_nombre+'z en factores')
sym.pprint(Fz_factor)
print('\n {Q_polos:veces}:',Q_polos)
print(' {P_ceros:veces}:',P_ceros)
if len(Qz2_term)>0:
print('\nparametros cuadraticos: ')
for i in range(0,len(Qz2_term),1):
for unterm in Qz2_term[i]:
print(' termino:',unterm)
fcnm.print_resultado_dict(Qz2_term[i][unterm])
print('\nestabilidad asintótica en z:')
fcnm.print_resultado_dict(estable_z)
print('\n '+f_nombre.lower()+'[n]:')
sym.pprint(fn)
if len(Fz_revisar)>0:
print('revisar terminos sin transformada de tabla:')
for un_term in Fz_revisar:
print(un_term)
# # GRAFICA -----------
fig_ROC = fcnm.graficar_Fz_polos(Fz_factor,Q_polos,P_ceros,
muestras=101,f_nombre=f_nombre)
fig_Fz = fcnm.graficar_Fs(Fz_factor,Q_polos,P_ceros,
muestras=101,
f_nombre=f_nombre)
# graficar f[n] -------
f_n = sym.lambdify(n,fn.expand(),modules=fcnm.equivalentes)
ki = np.arange(0,muestras_fn,1.0)
fi = f_n(ki)
print('\nseñal discreta '+f_nombre.lower()+'[n]')
print('n :',ki)
print(f_nombre.lower()+'[n]:',fi)
# graficar f[n]
fig_fn, grafxn = plt.subplots()
plt.axvline(0,color='grey')
plt.stem(ki,fi)
plt.grid()
plt.xlabel('n')
plt.ylabel(f_nombre.lower()+'[n]')
etiqueta = r''+f_nombre.lower()+'[n]= $'+str(sym.latex(fn))+'$'
plt.title(etiqueta)
plt.show()