{"id":18273,"date":"2024-12-19T15:14:51","date_gmt":"2024-12-19T20:14:51","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1034\/?p=390"},"modified":"2026-03-27T21:23:38","modified_gmt":"2026-03-28T02:23:38","slug":"dft-pares-dft-dtft-con-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/dft-pares-dft-dtft-con-python\/","title":{"rendered":"3.2 DFT - Pares DFT &#x2194; DTFT 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>DFT:<\/p>\n\n\n\n<p><a href=\"#dftimpulsounitario\">\u03b4<\/a>(t)<a href=\"#dftimpulsounitario\"> unitario<\/a><\/p>\n\n\n\n<p><a href=\"#dftpulsorectangular\">pulso rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#dftexpcomplejo\">e<sup>t<\/sup> complejo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p>La DFT es una versi\u00f3n discreta del espectro de frecuencias de&nbsp; tipo X(e<sup>j\u03c9<\/sup> ) que es cont\u00ednua y conocida como&nbsp;DTFT. Se puede construir pares de DFT haciendo la sustituci\u00f3n \u03c9=(2\u03c0\/N)\/k en un par DTFT<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dftimpulsounitario\">1. DFT de un impulso unitario desplazado<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 8.1.2.1 p306.&nbsp;<a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-unidades\/ss-u05\/transformada-fourier-senales-aperiodicas-continuas\/\" data-type=\"post\" data-id=\"17807\">Transformada de Fourier \u2013 Se\u00f1ales aperi\u00f3dicas continuas<\/a><\/p>\n\n\n\n<p>Tomando la DFT de x[n] =\u03b4[n], la sumatoria de DFT se simplifica a un t\u00e9rmino<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[k] = \\sum_{n=0}^{N-1} \\delta [n] e^{-j(2\\pi k\/N)n} <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = \\delta [0] e^{-j(2\\pi k\/N)(0)} + \\sum_{n=1}^{N-1} \\cancel{\\delta [n]} e^{-j(2\\pi k\/N)n} <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = \\delta [0] (1) + 0 = 1 <\/span>\n\n\n\n<p>Usando la respuesta anterior, para x[n] = \u03b4[n-n<sub>d<\/sub>]m se puede escribir<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[k] = \\delta [n_d] e^{-j(2\\pi k\/N)n_d} = e^{-j\\omega n_d}<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\delta [n-n_d] \\leftrightarrow e^{-j\\omega n_d}<\/span>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_impulsounitario_NL.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_impulsounitario_NL.png\" alt=\"fft impulso unitario N=L\" class=\"wp-image-416\" \/><\/a><\/figure>\n\n\n\n<p>Se crea a partir de una funci\u00f3n rectangular con ancho igual al tama\u00f1o de paso.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code><span style=\"color: #ff0000\"># INGRESO<\/span>\nL  = 50   <span style=\"color: #ff0000\"># Tramos en un periodo<\/span>\n\n<span style=\"color: #ff0000\"># se\u00f1al es impulso unitario peri\u00f3dico d&#091;n], rectangular ancho \"peque\u00f1o\"<\/span>\nf0 = 0.2  <span style=\"color: #ff0000\"># frecuencia fundamental de se\u00f1al<\/span>\nancho = 1\/f0\/L <span style=\"color: #ff0000\"># ancho del impulso rectangular<\/span>\nn0 = 0.5 <span style=\"color: #ff0000\"># desplazamiento en tiempo<\/span>\nxt = <span style=\"color: #d35400\">lambda<\/span> n: np.heaviside(n-n0,1)-np.heaviside(n-n0-ancho,1)\n\n<span style=\"color: #ff0000\"># para DFT<\/span>\nN = 1*L <span style=\"color: #ff0000\"># N par mayor que L, tramos DFT, FFT<\/span><\/code><\/pre>\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>DFT:<\/p>\n\n\n\n<p><a href=\"#dftimpulsounitario\">\u03b4<\/a>(t)<a href=\"#dftimpulsounitario\"> unitario<\/a><\/p>\n\n\n\n<p><a href=\"#dftpulsorectangular\">pulso rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#dftexpcomplejo\">e<sup>t<\/sup> complejo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/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=\"dftpulsorectangular\">2. DFT de un pulso rectangular<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/ss-unidades\/ss-u05\/transformada-fourier-senales-aperiodicas-continuas\/\" data-type=\"post\" data-id=\"17807\">Transformada de Fourier \u2013 Se\u00f1ales aperi\u00f3dicas continuas<\/a><\/p>\n\n\n\n<p>Para un pulso rectangular en el domino de tiempo discreto, expresado como:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> r [n] = \\begin {cases} 1 &amp; 0\\leq n \\leq L-1 \\\\ 0 &amp; L \\leq n \\leq N-1 \\end {cases} <\/span>\n\n\n\n<p>La DFT tiene un t\u00e9rmino de la forma<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> R_L[k] = R_L \\Big( e^{j\\omega} \\Big) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = \\frac{\\sin \\Big( \\frac{1}{2} L(2\\pi k\/N)\\Big)}{\\sin \\Big( \\frac{1}{2} (2\\pi k\/N)\\Big)} e^{-j(2 \\pi k\/N)(L-1)\/2}<\/span>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_rectangular_NL.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_rectangular_NL.png\" alt=\"\" class=\"wp-image-413\" \/><\/a><\/figure>\n\n\n\n<p>Se crea a partir de una funci\u00f3n rectangular con ancho igual a la mitad de un periodo.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code><span style=\"color: #ff0000\"># INGRESO<\/span>\nL  = 50   <span style=\"color: #ff0000\"># Tramos en un periodo<\/span>\n\n<span style=\"color: #ff0000\"># se\u00f1al es rectangular peri\u00f3dico rect&#091;n]<\/span>\nf0 = 0.2  <span style=\"color: #ff0000\"># frecuencia fundamental de se\u00f1al<\/span>\nancho = 0.5*(1\/f0) <span style=\"color: #ff0000\"># ancho del impulso rectangular<\/span>\nxt = <span style=\"color: #d35400\">lambda<\/span> t: np.heaviside(t,1)-np.heaviside(t-ancho,1)\n\n<span style=\"color: #ff0000\"># para DFT<\/span>\nN = 1*L <span style=\"color: #ff0000\"># N par mayor que L, tramos DFT<\/span><\/code><\/pre>\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>DFT:<\/p>\n\n\n\n<p><a href=\"#dftimpulsounitario\">\u03b4<\/a>(t)<a href=\"#dftimpulsounitario\"> unitario<\/a><\/p>\n\n\n\n<p><a href=\"#dftpulsorectangular\">pulso rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#dftexpcomplejo\">e<sup>t<\/sup> complejo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/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=\"dftexpcomplejo\">3. DFT de un exponencial complejo<\/h2>\n\n\n\n<p>Una se\u00f1al exponencial compleja de tama\u00f1o finito se expresa como<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x [n] = r_L[n] e^{j \\omega_0 n}= \\begin {cases} e^{j\\omega_0 n} &amp; 0\\leq n \\leq L-1 \\\\ 0 &amp; L \\leq n \\leq N-1 \\end {cases} <\/span>\n\n\n\n<p>La DFT tiene un t\u00e9rmino de la forma<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[k] = R_L \\Big( e^{j\\omega-\\omega_0} \\Big) <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = \\frac{\\sin \\Big( \\frac{1}{2} L(2\\pi k\/N - \\omega_0)\\Big)}{\\sin \\Big( \\frac{1}{2} (2\\pi k\/N- \\omega_0)\\Big)} e^{-j(2 \\pi k\/N- \\omega_0)(L-1)\/2}<\/span>\n\n\n\n<p>expresi\u00f3n que tambi\u00e9n se representa en t\u00e9rminos de Dirichlet<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[k] = D_L(2\\pi k\/N - \\omega_0) e^{-j(2 \\pi k\/N- \\omega_0)(L-1)\/2}<\/span>\n\n\n\n<p>Dado que el exponencial solo contribuye a la fase, el resultado muestra que la magnitud depende solo del termino D<sub>L<\/sub><\/p>\n\n\n\n<p>La DFT es muy simple cuando la frecuencia de la se\u00f1al exponencial es un m\u00faltiplo entero de 2\u03c0\/N y la cantidad de muestras DFT son iguales a la cantidad de muestras de la se\u00f1al N=L.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[k] = N \\delta [k-k_0] <\/span>\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\/12\/fft_exp_complex_NL.png\" alt=\"fft exp complex N=L\" class=\"wp-image-20628\" \/><\/figure>\n\n\n\n<p>Para N=2L, la gr\u00e1fica adquiere mayor resoluci\u00f3n en el dominio de la frecuencia, donde se requiere completar los puntos L para que sean iguales a N y realizar el c\u00e1lculo de fft.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_exp_complex_N2L.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_exp_complex_N2L.png\" alt=\"fft exp complex N=2L\" class=\"wp-image-422\" \/><\/a><\/figure>\n\n\n\n<p>Se crea a partir de una funci\u00f3n exponencial multiplicada por una rectangular con ancho igual a un periodo. Para la gr\u00e1fica se considera solo la parte real de la funci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code><span style=\"color: #ff0000\"># INGRESO<\/span>\nL  = 20   <span style=\"color: #ff0000\"># Tramos en un periodo<\/span>\n\n<span style=\"color: #ff0000\"># se\u00f1al es exponencial complejo peri\u00f3dico<\/span>\nf0 = 0.2  <span style=\"color: #ff0000\"># frecuencia fundamental de se\u00f1al<\/span>\nancho = 1*(1\/f0) <span style=\"color: #ff0000\"># ancho del impulso rectangular<\/span>\nrect = <span style=\"color: #d35400\">lambda<\/span> t: np.heaviside(t,1)-np.heaviside(t-ancho,1)\nxt = <span style=\"color: #d35400\">lambda<\/span> t: rect(t)*np.exp(1j*2*np.pi*f0*t)\n\n<span style=\"color: #ff0000\"># para DFT<\/span>\nN = 2*L <span style=\"color: #ff0000\"># N par mayor que L, tramos DFT<\/span><\/code><\/pre>\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>DFT:<\/p>\n\n\n\n<p><a href=\"#dftimpulsounitario\">\u03b4<\/a>(t)<a href=\"#dftimpulsounitario\"> unitario<\/a><\/p>\n\n\n\n<p><a href=\"#dftpulsorectangular\">pulso rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#dftexpcomplejo\">e<sup>t<\/sup> complejo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/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\">4. Algoritmo en Python<\/h2>\n\n\n\n<p>Se adjunta el algoritmo para los ejercicios, el bloque de ingreso presentado corresponde al ejercicio de exponencial complejo. Para los otros ejercicios actualizar el bloque de INGRESO<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# ejemplo 8.1.2.2 p307 DFT x&#x5B;n] zero-padding\n# telg1034 DSP fiec-espol edelros@espol.edu.ec\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# INGRESO\nL  = 20   # Tramos en un periodo\n\n# se\u00f1al es exponencial complejo peri\u00f3dico\nf0 = 0.2  # frecuencia fundamental de se\u00f1al\nancho = 1*(1\/f0) # ancho del impulso rectangular\nrect = lambda t: np.heaviside(t,1)-np.heaviside(t-ancho,1)\nxt = lambda t: rect(t)*np.exp(1j*2*np.pi*f0*t)\n\n# para DFT\nN = 2*L # N par mayor que L, tramos DFT\n\n# PROCEDIMIENTO\n# muestreo de se\u00f1al x&#x5B;n]\nt0 = 0 ; tn = 1\/f0 # intervalo &#x5B;t0,tn]\ndt = (tn-t0)\/L\nti = np.arange(t0,tn,dt)\nxn = xt(ti)\n\n# verificar que L&lt;=N\nif L&lt;=N:\n    # DFT transformada rapida de Fourier\n    Xk = np.fft.fft(xn,n=N)\n    Xkmagn = np.abs(Xk) # para gr\u00e1fica\n    Xkfase = np.angle(Xk)\n    freq_Hz = np.fft.fftfreq(N,dt) # frecuencias en Hz\n\n    mitad = int(N\/2)\n    k0 = np.argmax(Xk) # Pico |X&#x5B;k]|\n\n# SALIDA\nif N&gt;=L:\n    print('k0:',k0,'; i:',mitad+k0)\n    print('freq_Hz:',freq_Hz&#x5B;k0],\n          '; Xk&#x5B;k0]:',Xk&#x5B;k0])\n    print('&#x5B; i, freq&#x5B;ki],|X&#x5B;k]| ,X&#x5B;k]]')\n    kmin = k0-4 ; kmax = k0+4\n    if kmin&lt;0:\n        kmin = 0\n    if kmax&gt;N:\n        kmax = N\n    for i in range(kmin,kmax,1):\n        print(&#x5B;i,freq_Hz&#x5B;i],Xkmagn&#x5B;i],Xk&#x5B;i]])\nelse:\n    print('Revisar: L debe ser menor o igual a N')\n    print('L:',L,'; N:',N)\n\n# GRAFICA\nif N&gt;=L:\n    LN_texto= ', L='+str(L)+', N='+str(N)\n    zp_texto = 'zero padding:'+str(N-L)\n    plt.subplot(211)\n    plt.stem(ti,np.real(xn),label='Re(x&#x5B;n])',\n             markerfmt ='C2.',linefmt='C2-')\n    plt.stem(ti,np.imag(xn),label='Im(x&#x5B;n])',\n             markerfmt ='C4.',linefmt='C4:')\n    plt.stem(L*dt,0,markerfmt ='C3.')\n    plt.xlabel('ti (s)')\n    \n    plt.title('x&#x5B;n] vs |x&#x5B;k]|'+LN_texto+', '+zp_texto)\n    plt.legend()\n\n    plt.subplot(212)\n    plt.stem(freq_Hz&#x5B;0:mitad], Xkmagn&#x5B;0:mitad],\n             label='|X&#x5B;k]| centrada]',\n             markerfmt ='C0.',linefmt='C0-')\n    plt.stem(freq_Hz&#x5B;mitad:], Xkmagn&#x5B;mitad:],\n             markerfmt ='C1.',linefmt='C1-')\n    plt.xlabel('freq (Hz)')\n    plt.legend()\n    plt.tight_layout()\n    plt.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>DFT:<\/p>\n\n\n\n<p><a href=\"#dftimpulsounitario\">\u03b4<\/a>(t)<a href=\"#dftimpulsounitario\"> unitario<\/a><\/p>\n\n\n\n<p><a href=\"#dftpulsorectangular\">pulso rectangular<\/a><\/p>\n\n\n\n<p><a href=\"#dftexpcomplejo\">e<sup>t<\/sup> complejo<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">algoritmo<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>DFT: \u03b4(t) unitario pulso rectangular et complejo algoritmo La DFT es una versi\u00f3n discreta del espectro de frecuencias de&nbsp; tipo X(ej\u03c9 ) que es cont\u00ednua y conocida como&nbsp;DTFT. Se puede construir pares de DFT haciendo la sustituci\u00f3n \u03c9=(2\u03c0\/N)\/k en un par DTFT 1. DFT de un impulso unitario desplazado Referencia: McClellan 8.1.2.1 p306.&nbsp;Transformada de Fourier [&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-18273","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\/18273","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=18273"}],"version-history":[{"count":3,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/18273\/revisions"}],"predecessor-version":[{"id":21099,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/18273\/revisions\/21099"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=18273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=18273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=18273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}