{"id":454,"date":"2024-12-21T08:11:19","date_gmt":"2024-12-21T13:11:19","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1034\/?p=454"},"modified":"2026-03-27T21:23:48","modified_gmt":"2026-03-28T02:23:48","slug":"idft-propiedades-ifft-con-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/idft-propiedades-ifft-con-python\/","title":{"rendered":"3.4 IDFT \u2013 Propiedades \u2013 IFFT 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>IDFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">periodicidad<\/a><\/p>\n\n\n\n<p><a href=\"#convolucion\">convoluci\u00f3n<\/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=\"periodicas\">1. Peri\u00f3dicidad<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 8.3.1 p319<\/p>\n\n\n\n<p>La sumatoria de IDFT tambi\u00e9n tiene propiedad e periodicidad. Considera evaluar una funci\u00f3n en n+N, con n en el intervalo 0\u2264n\u2264N-1:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x[n+N] = \\frac{1}{N}\\sum_{k=0}^{N-1} X[k] e^{j(2\\pi \/N)k(n+N)}<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = \\frac{1}{N}\\sum_{k=0}^{N-1} X[k] e^{j(2\\pi \/N)k(n)} \\cancel{e^{j(2\\pi \/N)k(N)} } <\/span>\n\n\n\n<p>un factor exponencial se convierte en 1, quedando<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = \\frac{1}{N}\\sum_{k=0}^{N-1} X[k] e^{j(2\\pi \/N)k(n)} = x[n] <\/span>\n\n\n\n<h3 class=\"wp-block-heading\">1. 1 Ejemplo: IDFT de impulso desplazado<\/h3>\n\n\n\n<p>Para una se\u00f1al de L=N=10 puntos x[n]=\u03b4[n-14] tendr\u00e1 una DFT:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[k] = e^{-j(0.2\\pi (14)k}<\/span>\n\n\n\n<p>El resultado de la IDFT tendr\u00e1 un valor diferente de cero en n=4.<\/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\/12\/ifft_exp_complex_NL.png\" alt=\"ifft exp complex N=L\" class=\"wp-image-20634\" \/><\/figure>\n\n\n\n<p>con el algoritmo para no.fft.ifft() se pueden obtener los valores para<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>N: 10\nX&#091;k]:\n&#091; 1.        +0.00000000e+00j -0.80901699-5.87785252e-01j\n  0.30901699+9.51056516e-01j  0.30901699-9.51056516e-01j\n -0.80901699+5.87785252e-01j  1.        +1.71450552e-15j\n -0.80901699-5.87785252e-01j  0.30901699+9.51056516e-01j\n  0.30901699-9.51056516e-01j -0.80901699+5.87785252e-01j]\nRe(x&#091;n]):\n&#091;-4.88498131e-16 -7.98670570e-16 -9.76996262e-16 -9.51130884e-16\n  1.00000000e+00  9.49240686e-16  9.76996262e-16  8.05446317e-16\n  5.32907052e-16 -4.88554849e-18]\nIm(x&#091;n]):\n&#091;-7.16727868e-16 -3.76270034e-16  2.39540920e-17  4.01492493e-16\n  2.23107982e-15  3.94763191e-16  4.54309871e-17 -3.94454259e-16\n -7.26484270e-16 -8.82784150e-16]<\/code><\/pre>\n\n\n\n<p>considerando como bloque de ingreso:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><span style=\"color: #ff0000\"># INGRESO<\/span>\nX_k = <span style=\"color: #d35400\">lambda<\/span> k: np.exp(-1j*0.2*np.pi*14*k)\nN  = 10 <span style=\"color: #ff0000\"># Tramos en intervalo<\/span>\nk0 = 0 <span style=\"color: #ff0000\"># inicio de gr\u00e1fica<\/span>\n<\/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>IDFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">periodicidad<\/a><\/p>\n\n\n\n<p><a href=\"#convolucion\">convoluci\u00f3n<\/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=\"convolucion\">2.&nbsp; Propiedad de la Convoluci\u00f3n<\/h2>\n\n\n\n<p>La convoluci\u00f3n en el domino del tiempo se puede desarrollar como una multiplicaci\u00f3n en el dominio de la frecuencia.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y[n] = h[n] * x[n] \\leftrightarrow Y(e^{j \\omega} )= H(e^{j \\omega}) X(e^{j \\omega}) <\/span>\n\n\n\n<p>Siendo la DFT una versi\u00f3n discreta&nbsp; de tama\u00f1o finito, de la DTFT cont\u00ednua:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y[n] = \\sum_{m=0}^{M-1} h[m] x[n-m] <\/span>\n\n\n\n<p>donde se supone que h[n]= 0 fuera del intervalo n= 0, 1, ... , M-1,<br>x[n]=0 fuera del intervalo n= 0, 1, ... , L-1<br>h[n] es una secuencia d M puntos y x[n] es una secuencia de L puntos.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> Y[k] = H[k] X[k] <\/span>\n\n\n\n<p>obteniendo y[n]<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y[n] = \\frac{1}{N}\\sum_{k=0}^{N-1} Y[k] e^{j(2 \\pi \/N)kn} <\/span>\n\n\n\n<h3 class=\"wp-block-heading\">2. 1 Ejemplo: Convoluci\u00f3n de pulsos<\/h3>\n\n\n\n<p>Suponga una se\u00f1al h[n] compuesta de 16 puntos de los que 6 se encuentran en valor 1 y el resto en cero. La se\u00f1al x[n] es una se\u00f1al de pulsos de tama\u00f1o 16 puntos, 10 en estado uno, el resto en cero. Considerando que Y[k] = H[k] X[k], use np.fft.fft y np.fft.ifft para mostrar la convoluci\u00f3n resultante en el dominio del tiempo.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/ifft_convolucion_rect_X_H_01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/ifft_convolucion_rect_X_H_01.png\" alt=\"ifft convolucion rect X[k] H[k] rect\" class=\"wp-image-458\" \/><\/a><\/figure>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>k0x: 0 ; i: 8\nfreq_Hz: 0.0 ; Xk&#091;k0x]: (10+0j)\n&#091; i, freq&#091;ki],|X&#091;k]| ,X&#091;k]]\n&#091;0, 0.0, 10.0, (10+0j)]\n&#091;1, 0.2, 4.735650251450756, (-0.9238795325112867-4.6446560597607585j)]\n&#091;2, 0.4, 1.8477590650225735, (1.7071067811865475-0.7071067811865476j)]\n&#091;3, 0.6000000000000001, 0.688811980233627, (-0.38268343236508984-0.5727262301542022j)]\n\nk0h: 0 ; i: 8\nfreq_Hz: 0.0 ; Hk&#091;k0h]: (6+0j)\n&#091; i, freq&#091;ki],|H&#091;k]| ,H&#091;k]]\n&#091;0, 0.0, 6.0, (6+0j)]\n&#091;1, 0.2, 4.735650251450756, (2.630986313697834-3.937549278574211j)]\n&#091;2, 0.4, 1.8477590650225735, (-0.7071067811865476-1.7071067811865475j)]\n&#091;3, 0.6000000000000001, 0.688811980233627, (0.6755766511785423+0.1343805510323453j)]<\/code><\/pre>\n\n\n\n<p>Algoritmo en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# ejemplo 8.3.3 p324 DFT convolucion\n# telg1034 DSP fiec-espol edelros@espol.edu.ec\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# INGRESO\nL  = 16   # Tramos en un periodo\n\n# se\u00f1al es rectangular peri\u00f3dico rect&#x5B;n]\nf0 = 0.2  # frecuencia fundamental de se\u00f1al\nancho = (10\/16)*(1\/f0) # ancho del impulso rectangular\nxt = lambda t: np.heaviside(t,1)-np.heaviside(t-ancho,1)\n\n# se\u00f1al H es rectangular peri\u00f3dico rect&#x5B;n]\nf0 = 0.2  # frecuencia fundamental de se\u00f1al\nanchoh = (6\/16)*(1\/f0) # ancho del impulso rectangular\nht = lambda t: np.heaviside(t,1)-np.heaviside(t-anchoh,1)\n\n# para DFT\nN = 1*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)\n\nxn = xt(ti)\nhn = ht(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    k0x = np.argmax(Xk) # Pico |X&#x5B;k]|\n    \n    # DFT transformada rapida de Fourier\n    Hk = np.fft.fft(hn,n=N)\n    Hkmagn = np.abs(Hk) # para gr\u00e1fica\n    Hkfase = np.angle(Hk)\n    k0h = np.argmax(Hk) # Pico |X&#x5B;k]|\n\n    freq_Hz = np.fft.fftfreq(N,dt) # frecuencias en Hz\n    mitad = int(N\/2)\n    \n\n    # Convolucion en dominio de frecuencia\n    Yk = Hk*Xk\n    yn = np.fft.ifft(Yk,n=N)\n    yn_re = np.real(yn)\n    yn_im = np.imag(yn)\n\n# SALIDA\nif N&gt;=L:\n    print('k0x:',k0x,'; i:',mitad+k0x)\n    print('freq_Hz:',freq_Hz&#x5B;k0x],\n          '; Xk&#x5B;k0x]:',Xk&#x5B;k0x])\n    print('&#x5B; i, freq&#x5B;ki],|X&#x5B;k]| ,X&#x5B;k]]')\n    kmin = k0x-4 ; kmax = k0x+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]])\n    print()\n    print('k0h:',k0h,'; i:',mitad+k0h)\n    print('freq_Hz:',freq_Hz&#x5B;k0h],\n          '; Hk&#x5B;k0h]:',Hk&#x5B;k0h])\n    print('&#x5B; i, freq&#x5B;ki],|H&#x5B;k]| ,H&#x5B;k]]')\n    kmin = k0h-4 ; kmax = k0h+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],Hkmagn&#x5B;i],Hk&#x5B;i]])\n        \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(311)\n    plt.stem(np.real(xn),label='Re(x&#x5B;n])',\n             markerfmt ='C2.',linefmt='C2-')\n    plt.stem(L,0,markerfmt ='C3.')\n    plt.xlabel('ti (s)')\n    \n    plt.title('Convoluci\u00f3n entre x&#x5B;n],H&#x5B;n]'+LN_texto)\n    plt.legend()\n\n    plt.subplot(312)\n    plt.stem(np.real(hn),label='Re(h&#x5B;n])',\n             markerfmt ='C1.',linefmt='C1-')\n    plt.stem(L,0,markerfmt ='C1.')\n    plt.xlabel('ti (s)')\n    plt.legend()\n\n    plt.subplot(313)\n    plt.stem(np.real(yn),label='Re(y&#x5B;n])',\n             markerfmt ='C0.',linefmt='C0-')\n    plt.stem(L,0,markerfmt ='C0.')\n    plt.xlabel('ti (s)')\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>IDFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">periodicidad<\/a><\/p>\n\n\n\n<p><a href=\"#convolucion\">convoluci\u00f3n<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>IDFT: periodicidad convoluci\u00f3n 1. Peri\u00f3dicidad Referencia: McClellan 8.3.1 p319 La sumatoria de IDFT tambi\u00e9n tiene propiedad e periodicidad. Considera evaluar una funci\u00f3n en n+N, con n en el intervalo 0\u2264n\u2264N-1: un factor exponencial se convierte en 1, quedando 1. 1 Ejemplo: IDFT de impulso desplazado Para una se\u00f1al de L=N=10 puntos x[n]=\u03b4[n-14] tendr\u00e1 una DFT: [&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-454","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\/454","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=454"}],"version-history":[{"count":3,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/454\/revisions"}],"predecessor-version":[{"id":20635,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/454\/revisions\/20635"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}