{"id":18271,"date":"2024-10-28T07:54:26","date_gmt":"2024-10-28T12:54:26","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1034\/?p=575"},"modified":"2026-03-27T21:23:25","modified_gmt":"2026-03-28T02:23:25","slug":"interpolacion-con-pulso-sinct","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/interpolacion-con-pulso-sinct\/","title":{"rendered":"2.7 D-to-C - Interpolaci\u00f3n con pulso Sinc(t)"},"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\">Sinc<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\" data-type=\"internal\" data-id=\"#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 Sinc(t)<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 4-3.6 p147<\/p>\n\n\n\n<p>La interpolaci\u00f3n con pulso Sinc(t) es un pulso relacionado con la Transformada de Fourier Cont\u00ednua en tiempo. El pulso Sinc(t) es de ancho infinito y su amplitud disminuye al alejarse de cero, pero no llega a cero o la se\u00f1al se mantiene en cero.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/pulsoSinc01.png\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/pulsoSinc01.png\" alt=\"pulso Sinc 01\" class=\"wp-image-584\" \/><\/a><\/figure>\n\n\n\n<p>El valor de p(0)=1 y p(nTs) = 0 para n = \u00b11, \u00b12, \u00b13, ... El tipo de reconstrucci\u00f3n D-to-C es llamada interpolaci\u00f3n de banda limitada, al ser equivalente a seleccionar los componentes de alias principal.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoSinc_animate.gif\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoSinc_animate.gif\" alt=\"interpola Pulso Sinc animate\" class=\"wp-image-609\" \/><\/a><\/figure>\n\n\n\n<p>Si el muestreo cumple con las condiciones del <strong>teorema del muestreo<\/strong>, la reconstrucci\u00f3n de una onda cosenoidal es id\u00e9ntica a la se\u00f1al original que gener\u00f3 las muestras.<\/p>\n\n\n\n<p>Una se\u00f1al cont\u00ednua <strong>x(t)<\/strong> de banda limitada sin componentes de frecuencia mayores a <strong>f<\/strong><sub>max<\/sub> se puede reconstruir exactamente a partir de las muestras <code>x(n T<sub>s<\/sub>)<\/code>, si las muestras se toman a una tasa de <strong>f<\/strong><sub>s<\/sub>=1\/T<sub>s<\/sub> que es mayor que 2<strong>f<\/strong><sub>max<\/sub>.<\/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\">Sinc<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\" data-type=\"internal\" data-id=\"#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<h3 class=\"wp-block-heading\">2.1 Algoritmo en Python para un pulso Sinc(t)<\/h3>\n\n\n\n<p>El algoritmo es el mismo que para un pulso triangular, actualizando la secci\u00f3n de la funci\u00f3n que define el pulso.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n# D-to-C, Interpolacion con pulso Sinc(t)\n# ejemplo 4.3.4 p144\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 Sinc'\nnT = 3.0  # graficar periodos de la se\u00f1al\n\n# pulso Sinc\npulso_causal = True # No causal, pulso centrado en cero\npulso_ancho = 6\n\n# PROCEDIMIENTO\nTs = 1\/fs # muestreo periodo\ndtc = Ts\/fs_veces # suavizar x(t), sobremuestreo\n\n#u = lambda t: np.piecewise(t,t&amp;gt;=0,&#x5B;1,0])\nu = lambda t: np.heaviside(t,1)\n# pulso Sinc\nu1 = lambda t: u(t+Ts*pulso_ancho\/2)\nu2 = lambda t: u(t-Ts*pulso_ancho\/2)\nsinc = lambda t: (np.sin(np.pi*t\/Ts)\/(np.pi*t\/Ts))*(u1(t) - u2(t))             \n\n# x&#x5B;n] interpolacion en Ts, a muestreo fs\nt_unpulso = np.arange(-Ts*nT,Ts*nT+dtc,dtc)\nunpulso = sinc(t_unpulso)\n\n# SALIDA\nprint('muestras:',len(t_unpulso))\nprint('t_unpulso:',t_unpulso)\n\n# GRAFICA de un pulso\nplt.axhline(0,color='black')\nplt.axvline(-Ts,color='red',linestyle='dotted')\nplt.axvline(Ts,color='red',linestyle='dotted')\n\n# p(t) componentes\nplt.plot(t_unpulso,unpulso, color='green',linestyle='dashed',\n         label='p_sinc(t)')\nplt.stem(&#x5B;0],&#x5B;1],linefmt = 'C1:', label='xn&#x5B;0]')\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\">Sinc<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\" data-type=\"internal\" data-id=\"#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<\/h2>\n\n\n\n<p>Desarrollar el ejercicio de pulsos triangulares y su algoritmo para realizar la gr\u00e1fica de la se\u00f1al sin(2\u03c0(83)t) con interpolaci\u00f3n de pulsos Sinc(t)<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoSinc01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoSinc01.png\" alt=\"interpola Pulso Sinc 01\" class=\"wp-image-585\" \/><\/a><\/figure>\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\">Sinc<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\" data-type=\"internal\" data-id=\"#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&nbsp; Sinc<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# D-to-C, Interpolacion con pulso Sinc(t)\n# ejemplo 4.3.4 p144\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 se\u00f1al x(t)\n\ntitulo = 'pulso Sinc(t)'\n# pulso Sinc\npulso_causal = True # No causal, centrado en cero\npulso_ancho = 4\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    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#u = lambda t: np.piecewise(t,t&gt;=0,&#x5B;1,0])\nu = lambda t: np.heaviside(t,1)\n# pulso Sinc(t) # tambien definido como np.sinc()\nu1 = lambda t: u(t+Ts*pulso_ancho\/2)\nu2 = lambda t: u(t-Ts*pulso_ancho\/2)\nsinc_tl = lambda t: ((np.sin(np.pi*t\/Ts)\/(np.pi*t\/Ts))*(u1(t) - u2(t)))\n\ndef sinc_t(t):\n    np.seterr(invalid='ignore') # t==0 division para cero\n    resultado = sinc_tl(t) # en t=0, resultado es nan\n    resultado = np.nan_to_num(resultado, nan=1) # cambia nan por 1\n    return (resultado)\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 = sinc_t(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&#x5B;n] 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# 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\">Sinc<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\" data-type=\"internal\" data-id=\"#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. 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\/interpolaPulsoSinc_animate.gif\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/interpolaPulsoSinc_animate.gif\" alt=\"interpola Pulso Sinc animate\" class=\"wp-image-609\" \/><\/a><\/figure>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# D-to-C, Interpolacion con pulso Sinc(t)\n# grafico interactivo\n# ejemplo 4.3.4 p144\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 se\u00f1al x(t)\n\ntitulo = 'pulso Sinc(t)'\n# pulso Sinc\npulso_causal = True # No causal, centrado en cero\npulso_ancho = 4\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    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    #u = lambda t: np.piecewise(t,t&gt;=0,&#x5B;1,0])\n    u = lambda t: np.heaviside(t,1)\n    # pulso Sinc(t) # tambien definido como np.sinc()\n    u1 = lambda t: u(t+Ts*pulso_ancho\/2)\n    u2 = lambda t: u(t-Ts*pulso_ancho\/2)\n    sinc_tl = lambda t: ((np.sin(np.pi*t\/Ts)\/(np.pi*t\/Ts))*(u1(t) - u2(t)))\n\n    def sinc_t(t):\n        np.seterr(invalid='ignore') # t==0 division para cero\n        resultado = sinc_tl(t) # en t=0, resultado es nan\n        resultado = np.nan_to_num(resultado, nan=1) # cambia nan por 1\n        return (resultado)\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 = sinc_t(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\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\">Sinc<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\" data-type=\"internal\" data-id=\"#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 Sinc ejercicio algoritmo gr\u00e1fica interactiva 1. Interpolaci\u00f3n Sinc(t) Referencia: McClellan 4-3.6 p147 La interpolaci\u00f3n con pulso Sinc(t) es un pulso relacionado con la Transformada de Fourier Cont\u00ednua en tiempo. El pulso Sinc(t) es de ancho infinito y su amplitud disminuye al alejarse de cero, pero no llega a cero o la se\u00f1al se mantiene [&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-18271","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\/18271","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=18271"}],"version-history":[{"count":4,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/18271\/revisions"}],"predecessor-version":[{"id":20618,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/18271\/revisions\/20618"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=18271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=18271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=18271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}