{"id":17809,"date":"2017-07-20T10:00:57","date_gmt":"2017-07-20T15:00:57","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1001\/?p=355"},"modified":"2026-02-01T16:31:28","modified_gmt":"2026-02-01T21:31:28","slug":"lti-dt-convolucion-sumas-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-u06\/lti-dt-convolucion-sumas-python\/","title":{"rendered":"6.6 LTI DT - Convoluci\u00f3n de sumas con Python"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">convoluci\u00f3n sumas<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplo\">ejemplo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"concepto\">1. Convoluci\u00f3n de sumas<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong>: <\/em>Lathi 3.8 p282, Oppenheim 2.1.2 p77 pdf108, Hsu 2.6.C p62<\/p>\n\n\n\n<p>Una se\u00f1al discreta de entrada x[n] se representa como una superposici\u00f3n de versiones escaladas de un conjunto de impulsos unitarios desplazados \u03b4[n-k], cada uno con valor diferente de cero en un solo punto en el tiempo, especificado por el valor de k.<\/p>\n\n\n\n<p>La respuesta de un sistema lineal y[n] a x[n] es la superposici\u00f3n de las respuestas escaladas del sistema a cada uno de estos impulsos desplazados.<\/p>\n\n\n\n<p>Si usamos h<sub>k<\/sub>[n] como la respuesta del sistema lineal al impulso unitario desplazado por \u03b4[n-k]. La respuesta y[n] del sistema lineal a la entrada x[n] en la ecuaci\u00f3n ser\u00e1 la combinaci\u00f3n lineal ponderada de las respuesta b\u00e1sicas.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">y[n] = \\sum_{k=-\\infty}^{+\\infty} x[k]h_{k}[n] <\/span>\n\n\n\n<p>Si se conoce la respuesta de un sistema lineal al conjunto de impulsos unitarios desplazados, podemos construir una respuesta a una entrada arbitraria.<\/p>\n\n\n\n<p>Si el sistema lineal tambi\u00e9n es invariante en el tiempo, entonces estas respuestas a impulsos unitarios desplazados en el tiempo son todas las versiones desplazadas en el tiempo unas de otras.<\/p>\n\n\n\n<p>h[n] es la salida del sistema LTI cuando \u03b4[n] es la entrada. Entonces para un sistema LTI la ecuaci\u00f3n se vuelve.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">y[n] = \\sum_{k=-\\infty}^{+\\infty} x[k]h[n-k] <\/span>\n\n\n\n<p>El resultado se conoce como la \"<strong>convoluci\u00f3n de suma<\/strong>\" o \"suma de superposici\u00f3n\" y la operaci\u00f3n miembro derecho de la ecuaci\u00f3n se llama convoluci\u00f3n de las secuencias x[n] y h[n] que se representa de manera simb\u00f3lica como:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">y[n] = x[n]*h[n] <\/span>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">convoluci\u00f3n sumas<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplo\">ejemplo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ejemplo\">2. Ejemplo<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Openheim Ejemplo 2.4 p85 pdf116<\/p>\n\n\n\n<p>Considere una entrada x[n] y una respuesta al impulso unitario h[n] dada por:<\/p>\n\n\n\n<p class=\"has-text-align-center\">x[n] = (u[n]-u[n-5])<br>h[n] = \u03b1<sup>n<\/sup> (u[n]-u[n-7])<\/p>\n\n\n\n<p>con \u03b1&gt;1.&nbsp; Para el ejercicio, \u03b1=1.5.<\/p>\n\n\n\n<p><em>Nota<\/em>: Para el algoritmo, si \u03b1 es un entero, por ejemplo 2, usar \u03b1=2.0, para que la operaci\u00f3n potencia se realice con n\u00fameros reales, como entero se puede saturar y dar error.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p>Al aplicar la suma de convoluci\u00f3n obtiene:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"550\" height=\"461\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/ConvolucionSuma01.png\" alt=\"Convoluci\u00f3n Suma 01 gr\u00e1fica\" class=\"wp-image-20475\" \/><\/figure>\n\n\n\n<p>Para aplicar el algoritmo se requiere definir u[n], por ser parte de las funciones x[n] y h[n]. Dado que la operaci\u00f3n requiere valores fuera del rango muestreado para n, la secci\u00f3n suma convoluci\u00f3n utiliza las funciones en lugar de los vectores xi, hi.<\/p>\n\n\n\n<p>La funci\u00f3n est\u00e1 definida en un intervalo sim\u00e9trico, por lo que el rango de trabajo [a,b] se mantiene de la forma [-b,b] en el algoritmo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">convoluci\u00f3n sumas<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplo\">ejemplo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"algoritmo\">3. Algoritmo en Python<\/h2>\n\n\n\n<p>El resultado con el algoritmo es:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>ni: &#091;-15 -14 -13 -12 -11 -10  -9  -8  -7  -6  -5  -4  -3  -2  -1   0   1   2\n   3   4   5   6   7   8   9  10  11  12  13  14  15]\nxi: &#091;0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]\nhi: &#091; 0.        0.        0.        0.        0.        0.        0.\n      0.        0.        0.        0.        0.        0.        0.\n      0.        1.        1.5       2.25      3.375     5.0625    7.59375\n     11.390625  0.        0.        0.        0.        0.        0.\n      0.        0.        0.      ]\nyi: &#091; 0.        0.        0.        0.        0.        0.        0.\n      0.        0.        0.        0.        0.        0.        0.\n      0.        1.        2.5       4.75      8.125    13.1875   19.78125\n     29.671875 27.421875 24.046875 18.984375 11.390625  0.        0.\n      0.        0.        0.      ]<\/code><\/pre>\n\n\n\n<p>instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Respuesta a impulsos - forma discreta\n# Ejemplo Oppenheim Ejemplo 2.3 p83\/pdf111\nimport numpy as np\n\n# INGRESO\n# Rango &#x5B;a,b], sim\u00e9trico a 0\nb = 15 ; a = -b\n\nalfa = 1.5\nu = lambda n: np.piecewise(n,n&gt;=0,&#x5B;1,0])\n\nx = lambda n: u(n)-u(n-5)\nh = lambda n: (alfa**n)*(u(n)-u(n-7))\n\n\n# PROCEDIMIENTO\nni = np.arange(a,b+1,1)\nxi = x(ni)\nhi = h(ni)\n\n# Suma de Convolucion x&#x5B;n]*h&#x5B;n]\nmuestras = len(xi)\nyi = np.zeros(muestras, dtype=float)\nfor i in range(0,muestras):\n    suma = 0\n    for k in range(0,muestras):\n        suma = suma + x(ni&#x5B;k])*h(ni&#x5B;i]-ni&#x5B;k])\n    yi&#x5B;i] = suma\n\n# yi = np.convolve(xi,hi,'same')\n\n# SALIDA\nprint('ni:',ni)\nprint('xi:',xi)\nprint('hi:',hi)\nprint('yi:',yi)\n<\/pre><\/div>\n\n\n<p>La suma convoluci\u00f3n se encuentra tambi\u00e9n disponible con Numpy en <code>np.convolve()<\/code>, la&nbsp; secci\u00f3n de suma convoluci\u00f3n se puede reemplazar y obtener los mismos resultados. Considere que para \u00e9ste caso se usan los vectores xi y hi.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yi = np.convolve(xi,hi,'same')<\/code><\/pre>\n\n\n\n<p>el algoritmo se puede aplicar a otros ejercicios para comprobar los resultados.<\/p>\n\n\n\n<p>Contin\u00fae con el ejercicio 2.5 del libro.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">convoluci\u00f3n sumas<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplo\">ejemplo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"grafica\">4. Gr\u00e1fica en Python<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# SALIDA - GRAFICA\nimport matplotlib.pyplot as plt\nplt.figure(1)\nplt.suptitle('Suma de Convoluci\u00f3n x&#x5B;n]*h&#x5B;n]')\n\nplt.subplot(311)\nplt.stem(ni,xi, linefmt='b--',\n         markerfmt='bo',basefmt='k-')\nplt.ylabel('x&#x5B;n]')\n\nplt.subplot(312)\nplt.stem(ni,hi, linefmt='b--',\n         markerfmt='ro',basefmt='k-')\nplt.ylabel('h&#x5B;n]')\n\nplt.subplot(313)\nplt.stem(ni,yi, linefmt='g-.',\n         markerfmt='mo', basefmt='k-')\n\nplt.ylabel('x&#x5B;n]*h&#x5B;n]')\nplt.xlabel('n')\n\nplt.show()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">convoluci\u00f3n sumas<\/a><\/p>\n\n\n\n<p><a href=\"#ejemplo\">ejemplo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>convoluci\u00f3n sumas ejemplo algoritmo gr\u00e1fica 1. Convoluci\u00f3n de sumas Referencia: Lathi 3.8 p282, Oppenheim 2.1.2 p77 pdf108, Hsu 2.6.C p62 Una se\u00f1al discreta de entrada x[n] se representa como una superposici\u00f3n de versiones escaladas de un conjunto de impulsos unitarios desplazados \u03b4[n-k], cada uno con valor diferente de cero en un solo punto en el [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-ss-unidades","format":"standard","meta":{"footnotes":""},"categories":[176],"tags":[],"class_list":["post-17809","post","type-post","status-publish","format-standard","hentry","category-ss-u06"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/17809","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/comments?post=17809"}],"version-history":[{"count":5,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/17809\/revisions"}],"predecessor-version":[{"id":20759,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/17809\/revisions\/20759"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=17809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=17809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=17809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}