{"id":228,"date":"2024-10-24T09:53:20","date_gmt":"2024-10-24T14:53:20","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1034\/?p=228"},"modified":"2026-03-27T21:23:02","modified_gmt":"2026-03-28T02:23:02","slug":"espectro-xn-senal-discreta-en-tiempo","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/espectro-xn-senal-discreta-en-tiempo\/","title":{"rendered":"2.3 Espectro x[n] - Se\u00f1al discreta en tiempo"},"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=\"#espectro\">espectro_n<\/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=\"espectro\">1. Espectro de frecuencias de x[n]<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 4.1.4 p129<\/p>\n\n\n\n<p>De forma semejante al <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/dsp-u01\/espectro-operaciones-tiempo-frecuencia\/\" data-type=\"post\" data-id=\"20576\">Espectro para Operaciones en dominio de tiempo y frecuencia<\/a>, se aplica el concepto de frecuencias en radiantes. El espectro permitir\u00e1 analizar las se\u00f1ales alias: <strong>alias<\/strong> <strong>principal<\/strong> junto a otros <strong>alias<\/strong> generados con\u00a0\u00b12\u03c0 en cada frecuencia. Por ejemplo, para:<\/p>\n\n\n\n<p class=\"has-text-align-center\">x<sub>1<\/sub>[n] = cos(0.4\u03c0 n)<\/p>\n\n\n\n<p>Es se\u00f1al b\u00e1sica con frecuencia en radianes en 0.4\u03c0, ser\u00eda <strong>alias principal<\/strong>, con componentes en \u00b10.4\u03c0. En el dominio discreto '<strong>n<\/strong>', las se\u00f1ales alias se forman con cada componente desplazados en 2\u03c0<strong>k<\/strong> a la derecha y -2\u03c0<strong>k<\/strong> a la izquierda. Siendo <strong>k<\/strong> un n\u00famero entero. Para <strong>k<\/strong>=1.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Se\u00f1al<\/td><td>otros alias, k=1<\/td><\/tr><tr><td>alias principal<br><span style=\"color: blue\">\u03c91[n] = 0.4\u03c0<\/span><\/td><td><span style=\"color: brown\">\u03c93[n] = 0.4\u03c0 + 2\u03c0 = 2.4<br>\u03c94[n] = 0.4\u03c0 - 2\u03c0 = -1.6<\/span><\/td><\/tr><tr><td>alias folded<br>(pliegue negativo)<br><span style=\"color: blue\">\u03c92[n] = - 0.4\u03c0<\/span><\/td><td><span style=\"color: brown\">\u03c95[n] = -0.4\u03c0 + 2\u03c0 = 1.6<br>\u03c96[n] = -0.4\u03c0 - 2\u03c0 = -2.4<\/span><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>el espectro con se\u00f1ales alias para k=1 es:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"532\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/11\/espectro_n_coseno01.png\" alt=\"espectro discreto n coseno 01\" class=\"wp-image-502\" \/><\/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><a href=\"#espectro\">espectro_n<\/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\">2. Algoritmo en Python<\/h2>\n\n\n\n<p>El punto de partida es el algoritmo usado en <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/dsp-u01\/espectro-operaciones-tiempo-frecuencia\/\" data-type=\"post\" data-id=\"20576\">Espectro para Operaciones en dominio de tiempo y frecuencia<\/a>, donde las operaciones son semejantes y aplicadas al dominio '<code>t<\/code>', que deben cambiarse al domino '<strong><code>n<\/code><\/strong>'. Se aplica un cambio de variable y una bandera '<code>esdiscreta<\/code>' para ajustar el eje de frecuencias a radianes en el an\u00e1lisis de la funci\u00f3n <code><strong>cos_spectrum_list<\/strong>(x_senales)<\/code> del archivo <code><strong>telg1034.py<\/strong><\/code>. con lo que se logra obtener b\u00e1sicamente los resultados del espectro ajustados al nuevo dominio<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    <span style=\"color: #ff0000\">#...<\/span>\n    <span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,x_conteo,1):\n        unasenal = x_senales&#091;i]\n        \n        <span style=\"color: #ff0000\"># revisa si unasenal es discreta con n<\/span>\n        esdiscreta = <span style=\"color: #d35400\">False<\/span>\n        varindepend = unasenal.free_symbols\n        <span style=\"color: #d35400\">if<\/span> (n <span style=\"color: #d35400\">in<\/span> varindepend) <span style=\"color: #d35400\">and<\/span> <span style=\"color: #d35400\">not<\/span>(t <span style=\"color: #d35400\">in<\/span> varindepend):\n            unasenal = unasenal.<strong>subs<\/strong>(<strong>n<\/strong>,<strong>t<\/strong>)\n            <strong>esdiscreta<\/strong> = <span style=\"color: #d35400\">True<\/span>\n        <span style=\"color: #ff0000\"># analiza unasenal con t<\/span>\n        <span style=\"color: #ff0000\">#...<\/span><\/code><\/pre>\n\n\n\n<p>cuando la se\u00f1al es discreta, las frecuencias consideran el factor 2\u03c0, que se separaba cuando se calculaban en Hz.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>            <span style=\"color: #d35400\">if<\/span> <strong>esdiscreta<\/strong>:\n                freq_k = freq_k<strong>*2*pi<\/strong>\n            x_freq_spectr.append(freq_k)<\/code><\/pre>\n\n\n\n<p>con lo que el algoritmo se ajusta a la variable y es funcional.<\/p>\n\n\n\n<p>Para la secci\u00f3n <strong>gr\u00e1fica<\/strong>, se puede considerar el factor \u03c0 como un elemento a simplificar en el vector de frecuencias. Se revisa si existe el factor en el arreglo de frecuencias y se procede a separarlo dentro del algoritmo de espectro para <code>t<\/code>. Se actualizan los valores en los resultados.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n<span style=\"color: #ff0000\"># revisa factor pi en freq_n<\/span>\nunfactor = sym.S.One ; factor_pi = <span style=\"color: #d35400\">False<\/span>\nfreqn_conteo = <span style=\"color: #ff00ff\">len<\/span>(freq_n)\n<span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(0,freqn_conteo,1):\n    <span style=\"color: #d35400\">if<\/span> freq_n&#091;i].has(pi):\n        factor_pi = <span style=\"color: #d35400\">True<\/span>\n<span style=\"color: #d35400\">if<\/span> factor_pi:\n    freq_n = np.array(freq_n\/pi,dtype=<span style=\"color: #ff00ff\">float<\/span>)\n    unfactor = pi\n<span style=\"color: #ff0000\"># actualiza espectro de se\u00f1al con factor pi<\/span>\nun_espectro_n&#091;<span style=\"color: #008000\">'freq_factor'<\/span>] = unfactor\nun_espectro_n&#091;<span style=\"color: #008000\">'freq'<\/span>] = freq_n\n...<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 Revisi\u00f3n de se\u00f1ales \"alias\" en <code>x_senales<\/code> en algoritmo para espectro<\/h3>\n\n\n\n<p>Para tener un marcador de <strong><em>frecuencias <\/em><em>alias<\/em><\/strong> en las se\u00f1ales analizadas, se compara cada frecuencia del espectro para diferentes valores de <strong>k<\/strong> en la operaci\u00f3n \u00b12\u03c0, mientras no sobrepase la frecuencia m\u00e1xima del intervalo de <code>freq<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...<span style=\"color: #ff0000\">\n# aliasing, Revisa espectro de frecuencias <\/span>\nfreq_conteo = <span style=\"color: #ff00ff\">len<\/span>(freq_n)\nfreq_alias  = np.zeros(freq_conteo,dtype=<span style=\"color: #ff00ff\">bool<\/span>)\n<span style=\"color: #d35400\">for<\/span> i <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span> (0,freq_conteo,1):\n    unafreq = freq_n&#091;i]\n    k = 1\n    unalias = unafreq + k*2\n    <span style=\"color: #d35400\">while<\/span> unalias&lt;=freq_max:\n        <span style=\"color: #d35400\">for<\/span> j <span style=\"color: #d35400\">in<\/span> <span style=\"color: #ff00ff\">range<\/span>(i+1,freq_conteo,1):\n            <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">abs<\/span>(unalias - freq_n&#091;j])&lt;tolera:\n                <span style=\"color: #d35400\">if<\/span> <span style=\"color: #ff00ff\">abs<\/span>(freq_n&#091;i])&gt;<span style=\"color: #ff00ff\">abs<\/span>(freq_n&#091;j]):\n                    freq_alias&#091;i] = <span style=\"color: #d35400\">True<\/span>\n                <span style=\"color: #d35400\">else<\/span>:\n                    freq_alias&#091;j] = <span style=\"color: #d35400\">True<\/span>\n        k = k+1\n        unalias = unafreq + k*2\nun_espectro_n&#091;<span style=\"color: #008000\">'freq_alias'<\/span>] = freq_alias\n...<\/code><\/pre>\n\n\n\n<p>Se marcan las frecuencias alias en la lista <code>freq_alias<\/code> para diferenciarlas con otro color en la gr\u00e1fica de espectro, obteniendo el resultado presentado en el ejercicio.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 Algoritmo en Python<\/h3>\n\n\n\n<p>La se\u00f1al para el espectro se construye con los componentes <strong>alias<\/strong> presentados en la parte te\u00f3rica. Se analiza solo la se\u00f1al x<sub>4<\/sub>[n] para el espectro.<\/p>\n\n\n\n<p>El par\u00e1metro <code>tolera<\/code> en el bloque de ingreso es la tolerancia para redondear los valores de frecuencia en la gr\u00e1fica cuando tienen varios d\u00edgitos decimales.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# ejercicio 4.4 p130 Espectro de se\u00f1ales senoidales discretas\n# telg1034 DSP fiec-espol edelros@espol.edu.ec\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport sympy as sym\nimport telg1034 as dsp\n\n# variables continuas\nfrom telg1034 import t,A,w,f,p,pi,DosPi,I,equivalentes\n# variables discretas\nfrom telg1034 import n\n\n# INGRESO\nwith sym.evaluate(False): # no simplificar freq angular w &gt;2*pi\n    x1 = sym.cos(0.4*pi*n)\n    x2 = sym.cos(1.6*pi*n)\n    x3 = sym.cos(2.4*pi*n)\n    xn = x1+x2+x3\nx_etiqueta_n = 'x&#x5B;n]'\n\nfs = 60  # muestreo discreto, freq_sampling\nfs_veces = 12  # suavizar x(t), sobremuestreo\nmuestrasN = 6 + 1  # para x&#x5B;n]\n\ntolera = 1e-9 # tolerancia a error, n\u00fameros iguales\n\n# PROCEDIMIENTO\ntitulo = xn # copia para titulo de grafico (antes de procesar)\n# espectro x&#x5B;n]\n# Ref: Blog|Espectro-Operaciones en dominio de tiempo y frecuencia\nxn = xn.subs(pi,np.pi) # mantener valores &gt;2pi\nx_term = dsp.x_list_term_Add(xn)\nXe_term = dsp.cos_to_euler_one_term(x_term)\nx_term_expand = dsp.euler_to_cos_list(Xe_term)\nun_espectro_n = dsp.cos_spectrum_list(x_term)\nun_espectro_n&#x5B;'x_expand'] = x_term_expand\n\n# espectro de cada se\u00f1al\nfreq_n = un_espectro_n&#x5B;'freq']\nampl_n = un_espectro_n&#x5B;'ampl']\nfase_n = un_espectro_n&#x5B;'fase']\netiq_n = np.array(un_espectro_n&#x5B;'etiq'])\n\n# revisa factor pi en freq_n\nunfactor = sym.S.One ; factor_pi = False\nfreqn_conteo = len(freq_n)\nfor i in range(0,freqn_conteo,1):\n    if freq_n&#x5B;i].has(pi):\n        factor_pi = True\nif factor_pi:\n    freq_n = np.array(freq_n\/pi,dtype=float)\n    unfactor = pi\n# actualiza espectro de se\u00f1al con factor pi\nun_espectro_n&#x5B;'freq_factor'] = unfactor\nun_espectro_n&#x5B;'freq'] = freq_n\n\n# ancho de banda, freq_max y freq_min\nfreq_posi = freq_n&#x5B;freq_n&gt;0]\nfreq_max = float(max(freq_posi))\nfreq_min = 0\nif len(freq_posi)&gt;0:\n    freq_min = float(min(freq_posi))\nfreq_centro = (freq_max+freq_min)\/2\nun_espectro_n&#x5B;'freq_max'] = freq_max\nun_espectro_n&#x5B;'freq_min'] = freq_min\nun_espectro_n&#x5B;'BW'] = freq_max-freq_min\n\n# aliasing, Revisa espectro de frecuencias \nfreq_conteo = len(freq_n)\nfreq_alias  = np.zeros(freq_conteo,dtype=bool)\nfor i in range (0,freq_conteo,1):\n    unafreq = freq_n&#x5B;i]\n    k = 1\n    unalias = unafreq + k*2\n    while unalias&lt;=freq_max:\n        for j in range(i+1,freq_conteo,1):\n            if abs(unalias - freq_n&#x5B;j])&lt;tolera:\n                if abs(freq_n&#x5B;i])&gt;abs(freq_n&#x5B;j]):\n                    freq_alias&#x5B;i] = True\n                else:\n                    freq_alias&#x5B;j] = True\n        k = k+1\n        unalias = unafreq + k*2\nun_espectro_n&#x5B;'freq_alias'] = freq_alias\n\n# SALIDA\nprint('senal&#x5B;n]:  ',titulo)\nprint('senal&#x5B;n]:  ',xn)\nprint(' espectro:')\nfor parametro in un_espectro_n:\n    print(' ',parametro,':',un_espectro_n&#x5B;parametro])\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=\"#espectro\">espectro_n<\/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\">3. Gr\u00e1fica espectro dominio n<\/h2>\n\n\n\n<p>Se a\u00f1aden la gr\u00e1fica para el espectro de frecuencias ajustada al dominio n<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICAS de espectro de frecuencias discretas---------\ngraf_dx = 0.12\nfig_espectro = plt.figure()\nfreq_alias_conteo = np.sum(freq_alias)\nampl_max = float(max(ampl_n))*(1+graf_dx*2)\nfreq_max = float(max(un_espectro_n&#x5B;'freq_max'],1))*(1+graf_dx\/2)\n\n# grafica entorno\ngraf_fasorn = fig_espectro.add_subplot(111)\ngraf_fasorn.set_xlim(&#x5B;-freq_max,freq_max])\ngraf_fasorn.set_ylim(&#x5B;min(&#x5B;min(ampl_n),0]),ampl_max])\ngraf_fasorn.grid()\ngraf_fasorn.axhline(0,color='black')\ngraf_fasorn.axvline(0,linestyle='dotted',color='grey')\ntexto = '$' + sym.latex(titulo)+'$' +'  ; fs='+str(fs)\ngraf_fasorn.set_title(texto)\ngraf_fasorn.set_ylabel(x_etiqueta_n)\ngraf_fasorn.set_xlabel('freq rad')\n\n# grafica magnitud\nfreq_noalias = np.invert(freq_alias) \ngraf_fasorn.stem(freq_n&#x5B;freq_noalias],ampl_n&#x5B;freq_noalias],\n                 linefmt = 'C0--') #\nif freq_alias_conteo&gt;0: # hay alias, graficar\n    graf_fasorn.stem(freq_n&#x5B;freq_alias],ampl_n&#x5B;freq_alias],\n                     linefmt = 'C1--', label='alias')\nfor k in range(0,len(freq_n),1): # etiquetas de fasor\n    graf_fasorn.annotate(etiq_n&#x5B;k],xy=(freq_n&#x5B;k],ampl_n&#x5B;k]),\n                         xytext=(0,5),textcoords='offset points',\n                         ha='center')\n\n# etiquetas eje x usando unfactor\nif un_espectro_n&#x5B;'freq_factor'] != sym.S.One:\n    unfactor = r'$'+sym.latex(un_espectro_n&#x5B;'freq_factor'])+'$'\n    freq_etiq = &#x5B;]\n    for un_num in freq_n:\n        freq_etiq.append(f''+str(round(un_num,4))+unfactor)\n    graf_fasorn.set_xticks(ticks=freq_n,labels=freq_etiq)\n    \ngraf_fasorn.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><a href=\"#espectro\">espectro_n<\/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>espectro_n algoritmo gr\u00e1fica 1. Espectro de frecuencias de x[n] Referencia: McClellan 4.1.4 p129 De forma semejante al Espectro para Operaciones en dominio de tiempo y frecuencia, se aplica el concepto de frecuencias en radiantes. El espectro permitir\u00e1 analizar las se\u00f1ales alias: alias principal junto a otros alias generados con\u00a0\u00b12\u03c0 en cada frecuencia. Por ejemplo, para: [&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-228","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\/228","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=228"}],"version-history":[{"count":3,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/228\/revisions"}],"predecessor-version":[{"id":20598,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/228\/revisions\/20598"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}