Referencia: Lathi Ejemplo 3.17, 3.18 y 3.19 p277-278
Determine la respuesta al impulso unitario de un sistema LTID descrito por la ecuación de diferencias mostrada,
Para el diagrama se usa la ecuación desplazada en dos unidades,
En la entrada se usa un impulso unitario x[n] = δ[n]
Desarrollo Analítico
Se requieren al menos dos valores iniciales en el ejercicio, por lo que se emplea la ecuación en forma iterativa, recordando que x[n] = δ[n], siendo entonces y[n] = h[n]
aplicando para n=0
luego se aplica para n = 1
El ejercicio es continuación del primer ejercicio de respuesta a entrada cero, por lo que simplificamos el desarrollo como
con raíces características γ1=-0.2 y γ2=0.8,
con los modos característicos se tiene que
que se convierte a:
Para determinar c1 y c2 se recurre a encontrar dos valores de forma iterativa, con n=0 y n=1.
los valores de h[0]=5 y h[1]=3 se encontraron de forma iterativa
resolviendo con Python:
>>> import numpy as np >>> A = [[ 1., 1.], [-0.2, 0.8]] >>> B = [5.,3.] >>> np.linalg.solve(A,B) array([1., 4.]) >>>
encontrando que c1=1 y c2=4
teniendo como resultado final:
Algoritmo en Python
La respuesta para el procedimiento anterior realizada con Python es:
respuesta impulso: hi: [5. 3.] Matriz: [[ 1. 1. ] [ 0.8 -0.2]] Ch: [4. 1.] n>=0, hn: n n 1.0*-0.2 + 4.0*0.8 >>>
se desarrolla el algoritmo a partir de entrada cero, continuando con el cálculo iterativo de h[n] para los valores iniciales, luego determina los valores de los coeficientes de la ecuación h[n]
# Sistema LTID. Respuesta impulso # QE con raices Reales NO repetidas Lathi ejemplo 3.13 pdf271 # Lathi ejemplo 3.18 y 3.19 pdf278, # blog.espol.edu.ec/telg1001 import numpy as np import sympy as sym import matplotlib.pyplot as plt # INGRESO # coeficientes E con grado descendente QE = [1., -0.6, -0.16] PE = [5., 0, 0 ] # condiciones iniciales ascendente ...,y[-2],y[-1] inicial = [25/4, 0.] tolera = 1e-6 # casi_cero muestras = 10 # para grafica # PROCEDIMIENTO # Respuesta a ENTRADA CERO # raices, revisa numeros complejos gamma = np.roots(QE) revisaImag = np.iscomplex(gamma) escomplejo = np.sum(revisaImag) # coeficientes de ecuacion m_q = len(QE)-1 Ac = np.zeros(shape=(m_q,m_q),dtype=float) # revisa si parte compleja <tolera o casi_cero if escomplejo>0: for i in range(0,m_q,1): valorimag = np.imag(gamma[i]) if np.abs(valorimag)<tolera: gamma[i] = float(np.real(gamma[i])) sumaj = np.sum(np.abs(np.imag(gamma))) if sumaj <tolera: print(sumaj) gamma = np.real(gamma) escomplejo = 0 # revisa repetidos unicoscuenta = np.unique(gamma,return_counts=True) repetidas = np.sum(unicoscuenta[1]-1) # Respuesta impulso h[n] ki = np.arange(-m_q,m_q,1) hi = np.zeros(m_q, dtype=float) xi = np.zeros(2*m_q, dtype=float) xi[m_q] = 1 # impulso en n=0 Ah = np.zeros(shape=(m_q,m_q),dtype=float) # h[n] iterativo p_n = len(PE) for i in range(0,m_q,1): for k in range(m_q,2*m_q,1): hi[i] = hi[i] - QE[k-m_q]*hi[m_q-k+1] for k in range(0,p_n,1): hi[i] = hi[i] + PE[k]*xi[m_q+i] Bh = np.copy(hi[:m_q]) # coeficientes de ecuacion for i in range(0,m_q,1): for j in range(0,m_q,1): Ah[i,j] = gamma[j]**(i) ch = np.linalg.solve(Ah,Bh) # ecuacion hn n = sym.Symbol('n') hn = 0*n for i in range(0,m_q,1): hn = hn + ch[i]*(gamma[i]**n) # SALIDA if escomplejo == 0: print('\n respuesta impulso: ') print('Bh:',Bh) print('Matriz: ') print(Ah) print('Ch: ',ch) print('n>=0, hn: ') sym.pprint(hn) else: print(' existen raices con números complejos.') print(' usar algoritmo de la sección correspondiente.') # grafica datos ki = np.arange(-m_q,muestras,1) hi = np.zeros(muestras+m_q) if escomplejo == 0: # evaluación de h[n] h_n = sym.lambdify(n,hn) hi[m_q:] = h_n(ki[m_q:]) # grafica h[n] plt.stem(ki,hi,label='h[n]', markerfmt ='C1o', linefmt='C2--') plt.legend() plt.grid() plt.ylabel('h[n]') plt.xlabel('ki') plt.title('h[n] = '+str(hn)) plt.show()
Comentario: Aunque es relativamente simple determinar la respuesta al impulso h[n] usando el método descrito, el desarrollo del tema se realiza mejor en la unidad con Transformada z. Lathi p280.