{"id":18270,"date":"2024-10-27T11:48:34","date_gmt":"2024-10-27T16:48:34","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1034\/?p=565"},"modified":"2026-03-27T21:23:20","modified_gmt":"2026-03-28T02:23:20","slug":"interpolacion-con-pulso-triangular","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/interpolacion-con-pulso-triangular\/","title":{"rendered":"2.6 D-to-C - Interpolaci\u00f3n con pulso triangular"},"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>interpola <a href=\"#concepto\">tri\u00e1ngulo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p>gr\u00e1fica <a href=\"#graficainteractiva\">interactiva<\/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. Interpolaci\u00f3n Lineal<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 4-3.3 p143<\/p>\n\n\n\n<p>La interpolaci\u00f3n lineal, con pulso triangular, o polinomio de primer orden consiste en los segmentos de l\u00ednea:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p(t) = \\begin{cases} 1-\\frac{|t|}{Ts} &amp; -T_s \\leq t \\leq -\\frac{1}{2} T_s \\\\ 0 &amp; otro caso \\end{cases} <\/span>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/pulsoTriangular01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"614\" height=\"505\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/pulsoTriangular01.png\" alt=\"pulso Triangular 01\" class=\"wp-image-601\" \/><\/a><\/figure>\n\n\n\n<p>El <strong><em>ancho<\/em><\/strong> del <em>pulso<\/em> es de dos <em>veces<\/em> el periodo de muestreo <strong>T<\/strong>s, lo que causa que los pulsos se superpongan entre muestras. El resultado de la interpolaci\u00f3n de varios impulsos requiere que se sumen las partes superpuestas, situaci\u00f3n a considerar en la variable tiempo t del resultado y que se resume en la funci\u00f3n <code>pulso_ti()<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Algoritmo en Python para un pulso triangular<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# D-to-C, Interpolacion con pulso triangular\n# ejemplo 4.3.3 p143\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# INGRESO\nfs = 200  # Hz muestreo\nfs_veces = 10 # suavizar x(t), sobremuestreo\ntitulo = 'pulso triangular'\nnT = 2.0  # graficar periodos de la se\u00f1al\n\n# pulso triangular\npulso_causal = True # No causal, pulso centrado en cero\n\n# PROCEDIMIENTO\nTs = 1\/fs # muestreo periodo\n# https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-unidades\/ss-u01\/senales-escalon-e-impulso\/\n#u = lambda t: np.piecewise(t,t&gt;=0,&#x5B;1,0])\nu = lambda t: np.heaviside(t,1)\n# pulso triangular\nu1 = lambda t: u(t+Ts)\nu2 = lambda t: u(t-Ts)\ntriangular = lambda t: (1-abs(t)\/Ts)*(u1(t) - u2(t))             \npulso_ancho = 2\n\n# x&#x5B;n] interpolacion en Ts, a muestreo fs\nTs = 1\/fs ; dtc = Ts\/fs_veces\nt_unpulso = np.arange(-Ts*nT,Ts*nT+dtc,dtc)\nunpulso = triangular(t_unpulso)\n\n# SALIDA\nprint('muestras:',len(t_unpulso))\nprint('t_unpulso:',t_unpulso)\n\n# GRAFICA de un pulso\n# p(t) componentes\nplt.plot(t_unpulso,unpulso, color='green',linestyle='dashed',\n         label='p_tri(t)')\nplt.axvline(-Ts,color='red',linestyle='dotted')\nplt.axvline(Ts,color='red',linestyle='dotted')\nplt.stem(&#x5B;0],&#x5B;1],linefmt = 'C1:', label='xn&#x5B;0]')\nplt.axhline(0,color='Black')\n\n# grafica entorno\nplt.xlabel('t')\nplt.ylabel('amplitud')\ntexto = titulo + ' ; fs='+str(fs)\ntexto = texto +' ; Ts='+str(1\/fs)\nplt.title(texto)\nplt.grid()\nplt.legend()\n\nplt.tight_layout()\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>interpola <a href=\"#concepto\">tri\u00e1ngulo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p>gr\u00e1fica <a href=\"#graficainteractiva\">interactiva<\/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=\"ejercicio\">2. Ejercicio con se\u00f1al Senoidal y pulsos triangular<\/h2>\n\n\n\n<p>La se\u00f1al x(t) tipo cosenoidal con <strong>f<\/strong><sub>0<\/sub>=83 Hz y de amplitud unitaria,&nbsp; se convierte a muestras discretas con frecuencia <strong>f<\/strong><sub>s<\/sub>=200 Hz.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x(t) = \\cos(2\\pi (83)t) <\/span>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoTriangular_animate.gif\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoTriangular_animate.gif\" alt=\"interpola Pulso Triangular animate\" class=\"wp-image-607\" \/><\/a><\/figure>\n\n\n\n<p>Cada pulso triangular aplicado en una muestra se superpone al siguiente aplicado en la muestra n<strong>T<\/strong>s.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoTriangular01.png\" alt=\"interpola Pulso Triangular 01\" class=\"wp-image-20612\" \/><\/figure>\n\n\n\n<p>En la reconstrucci\u00f3n para el vector tiempo t_pulsos, se debe considerar que el primer pulso empieza antes que el valor de la muestra, por lo que la se\u00f1al presenta un retraso de mitad de pulso.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"330\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoTriangular02.png\" alt=\"interpola Pulso Triangular 02\" class=\"wp-image-20613\" \/><\/figure>\n\n\n\n<p>En este caso, como el ancho del pulso es 2Ts, la se\u00f1al resultante se atrasa Ts com se muestra en la gr\u00e1fica.<\/p>\n\n\n\n<p>La funci\u00f3n <code><span style=\"color: #0000e6\">pulso_ti()<\/span><\/code> construye el vector de tiempo considerando <strong>ancho<\/strong> del pulso y el n\u00famero de <strong>muestras<\/strong> x[n]. El inicio del vector tiempo tambi\u00e9n considera si el <a href=\"https:\/\/blog.espol.edu.ec\/telg1001\/sistemas-causales-y-no-causales\/\">sistema es causal<\/a> al aplicar el atraso a la unidad de tiempo, pues la reconstrucci\u00f3n empieza en el tiempo cero para las se\u00f1ales en tiempo real.<\/p>\n\n\n\n<p>El vector tiempo tambi\u00e9n debe considerar la frecuencia de muestreo <strong>f<\/strong>s y para la gr\u00e1fica el sobre-muestreo <strong>f<\/strong>s_veces. Al final se observa que la se\u00f1al reconstruida tiene una duraci\u00f3n adicional al tiempo de la \u00faltima muestra, por lo que se a\u00f1ade una duraci\u00f3n de mitad de pulso al extremo final. El efecto se observa en la se\u00f1al <code>x(t)_pulsos<\/code>.<\/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>interpola <a href=\"#concepto\">tri\u00e1ngulo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p>gr\u00e1fica <a href=\"#graficainteractiva\">interactiva<\/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 Interpola con pulso triangular<\/h2>\n\n\n\n<p>En la reconstrucci\u00f3n de la se\u00f1al x(t) usando pulsos, se realiza un proceso semejante al aplicado en&nbsp;<code><span style=\"color: #0000e6\">pulso_ti()<\/span><\/code> , en las partes que se superponen los impulsos se suman para dar un resultado de interpolaci\u00f3n lineal de rectas que unen los valores de las muestras.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# D-to-C, Interpolacion con pulso triangular\n# ejemplo 4.3.3 p143\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# INGRESO\n# se\u00f1al x(t)\nf0 = 83   # frecuencia de senal\nfase0 = 0 # &#x5B;0,2*np.pi]\nxt = lambda t: np.cos(2*np.pi*f0*t + fase0)\n\nfs = 200  # Hz muestreo\nfs_veces = 20 # suavizar x(t), sobremuestreo\nnT = 2.4  # graficar periodos de la se\u00f1al\n\ntitulo = 'pulso triangular'\n# pulso triangular\npulso_causal = True # No causal, pulso centrado en cero\npulso_ancho = 2\n\ncasicero = 1e-10 # cero para valores menores\n\n# PROCEDIMIENTO\nTs = 1\/fs # tama\u00f1o de paso con fs\nT =  1\/f0 # periodo de se\u00f1al\ndtc = Ts\/fs_veces # suavizar x(t), sobremuestreo\n\n# muestreo x(t)\nti = np.arange(0,nT*T+dtc,dtc)\nxti = xt(ti)\nti_max = max(ti)\n\n# muestreo x&#x5B;n]\nmuestras_n = 2\nif ti_max&gt;=Ts: # varias muestras\n    muestras_n = int(ti_max\/Ts)+1\nki  = np.arange(0,muestras_n,1,dtype=int)\ntki = ki*Ts # muestras x&#x5B;n]\nxki = xt(tki)\ntkj = tki   # x&#x5B;n] alias0\nti_0 = ti   # No Causal, pulso centrado en cero\nif pulso_causal: # Causal\n    tkj = tki + Ts*pulso_ancho\/2 \n    ti_0 = ti + Ts*pulso_ancho\/2\nxti_0 = xti\n\ndef pulso_ti(muestras_n,fs,fs_veces,ancho=1,causal=True):\n    ''' tiempos para las n muestras x(t) con pulsos a frecuencia fs.\n    Para suavizar el pulso se usa fs_veces para el sobremuestreo.\n    El ancho del pulso es veces el periodo de muestreo (1\/Ts)\n    Si es causal el tiempo inicia en t=0, centrado en cero.\n    Si no es causal el tiempo inicia t en mitad de intervalo.\n    '''\n    Ts = 1\/fs # muestreo periodo\n    dtc = Ts\/fs_veces # suavizar pulso(t), sobremuestreo\n    t_Ts = np.arange(0,Ts,dtc) # tiempo en periodo Ts sobremuestreado\n    \n    mitad = Ts*ancho\/2\n    t_mitad = np.arange(0,mitad,dtc)\n    t_pulsos = np.copy(t_mitad) # mitad de primer pulso\n    for i in range(1,muestras_n,1):\n        t_pulsos = np.concatenate((t_pulsos,t_Ts + t_pulsos&#x5B;-1]+dtc))\n    # mitad de \u00faltimo pulso para muestra_n\n    t_pulsos = np.concatenate((t_pulsos,t_mitad + t_pulsos&#x5B;-1]+dtc))\n\n    # https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-unidades\/ss-u02\/sistemas-causales-y-no-causales\/\n    if causal == False: # centrado en cero\n        t_pulsos = t_pulsos - mitad\n    return(t_pulsos)\n\n# x&#x5B;n] interpolacion en Ts, a muestreo fs\nt_pulsos = pulso_ti(muestras_n,fs,fs_veces,\n                    pulso_ancho,pulso_causal)\n\n#https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-unidades\/ss-u01\/senales-escalon-e-impulso\/\n#u = lambda t: np.piecewise(t,t&gt;=0,&#x5B;1,0])\nu = lambda t: np.heaviside(t,1)\n# pulso triangular\nu1 = lambda t: u(t+Ts*pulso_ancho\/2)\nu2 = lambda t: u(t-Ts*pulso_ancho\/2)\ntriangular = lambda t: (1-abs(t)*fs)*(u1(t) - u2(t))             \n\n# unpulso muestreo\nt_unpulso = pulso_ti(1,fs,fs_veces,\n                     pulso_ancho,pulso_causal)\nt_pulsoEval= t_unpulso\nif pulso_causal:\n    t_pulsoEval = t_unpulso-Ts*pulso_ancho\/2\nunpulso = triangular(t_pulsoEval)\nmuestras_pulso = len(t_unpulso)\n\nmuestras_N = len(xki)\nmitad_pulso = int(muestras_pulso\/2)\npulsos_vacio = np.zeros(len(t_pulsos),dtype=float)\nxn_pulsos = np.copy(pulsos_vacio)\nxk_pulsos = &#x5B;]\nfor j in range(0,muestras_N,1): # x(t) pulsos\n    k0 = int(j*fs_veces)\n    kn = k0 + muestras_pulso\n    pulsoj = np.copy(pulsos_vacio)\n    pulsoj&#x5B;k0:kn]= pulsoj&#x5B;k0:kn] + unpulso*xki&#x5B;j]\n    xk_pulsos.append(pulsoj)\n    xn_pulsos = xn_pulsos+pulsoj\n\n    \n# SALIDA\nprint('muestras_pulso:',muestras_pulso)\nprint('t_unpulso:',t_unpulso)\nprint('muestras_tiempo:',len(t_pulsos))\n\n# GRAFICAS ----------------------------\nfig, &#x5B;graf_t,graf_n] = plt.subplots(2,1)\n\n# x(t) grafico entorno\nt_causal = 0\nif pulso_causal:\n    t_causal = Ts*pulso_ancho\/2\ngraf_t.axhline(0,color='black')\ngraf_t.axvline(0,color='black')\ngraf_t.set_xlabel('t')\ngraf_t.set_ylabel('amplitud')\ngraf_t.set_xlim(&#x5B;t_pulsos&#x5B;0]-t_causal,\n                 t_pulsos&#x5B;-1]-t_causal])\ngraf_t.grid()\ntexto = titulo + ' ; f0='+str(f0)\ntexto = texto + ' ; fs='+str(fs)\ntexto = texto + ' ; causal:'+str(pulso_causal)\ngraf_t.set_title(texto)\n# x(t) componentes\ngraf_t.plot(ti,xti,label='x(t)')\ngraf_t.stem(tki,xki,label='x&#x5B;n]',linefmt = 'C1:')\nfor i in range(0,muestras_N,1):\n    graf_t.plot(t_pulsos-t_causal,xk_pulsos&#x5B;i],\n                linestyle='dashed')\ngraf_t.legend()\n\n# x&#x5B;n] grafico entorno\ngraf_n.axhline(0,color='black')\ngraf_n.axvline(0,color='black')\ngraf_n.set_xlabel('t')\ngraf_n.set_ylabel('amplitud')\ngraf_n.set_xlim(&#x5B;t_pulsos&#x5B;0],t_pulsos&#x5B;-1]])\ngraf_n.grid()\n# x&#x5B;n] componentes\ngraf_n.plot(ti_0,xti_0,linestyle='dotted',\n            label='x(t)')\ngraf_n.stem(tkj,xki,label='x&#x5B;n]',linefmt = 'C1:')\ngraf_n.plot(t_pulsos,xn_pulsos,\n            label='x(t) pulso',\n            lw=2, color='orange')\n\ngraf_n.legend()\nplt.tight_layout()\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>interpola <a href=\"#concepto\">tri\u00e1ngulo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p>gr\u00e1fica <a href=\"#graficainteractiva\">interactiva<\/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=\"graficainteractiva\">4.&nbsp;Algoritmo en Python para gr\u00e1fico interactivo con fs<\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoTriangular_animate.gif\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoTriangular_animate.gif\" alt=\"interpola Pulso Triangular animate\" class=\"wp-image-607\" \/><\/a><\/figure>\n\n\n\n<p>Las instrucciones en Python son semejantes al caso con pulso rectangular.<br>Para dibujar cada pulso, se usa un objeto de l\u00edneas agrupadas o <code>LineCollection()<\/code> que permite actualizar las lineas al actualizar la <strong>tabla<\/strong>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# D-to-C, Interpolacion con pulso triangular\n# grafico interactivo\n# ejemplo 4.3.3 p143\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# INGRESO\n# se\u00f1al x(t)\nf0 = 83   # frecuencia de senal\nfase0 = 0 # &#x5B;0,2*np.pi]\nxt = lambda t: np.cos(2*np.pi*f0*t + fase0)\n\nfs = 200  # Hz muestreo\nfs_veces = 20 # suavizar x(t), sobremuestreo\nnT = 2.4  # graficar periodos de la se\u00f1al\n\ntitulo = 'pulso triangular'\n# pulso triangular\npulso_causal = True # No causal, pulso centrado en cero\npulso_ancho = 2\n\ncasicero = 1e-10 # cero para valores menores\n\n# PROCEDIMIENTO\nTs = 1\/fs # tama\u00f1o de paso con fs\nT =  1\/f0 # periodo de se\u00f1al\ndtc = Ts\/fs_veces # suavizar x(t), sobremuestreo\n\ndef xt_actualiza(xt,f0,fs,fs_veces,nT,\n                 pulso_ancho=1,pulso_causal=True):\n    ''' x(t) muestreada a fs, para nT periodos de x(t).\n    gr\u00e1fica suavizada con fs_veces. No causal, pulso centrado en cero.\n    Causal el pulso inicia en t=0.\n    '''\n    Ts = 1\/fs # tama\u00f1o de paso con fs\n    T =  1\/f0 # periodo de se\u00f1al\n    dtc = Ts\/fs_veces # suavizar x(t), sobremuestreo\n    \n    # muestreo x(t)\n    ti = np.arange(0,nT*T+dtc,dtc)\n    xti = xt(ti)\n    ti_max = max(ti)\n\n    # muestreo x&#x5B;n]\n    muestras_n = 2\n    if ti_max&gt;=Ts: # varias muestras\n        muestras_n = int(ti_max\/Ts)+1\n    ki  = np.arange(0,muestras_n,1,dtype=int)\n    tki = ki*Ts # muestras x&#x5B;n]\n    xki = xt(tki)\n    tkj = tki   # x&#x5B;n] alias0\n    ti_0 = ti   # No Causal, pulso centrado en cero\n    if pulso_causal: # Causal\n        tkj = tki + Ts*pulso_ancho\/2 \n        ti_0 = ti + Ts*pulso_ancho\/2\n    xti_0 = xti\n    return(ti,xti,tki,xki,tkj,ti_0,xti_0)\n\nxt_list = xt_actualiza(xt,f0,fs,fs_veces,nT,\n                       pulso_ancho,pulso_causal)\n&#x5B;ti,xti,tki,xki,tkj,ti_0,xti_0] = xt_list # x(t),x&#x5B;n],x(t)_alias0\nmuestras_n = len(tki)\n\ndef pulso_ti(muestras_n,fs,fs_veces,ancho=1,causal=True):\n    ''' tiempos para las n muestras x(t) con pulsos a frecuencia fs.\n    Para suavizar el pulso se usa fs_veces para el sobremuestreo.\n    El ancho del pulso es veces el periodo de muestreo (1\/Ts)\n    Si es causal el tiempo inicia en t=0, centrado en cero.\n    Si no es causal el tiempo inicia t en mitad de intervalo.\n    '''\n    Ts = 1\/fs # muestreo periodo\n    dtc = Ts\/fs_veces # suavizar pulso(t), sobremuestreo\n    t_Ts = np.arange(0,Ts,dtc) # tiempo en periodo Ts sobremuestreado\n    \n    mitad = Ts*ancho\/2\n    t_mitad = np.arange(0,mitad,dtc)\n    t_pulsos = np.copy(t_mitad) # mitad de primer pulso\n    for i in range(1,muestras_n,1):\n        t_pulsos = np.concatenate((t_pulsos,t_Ts + t_pulsos&#x5B;-1]+dtc))\n    # mitad de \u00faltimo pulso para muestra_n\n    t_pulsos = np.concatenate((t_pulsos,t_mitad + t_pulsos&#x5B;-1]+dtc))\n\n    # https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-unidades\/ss-u02\/sistemas-causales-y-no-causales\/\n    if causal == False: # centrado en cero\n        t_pulsos = t_pulsos - mitad\n    return(t_pulsos)\n\ndef xn_actualiza(fs,fs_veces,xki,\n                 pulso_ancho=1,pulso_causal=True):\n    Ts = 1\/fs # tama\u00f1o de paso con fs\n    T =  1\/f0 # periodo de se\u00f1al\n    dtc = Ts\/fs_veces # suavizar x(t), sobremuestreo\n    \n    # https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-unidades\/ss-u01\/senales-escalon-e-impulso\/\n    #u = lambda t: np.piecewise(t,t&gt;=0,&#x5B;1,0])\n    u = lambda t: np.heaviside(t,1)\n    # pulso triangular\n    u1 = lambda t: u(t+Ts*pulso_ancho\/2)\n    u2 = lambda t: u(t-Ts*pulso_ancho\/2)\n    triangular = lambda t: (1-abs(t)*fs)*(u1(t) - u2(t))             \n\n    # x&#x5B;n] interpolacion en Ts, a muestreo fs\n    muestras_n = len(xki)\n    t_pulsos = pulso_ti(muestras_n,fs,fs_veces,\n                    pulso_ancho,pulso_causal)\n    \n    # unpulso muestreo\n    t_unpulso = pulso_ti(1,fs,fs_veces,\n                         pulso_ancho,pulso_causal)\n    t_pulsoEval= t_unpulso\n    if pulso_causal:\n        t_pulsoEval = t_unpulso-Ts*pulso_ancho\/2\n    unpulso = triangular(t_pulsoEval)\n    muestras_pulso = len(t_unpulso)\n\n    muestras_N = len(xki)\n    mitad_pulso = int(muestras_pulso\/2)\n    pulsos_vacio = np.zeros(len(t_pulsos),dtype=float)\n    xn_pulsos = np.copy(pulsos_vacio)\n    xk_pulsos = &#x5B;]\n    for j in range(0,muestras_N,1): # x(t) pulsos\n        k0 = int(j*fs_veces)\n        kn = k0 + muestras_pulso\n        pulsoj = np.copy(pulsos_vacio)\n        pulsoj&#x5B;k0:kn]= pulsoj&#x5B;k0:kn] + unpulso*xki&#x5B;j]\n        xk_pulsos.append(pulsoj)\n        xn_pulsos = xn_pulsos+pulsoj\n        \n    return(t_pulsos,xn_pulsos,t_unpulso,unpulso,xk_pulsos)\n\nxn_list = xn_actualiza(fs,fs_veces,xki,\n                       pulso_ancho,pulso_causal)\n&#x5B;t_pulsos,x_pulsos,t_unpulso,unpulso,xk_pulsos] = xn_list # x&#x5B;n]\n    \n# SALIDA\nprint('fs:',fs,'Hz ; Ts:',Ts,' s')\nprint('pulso_causal:',pulso_causal)\nprint('muestras_pulso:',len(t_unpulso))\nprint('t_unpulso:',t_unpulso)\nprint('muestras_tiempo:',len(t_pulsos))\n\n# GRAFICAS  interactivas----------------------------\nfrom matplotlib.widgets import Slider, Button, TextBox\nfrom matplotlib.collections import LineCollection\nimport telg1034 as dsp\ncolores = &#x5B;&quot;blue&quot;, &quot;orange&quot;, &quot;green&quot;, &quot;red&quot;, &quot;purple&quot;, &quot;brown&quot;]\n\nfig, &#x5B;graf_t,graf_n] = plt.subplots(2,1)\n\nt_causal = 0\nif pulso_causal:\n    t_causal = Ts*pulso_ancho\/2\n# lineas de cada pulso\nmuestras_n = len(tki)\ntabla = &#x5B;]\nfor j in range(0,muestras_n,1):\n    pulsoj = np.concatenate((&#x5B;t_pulsos-t_causal],&#x5B;xk_pulsos&#x5B;j]]),axis=0)\n    pulsoj = np.transpose(pulsoj)\n    tabla.append(pulsoj)\nprint('tama\u00f1otabla',np.shape(tabla))\n\nlinea_pulsosk = LineCollection(tabla,color=colores,\n                               linestyles='dashed')\nlinea_pulsosk.set_array(t_pulsos)\ngraf_t.add_collection(linea_pulsosk)\n    \n# x(t) grafico entorno\ngraf_t.axhline(0,color='black')\ngraf_t.set_xlabel('t')\ngraf_t.grid()\ntexto = titulo + ' ; f0='+str(f0)\ntexto = texto +' ; fs='+str(fs)\ngraf_t.set_title(texto)\ngraf_t.set_xlim(&#x5B;t_pulsos&#x5B;0]-t_causal,t_pulsos&#x5B;-1]-t_causal])\n# x(t) componentes\nlinea_xt, = graf_t.plot(ti,xti,label='x(t)')\npuntos_xn = graf_t.stem(tki,xki,label='x&#x5B;n]',linefmt = 'C1:')\n#linea_pulso, = graf_t.plot(t_unpulso-t_causal,unpulso,\n#                           label='pulso',linestyle='dashed',lw=2)\ngraf_t.legend()\n\n# x&#x5B;n] grafico entorno\ngraf_n.axhline(0,color='black')\ngraf_n.set_xlabel('t_n')\ngraf_n.grid()\n# x&#x5B;n] componentes\nlinea_xt0, = graf_n.plot(ti_0,xti_0,linestyle='dotted',\n                         label='x(t)')\npuntos_xki = graf_n.stem(tkj,xki,linefmt = 'C1:') #, label='x&#x5B;n]')\nlinea_x_pulsos, = graf_n.plot(t_pulsos,x_pulsos,label='x(t) pulsos')\ngraf_n.set_xlim(&#x5B;t_pulsos&#x5B;0],t_pulsos&#x5B;-1]])\ngraf_n.legend()\n\nplt.tight_layout()\n# plt.show()\n\n# grafica interactiva\nplt.subplots_adjust(bottom=0.25) # espacio widgets\n\n# slider: barras para valores \n# amplitud slider &#x5B;x,y,ancho,alto]\nfs_donde = plt.axes(&#x5B;0.2, 0.10, 0.65, 0.03])\ndf_pasos = 5\nfs_slider = Slider(fs_donde, 'fs',\n                   (f0\/\/df_pasos)*df_pasos,\n                   (max(&#x5B;fs,10*f0])+2*df_pasos),\n                   valinit = fs, valstep = df_pasos,\n                   orientation='horizontal')\n\ndef grafico_actualiza(val):\n    # actualiza valores x,y\n    fs = fs_slider.val\n    \n    Ts = 1\/fs # tama\u00f1o de paso con fs\n    t_causal = 0\n    if pulso_causal:\n        t_causal = Ts*pulso_ancho\/2\n    \n    xt_list = xt_actualiza(xt,f0,fs,fs_veces,nT,\n                           pulso_ancho,pulso_causal)\n    &#x5B;ti,xti,tki,xki,tkj,ti_0,xti_0] = xt_list # x(t),x&#x5B;n],x(t)_alias0\n    dsp.stem_update(puntos_xn,tki,xki,graf_t) # x&#x5B;n]\n    dsp.stem_update(puntos_xki,tkj,xki,graf_n)\n    linea_xt0.set_xdata(ti_0) #x(t)_alias0\n    linea_xt0.set_ydata(xti_0)\n    \n    xn_list = xn_actualiza(fs,fs_veces,xki,pulso_ancho,pulso_causal)\n    &#x5B;t_pulsos,x_pulsos,t_unpulso,unpulso,xk_pulsos] = xn_list # x&#x5B;n] pulsos, pulso\n    linea_x_pulsos.set_xdata(t_pulsos) # x&#x5B;n] pulsos\n    linea_x_pulsos.set_ydata(x_pulsos)\n    #linea_pulso.set_xdata(t_unpulso-t_causal) # pulso lti\n    #linea_pulso.set_ydata(unpulso)\n\n    # lineas de cada pulso\n    muestras_n = len(tki)\n    tabla = &#x5B;]\n    for j in range(0,muestras_n,1):\n        pulsoj = np.concatenate((&#x5B;t_pulsos-t_causal],&#x5B;xk_pulsos&#x5B;j]]),axis=0)\n        pulsoj = np.transpose(pulsoj)\n        tabla.append(pulsoj)\n    linea_pulsosk.set_segments(tabla)\n\n    texto = titulo+' ; f0='+str(f0)\n    texto = texto +' ; fs='+str(fs)\n    graf_t.set_title(texto)\n\n    graf_t.set_xlim(&#x5B;t_pulsos&#x5B;0]-t_causal,t_pulsos&#x5B;-1]-t_causal])\n    graf_n.set_xlim(&#x5B;t_pulsos&#x5B;0],t_pulsos&#x5B;-1]])\n\n    fig.canvas.draw_idle() # actualiza figura\n\n# boton reinicio de gr\u00e1fica\nbtn_rstdonde = plt.axes(&#x5B;0.85, 0.025, 0.1, 0.04])\nbtn_rst = Button(btn_rstdonde, 'Reset',\n                 hovercolor='0.975')\ndef grafico_reinicia(event):\n    fs_slider.reset()\n    return()\n\n# objetos interactivos\nfs_slider.on_changed(grafico_actualiza)\nbtn_rst.on_clicked(grafico_reinicia)\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>interpola <a href=\"#concepto\">tri\u00e1ngulo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n\n\n\n<p>gr\u00e1fica <a href=\"#graficainteractiva\">interactiva<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>interpola tri\u00e1ngulo ejercicio algoritmo gr\u00e1fica interactiva 1. Interpolaci\u00f3n Lineal Referencia: McClellan 4-3.3 p143 La interpolaci\u00f3n lineal, con pulso triangular, o polinomio de primer orden consiste en los segmentos de l\u00ednea: El ancho del pulso es de dos veces el periodo de muestreo Ts, lo que causa que los pulsos se superpongan entre muestras. El resultado [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"wp-custom-template-entrada-dsp-unidades","format":"standard","meta":{"footnotes":""},"categories":[193],"tags":[],"class_list":["post-18270","post","type-post","status-publish","format-standard","hentry","category-dsp-unidades"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/18270","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=18270"}],"version-history":[{"count":5,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/18270\/revisions"}],"predecessor-version":[{"id":21044,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/18270\/revisions\/21044"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=18270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=18270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=18270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}