{"id":219,"date":"2024-10-22T09:38:21","date_gmt":"2024-10-22T14:38:21","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1034\/?p=219"},"modified":"2026-03-27T21:22:50","modified_gmt":"2026-03-28T02:22:50","slug":"muestreo-con-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/muestreo-con-python\/","title":{"rendered":"2.1 Muestreo 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=\"#muestras\">muestras<\/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><a href=\"#grafinteractivo\">gr\u00e1fico interactivo<\/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=\"muestras\">1. Muestras de una se\u00f1al<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 4.1 p123<\/p>\n\n\n\n<p>Una se\u00f1al discreta en tiempo <strong>x<\/strong>[<strong>n<\/strong>], representa como una secuencia ordenada de n\u00fameros que puede ser almacenada para su uso y procesamiento posterior. Las muestras de una se\u00f1al cont\u00ednua o anal\u00f3gica <strong>x<\/strong>(<strong>t<\/strong>) se encuentran espaciadas en el tiempo separadas por un tiempo <strong>T<\/strong><sub>s<\/sub>.<\/p>\n\n\n\n<p class=\"has-text-align-center\">x[n] = x(nT<sub>s<\/sub>) =x(n\/f<sub>s<\/sub>) &nbsp; ; -\u221e &lt;n &lt; \u221e<\/p>\n\n\n\n<p>Cada valor de x[n] se denomina una muestra de la se\u00f1al cont\u00ednua x(t). <strong>T<\/strong><sub>s<\/sub>&nbsp; tambi\u00e9n se expresa como frecuencia de muestreo <strong>f<\/strong><sub>s<\/sub> = 1\/<strong>T<\/strong><sub>s<\/sub>&nbsp; en muestras\/s.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/muestreoAlias_cos01_animate.gif\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/muestreoAlias_cos01_animate.gif\" alt=\"muestreo fs cos animate\" class=\"wp-image-538\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 Muestreo de una se\u00f1al sinusoidal<\/h3>\n\n\n\n<p>Para obtener muestras de una se\u00f1al x(t) = A cos(\u03c9t+\u03c6) se tiene que:<\/p>\n\n\n\n<p class=\"has-text-align-center\">x[n] = x(nT<sub>s<\/sub>) =\u00a0A cos(\u03c9nT<sub>s<\/sub> +\u03c6)<\/p>\n\n\n\n<p class=\"has-text-align-center\">= A cos( (\u03c9T<sub>s<\/sub> )n+\u03c6)<\/p>\n\n\n\n<p class=\"has-text-align-center\">= A cos(\u03c9<sub>rad<\/sub> n+\u03c6)<\/p>\n\n\n\n<p>donde se tiene la <strong>frecuencia en radianes normalizada<\/strong>.<br>La frecuencia normalizada es un par\u00e1metro adimensional al quitar la unidad de tiempo de x(t), siendo '<strong>n<\/strong>' el \u00edndice de posici\u00f3n en la secuencia de <strong>muestra<\/strong>s.<\/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=\"#muestras\">muestras<\/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><a href=\"#grafinteractivo\">gr\u00e1fico interactivo<\/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><em><strong>Referencia<\/strong><\/em>: McClellan Figura 4.3 p126<\/p>\n\n\n\n<p>Una se\u00f1al tipo coseno de 100 Hz se toman muestras con una tasa f<sub>s<\/sub> = 500 muestras\/s. Realice y observe las gr\u00e1ficas de <strong>t<\/strong> y <strong>n<\/strong> correspondientes<\/p>\n\n\n\n<p class=\"has-text-align-center\">&nbsp;x(t) = cos(2\u03c0(100)t)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>muestreo: 11\n tama\u00f1o ki: 11\n tama\u00f1o ti: 100\nfs: 500  ; dt: 0.002  ; fs_veces: 10\nx(t): cos(100*t*(2*pi))\nx&#091;n]: cos(n*(2*pi)\/5)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/muestreoAlias01_coseno.png\"><img decoding=\"async\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/muestreoAlias01_coseno.png\" alt=\"muestreo Alias 01 oseno\" class=\"wp-image-476\" \/><\/a><\/figure>\n\n\n\n<p>De la gr\u00e1fica se puede observar que sin sobreponer la forma de onda x(t) sobre x[n] no es sencillo discernir la forma exacta de la forma de onda original. Para una mejor observaci\u00f3n de x(t), se sobre-muestrea 10 veces la se\u00f1al para que sea visiblemente semejante a la forma cont\u00ednua.<\/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=\"#muestras\">muestras<\/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><a href=\"#grafinteractivo\">gr\u00e1fico interactivo<\/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<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# ejercicio figura 4.1 p126 Muestreo de se\u00f1ales sinusoidales\n# telg1034 DSP fiec-espol edelros@espol.edu.ec\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport sympy as sym\n# variables continuas\nt = sym.Symbol('t', real=True)\n# variables discretas\nn = sym.Symbol('n', integer=True, positive=True)\n\npi = sym.pi\nDosPi = sym.UnevaluatedExpr(2*sym.pi)\nequivalentes = &#x5B;{'DiracDelta': lambda x: 1*(x==0)},\n                {'Heaviside': lambda x,y: np.heaviside(x, 1)},\n                'numpy',]\n# INGRESO\n# se\u00f1al continua\nf0 =100\nx = sym.cos(f0*DosPi*t + 0)\n# se\u00f1al discreta\nfs = 500  # muestreo discreto\n\nTn = 2  # periodos a graficar\nfs_veces = 10 # suavizar x(t), sobremuestreo\n\n# PROCEDIMIENTO\nxt = sym.lambdify(t,x, modules=equivalentes)\nxn = x.subs(t,n\/fs)\n\n# muestreo x&#x5B;n]\nmuestras = int(Tn*(fs\/f0))+1\nif muestras&lt;2:\n    muestras=2\nki = np.arange(0,muestras,1,dtype=int)\ndt = 1\/fs\ntk = ki*dt\nxk = xt(tk)\n \n# muestreo x(t)\ndtc = dt\/fs_veces # sobremuestreo para x(t)\nti = np.arange(0,(muestras-1)*dt + dtc, dtc)\nxti = xt(ti)\n\n# SALIDA\nprint('muestreo:',muestras)\nprint(' tama\u00f1o ki:',len(ki))\nprint(' tama\u00f1o ti:',len(ti))\nprint('fs:',fs,' ; dt:',dt, ' ; fs_veces:',fs_veces)\nprint('x(t):',x)\nprint('x&#x5B;n]:',xn)\n\n# GRAFICA x(t) y x&#x5B;n]\nplt.subplot(211) # x(t) cont\u00ednua\nplt.plot(ti,xti, color='gray',label='x(t)')\nplt.stem(tk,xk,linefmt = 'C0:',\n         label='x&#x5B;n]')\nplt.xlabel('t')\nplt.ylabel('amplitud')\nplt.title('x(t) vs x&#x5B;n]')\nplt.legend()\n\nplt.subplot(212) # x&#x5B;n] discreta\nplt.stem(xk,linefmt = 'C0:',label='x&#x5B;n]')\n#plt.xticks(ki)\nplt.xlabel('n')\nplt.ylabel('amplitud')\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><a href=\"#muestras\">muestras<\/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><a href=\"#grafinteractivo\">gr\u00e1fico interactivo<\/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=\"grafinteractivo\">4. Muestreo - gr\u00e1fico interactivo<\/h2>\n\n\n\n<p>Para el ejercicio de muestreo, se a\u00f1ade un control deslizante para la frecuencia de muestreo <code>fs<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/muestreoAlias07_coseno.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/muestreoAlias07_coseno.png\" alt=\"muestreo Alias coseno 07\" class=\"wp-image-539\" \/><\/a><\/figure>\n\n\n\n<p>Se incorpora un bot\u00f3n de reinicio (<strong>Reset<\/strong>) para el valor predeterminado de <code>fs<\/code>.<\/p>\n\n\n\n<p>El gr\u00e1fico se actualiza o reinicia al interactuar con el control deslizante <code>fs<\/code> o el bot\u00f3n de reinicio.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"color: #ff0000\"># objetos interactivos<\/span>\nfs_slider.on_changed(grafico_actualiza)\nbtn_rst.on_clicked(grafico_reinicia)<\/code><\/pre>\n\n\n\n<p>La actualizaci\u00f3n de gr\u00e1fico se realiza solo para los puntos muestra en el eje tiempo y en el eje n.<\/p>\n\n\n\n<p><strong>Referencia<\/strong>: <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/fp-unidades\/fp-u08\/graficas-2d-interactivas\/\" data-type=\"post\" data-id=\"14382\">Gr\u00e1ficas 2D interactivas \u2013 matplotlib.widgets<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Algoritmo en Python - muestreo interactivo para fs<\/h3>\n\n\n\n<p>Para el algoritmo se debe reemplazar la parte desde la gr\u00e1fica <code># GRAFICA x(t) y x[n]<\/code> , con las siguientes instrucciones que cambian a un objeto las <strong>lineas<\/strong> y los <strong>puntos<\/strong> para actualizar con cada interacci\u00f3n.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA x(t) y x&#x5B;n] interactiva\nfrom matplotlib.widgets import Slider, Button\nfig, &#x5B;grf1,grf2] = plt.subplots(2, 1)\n# x(t) cont\u00ednua\nlinea1, = grf1.plot(ti,xti, color='gray',label='x(t)')\npuntos1 = grf1.stem(tk,xk,linefmt = 'C0:',\n         label='x&#x5B;n]')\ngrf1.set_xlabel('t')\ngrf1.set_ylabel('amplitud')\ngrf1.set_title(x)\ngrf1.legend()\n\n# x&#x5B;n] discreta\npuntos2 = grf2.stem(xk,linefmt = 'C0:',label='x&#x5B;n]')\ngrf2.set_xlabel('n')\ngrf2.set_ylabel('amplitud')\ngrf2.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])\nfs_slider = Slider(fs_donde, 'fs',\n                   int(f0\/2), f0*20,\n                   valinit=fs,valstep= 10,\n                   orientation='horizontal')\n\ndef stem_update(puntos,xdata,ydata,grafico):\n    '''actualiza puntos\/tallos de plt.stem\n    con los datos de cada eje en un gr\u00e1fico\n    '''\n    puntos.markerline.set_xdata(xdata)\n    puntos.markerline.set_ydata(ydata)\n    segmentos=&#x5B;] # tallos o troncos\n    for j in range(0,len(xdata),1):\n        segmentos.append(&#x5B;&#x5B;xdata&#x5B;j],0],\n                          &#x5B;xdata&#x5B;j],ydata&#x5B;j]]])\n    puntos.stemlines.set_segments(segmentos)\n    puntos.baseline.set_xdata(&#x5B;xdata&#x5B;0],xdata&#x5B;-1]])\n    grafico.relim()\n    grafico.autoscale_view()\n    return(puntos,grafico)\n\ndef grafico_actualiza(val):\n    # actualiza valores x,y\n    fs = fs_slider.val\n    muestras = int(Tn*(fs\/f0))+1\n    if muestras&lt;2:\n        muestras=2\n    ki = np.arange(0,muestras,1,dtype=int)\n    dt = 1\/fs\n    tk = ki*dt\n    xk = xt(tk)\n    print('f0:',f0,' ;fs:',fs,' ',tipomuestreo)\n    # actualiza grafico\n    stem_update(puntos1,tk,xk,grf1)\n    stem_update(puntos2,ki,xk,grf2)\n    fig.canvas.draw_idle() # actualiza figura\n\n# boton reinicio de gr\u00e1fica\nbtn_rstdonde = plt.axes(&#x5B;0.8, 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><a href=\"#muestras\">muestras<\/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><a href=\"#grafinteractivo\">gr\u00e1fico interactivo<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>muestras ejercicio algoritmo gr\u00e1fico interactivo 1. Muestras de una se\u00f1al Referencia: McClellan 4.1 p123 Una se\u00f1al discreta en tiempo x[n], representa como una secuencia ordenada de n\u00fameros que puede ser almacenada para su uso y procesamiento posterior. Las muestras de una se\u00f1al cont\u00ednua o anal\u00f3gica x(t) se encuentran espaciadas en el tiempo separadas por un [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-dsp-unidades","format":"standard","meta":{"footnotes":""},"categories":[193],"tags":[],"class_list":["post-219","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\/219","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=219"}],"version-history":[{"count":3,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/219\/revisions"}],"predecessor-version":[{"id":20592,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/219\/revisions\/20592"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}