INDICE
- Educación
- Ciencia
- Ingeniería
- Cómo trabajar y verificar la convolución Problemas integrales y de suma
Libro Relacionado
Señales y sistemas para maniquíes
Por Mark Wickert
El dominio de las integrales y sumas de la convolución se logra a través de la práctica. Aquí hay soluciones analíticas detalladas para un integral de convolución y dos problemas de suma de convolución, cada uno seguido de verificaciones numéricas detalladas, usando PyLab del shell interactivo de IPython (la versión QT en particular).
Convolución en tiempo continuo
He aquí un ejemplo integral de convolución que emplea señales de extensión semi-infinitas. Considere la convolución de x(t) = u(t) (una función de paso de unidad) y
(un decaimiento exponencial real a partir de t = 0). La figura proporciona un gráfico de las formas de onda.
Crédito: Ilustración de Mark Wickert, PhDEl
intervalo de salida de soporte es
Se necesitan dos casos (pasos) para formar la solución analítica válida en todo el eje temporal.
- Caso 1: Usando la Figura b, se puede ver claramente que para t < 0, se deduce que y(t) = 0.
- Caso 2: De nuevo mirando la Figura b, se ve que para t ≥ 0, siempre se produce algún solapamiento entre las dos señales del integrando. La salida integral de la convolución es
Uniendo las dos piezas, la solución analítica para y(t) es
Para verificar esta solución analítica, siga los mismos pasos que utilizó en el ejemplo anterior:
- Escribir una simple función Python para trazar la solución analítica: En[133]: def expo_conv(t,A,alpha): ….: y = ceros(len(t))…: para k, tk en enumerate(t):…: si tk >= 0: …[k]: y[k] = A/alpha*(1 – exp(-alpha*tk))…: return y
- Para la convolución numérica, utilice ssd.conv_integral(). Primero se escribe el código Python en la ventana de comandos para generar las señales x(t) y h(t) y luego se realiza la convolución: En[135]: t = arange(-4,14,.01)En[136]: xc2 = paso de ssd(t)En[137]: hc2 = paso de ssd(t)*exp(-1*t)En[138]: yc2_num,tyc2 = integral(xc2,t,hc2,t,(‘r’,’r’))Soporte de salida: (-8,00, +5,99)En[143]: subtrama(211)En[144]: trama(t,expo_conv(t,1,1))En[149]: subtrama(212)En[151]: trama(tyc2,yc2_num)En[156]: savefig(‘c2_outputs.pdf’)Observe que el quinto argumento de la función conv_integral es (‘r’,’r’). Los valores por defecto de (‘f’,’f’) significan soporte finito para ambas señales en los ejes de tiempo de entrada t1 y t2 dados a la función.
Una vez más, el acuerdo es excelente, por lo que se verifica la solución analítica.
Verificar la convolución en tiempo discreto
Para el caso de la convolución de tiempo discreto, aquí hay dos ejemplos de suma de convolución. El primero emplea secuencias de extensión finita (señales) y el segundo emplea señales de extensión semi-infinita. Usted encuentra ambos tipos de secuencias en la resolución de problemas, pero las secuencias de extensión finita son el punto de partida habitual cuando está trabajando por primera vez con la suma de convolución.
Dos secuencias de longitud finita
Considere la suma de convolución de las dos secuencias x[n] y h[n], mostradas aquí, junto con la configuración de la suma de convolución.
Crédito: Ilustración de Mark Wickert, PhDWhen
convolving finite duration sequences, usted puede hacer la solución analítica casi por inspección o quizás usando una tabla (incluso una hoja de cálculo) para organizar los valores de secuencia para cada valor de n, lo que produce una superposición distinta de cero entre h[k] y x[n – k].
El intervalo de soporte para la salida sigue la regla dada para el dominio de tiempo continuo. La salida y[n] comienza en la suma de los dos puntos de inicio de la secuencia de entrada y termina en la suma de los puntos finales de la secuencia de entrada. Para el problema en cuestión esto corresponde a y[n] comenzando en[0 + -1] = -1 y terminando en[3 + 1] = 4.
Mirando la Figura b, puedes ver que a medida que n aumenta de n
Crédito: Ilustración de Mark Wickert, PhDPara
verificar estos valores de cálculo manual (hoja de cálculo), utilice las funciones Python en ssd.py para realizar la suma de convolución. La función de suma de convolución es y, ny = ssd.conv_suma(x1, nx1, x2, nx2, extent=(‘f’, ‘f’)).
En[208]: n = arange(-4,6)En[209]: xd1 = 2*ssd.drect(n,4)En[210]: hd1 = 1,5*ssd.dimpulse(n) - 0,5*ssd.drect(n+1,3)En[211]: yd1_num, nd1 = ssd.conv_sum(xd1,n,n,hd1,n)Soporte de salida: (-8, +10)En[212]: tallo(nd1,yd1_num)
Vea la secuencia de salida de resultados numéricos graficada.
Crédito: Ilustración de Mark Wickert, PhDLos
resultados del cálculo numérico corresponden al cálculo manual.
Una secuencia finita y otra semi-infinita
Como segundo ejemplo de trabajo con la convolución considerar una secuencia de pulsos de duración finita de 2M + 1 puntos conviviendo con la secuencia exponencial semi-infinita anu[n] (un decaimiento exponencial real a partir de n = 0). Aquí se muestra un gráfico de las formas de onda.
Crédito: Ilustración por Mark Wickert, PhDWith con la
ayuda de la Figura b, usted tiene tres casos a considerar en la evaluación de la convolución para todos los valores de n. El intervalo de apoyo para la convolución es
Aquí están los pasos para cada caso:
- Caso 1: De la Figura b, se ve que para n + M < 0 o n < -M no se produce solapamiento entre las dos secuencias de la suma, por lo que y[n] = 0.
- Caso 2: La superposición parcial entre las dos secuencias ocurre cuando n + M ≥ 0 y n – M ≤ 0 o -M ≤ n ≤ M. La suma de los límites comienza en k = 0 y termina en k = n + M. Usando la fórmula de suma de series geométricas finitas, la suma de convolución se evalúa a
- Caso 3: La superposición total ocurre cuando n – M > 0 o n > M. La suma de los límites en este caso va de k = n – M a k = n + M. Una vez más, usando la fórmula de suma de series geométricas finitas, la suma de convolución se evalúa a
Juntando las piezas, la solución analítica completa para este problema es
Para comparar la solución analítica con la solución numérica, siga los pasos de trazar la función analítica contra un gráfico de la suma de convolución real:
- Escribe una función Python para evaluar y[n] como una función por partes: En[239]: def expo_pulse_conv(n,a,M): ….: y = ceros(len(n)) …: para k, nk en enumerate(n): .
s
- i nk >= -M y nk <= M: ….: y[k] = 2*(1 – a**(nk+M+1))/(1 – a) …: elif nk > M: …: y[k] = 2*(a**(nk-M) – a**(nk+M+1))/(1 – a) …: return y
- Encuentra la suma de convolución real usando la función conv_sum() y luego grafica los resultados: En[255]: n = arange(-5,30) # n valores para x[n] y h[n]En[256]: xd2 = 2*ssd.
d
- rect(n+4,9) # create x[n]En[257]: hd2 = ssd.dstep(n)*0.6**n # create h[n]En[258]: yd2_num,nd2 = ssd.conv_sum(xd2,n,hd2,n,(‘f’,’r’))Soporte de salida: (-10, +24)En[259]: subtrama(211)En[260]: stem(n,expo_pulse_conv(n,0.6,4)) # analyticalIn[265]: subplot(212) En[266]: stem(nd2,yd2_num) # numérico En[271]: savefig(‘d2_outputs.pdf’) Utilice el quinto argumento de la función conv_sum() para declarar el alcance de la segunda secuencia de entrada a derecha (‘r’), a diferencia del valor por defecto de finito (‘f’). Esta configuración garantiza que la función no devuelva resultados no válidos Crédito: Ilustración de Mark Wickert, PhD
Aquí, usted ve que la solución analítica por partes se compara favorablemente con el cálculo numérico de la suma de la convolución directa.