{"id":362,"date":"2024-12-20T06:03:36","date_gmt":"2024-12-20T11:03:36","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/telg1034\/?p=362"},"modified":"2026-03-27T21:23:43","modified_gmt":"2026-03-28T02:23:43","slug":"dft-propiedades-fft-con-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/dsp-unidades\/dft-propiedades-fft-con-python\/","title":{"rendered":"3.3 DFT - Propiedades - FFT con Python"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>DFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">peri\u00f3dicas<\/a><\/p>\n\n\n\n<p><a href=\"#freqneg\">freq negativas<\/a><\/p>\n\n\n\n<p>simetr\u00eda <a href=\"#conjugada\">conjugada<\/a><\/p>\n\n\n\n<p><a href=\"#zeropadding\" data-type=\"internal\" data-id=\"#zeropadding\">zero padding<\/a><\/p>\n\n\n\n<p><a href=\"#dftcos\">ejemplo_cos<\/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. Periodicidad<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 8.2.1 p311<\/p>\n\n\n\n<p>La DFT de una secuencia finita de N-puntos es una versi\u00f3n discreta de DTFT:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X[k] = \\sum_{n=0}^{N-1} x[n] e^{-j(2\\pi k\/N)}<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = X\\Big( e^{j\\omega} \\Big) \\Big|_{\\omega=(2\\pi k\/N)}<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = X\\Big( e^{j (2\\pi k\/N)}\\Big) <\/span>\n\n\n\n<p class=\"has-text-align-center\">k= 0, 1, ..., N-1<\/p>\n\n\n\n<p>Dado que DTFT X(e<sup>j\u03c9<\/sup>) es siempre peri\u00f3dica con periodo 2\u03c0, la DFT X[k] debe ser por lo tanto tambi\u00e9n peri\u00f3dica. Esto implica que el \u00edndice k se mantiene siempre entre 0 y N-1, sin afectar ser evaluado para k\u2265N o k&lt;0.<\/p>\n\n\n\n<p>Considere que \u03c9 + 2\u03c0 = 2\u03c0k\/N + 2\u03c0(N\/N) = 2\u03c0(k+N)\/N = \u03c9<sub>k+N<\/sub><br>que implica que los coeficientes X[k] tienen periodo igual a N. Por lo que no se considera necesario m\u00e1s c\u00e1lculos X[k] fuera del intervalo 0\u2264k&lt;N.<\/p>\n\n\n\n<p class=\"has-text-align-center\">X[k] = X[k+N]<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>DFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">peri\u00f3dicas<\/a><\/p>\n\n\n\n<p><a href=\"#freqneg\">freq negativas<\/a><\/p>\n\n\n\n<p>simetr\u00eda <a href=\"#conjugada\">conjugada<\/a><\/p>\n\n\n\n<p><a href=\"#zeropadding\" data-type=\"internal\" data-id=\"#zeropadding\">zero padding<\/a><\/p>\n\n\n\n<p><a href=\"#dftcos\">ejemplo_cos<\/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=\"freqneg\">2. Frecuencias Negativas y DFT<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 8.2.2 p311, 8.2.3.1 p313<\/p>\n\n\n\n<p>Todos los resultados de DFT y IDFT tienen \u00edndices no negativos por ser convenientes para los c\u00e1lculos y expresiones matem\u00e1ticas. Para la gr\u00e1fica de espectro de frecuencias se espera utilizar frecuencias positivas y negativas, con simetr\u00eda en las conjugadas cuando la se\u00f1al es tipo real.<\/p>\n\n\n\n<p>Cuando la DFT de tama\u00f1o N, siendo N par, la transformada X[k] tiene un valor a k=N\/2. Cuando N es impar, lo indicado no aplica. El \u00edndice k=N\/Se&nbsp; corresponde a una frecuencia normalizada \u03c9=2\u03c0(N\/2)\/N)=\u03c0. Sin embargo los valores en el espectro son de periodos 2\u03c0, siendo \u03c9=-\u03c0 un alias de \u03c9=\u03c0.<\/p>\n\n\n\n<p>Si se realiza la gr\u00e1fica de forma centrada, la frecuencia esta entre [-\u03c0, \u03c0]<\/p>\n\n\n\n<p>En Python el desplazamiento de los \u00edndices se puede realizar usando <code>np.fft.fftshift()<\/code> que ubica el centro en la muestra N\/2, siempre que N sea par.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>DFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">peri\u00f3dicas<\/a><\/p>\n\n\n\n<p><a href=\"#freqneg\">freq negativas<\/a><\/p>\n\n\n\n<p>simetr\u00eda <a href=\"#conjugada\">conjugada<\/a><\/p>\n\n\n\n<p><a href=\"#zeropadding\" data-type=\"internal\" data-id=\"#zeropadding\">zero padding<\/a><\/p>\n\n\n\n<p><a href=\"#dftcos\">ejemplo_cos<\/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=\"conjugada\">3. Simetr\u00eda conjugada de DFT<\/h2>\n\n\n\n<p>Para una se\u00f1al x[n] de tipo real, existe la simetr\u00eda conjugada en la DTFT, los coeficientes deben satisfacer la propiedad:<\/p>\n\n\n\n<p class=\"has-text-align-center\">X[-1]&nbsp; = X<sup>*<\/sup>[1]<br>X[-2]&nbsp; = X<sup>*<\/sup>[2]<br>...<br>X[-k]&nbsp; = X<sup>*<\/sup>[k]<\/p>\n\n\n\n<p>La DFT de una se\u00f1al real satisface:<\/p>\n\n\n\n<p class=\"has-text-align-center\">X[N-k] = X<sup>*<\/sup>[k]<br>k = 0, 1, ..., N-1<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>DFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">peri\u00f3dicas<\/a><\/p>\n\n\n\n<p><a href=\"#freqneg\">freq negativas<\/a><\/p>\n\n\n\n<p>simetr\u00eda <a href=\"#conjugada\">conjugada<\/a><\/p>\n\n\n\n<p><a href=\"#zeropadding\" data-type=\"internal\" data-id=\"#zeropadding\">zero padding<\/a><\/p>\n\n\n\n<p><a href=\"#dftcos\">ejemplo_cos<\/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=\"zeropadding\">4. Relleno de ceros - Zero Padding<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 8.2.4 p314<\/p>\n\n\n\n<p>Para suavizar una gr\u00e1fica de una DTFT como respuesta de frecuencia, se necesita muestras de frecuencia con tama\u00f1os de paso peque\u00f1os. De forma impl\u00edcita, la DFT asume que la longitud o tama\u00f1o de la transformada es igual al tama\u00f1o&nbsp; o longitud de la se\u00f1al L, por lo que la DFT de L puntos calcula las muestras de DTFT para (\u03c9=2\u03c0\/L)k, siendo k=0,1,...,L-1. Las L muestras de frecuencia son con espacios iguales en el intervalo 0\u2264\u03c9\u22642\u03c0, con resultado:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> H[k] = H \\Big( e^{j(2\\pi \/L)k} \\Big) = H \\Big( e^{j\\omega}\\Big) \\Big|_{\\omega=(2\\pi\/L)\/k}<\/span>\n\n\n\n<p class=\"has-text-align-center\">k = 0, 1, ..., L-1<\/p>\n\n\n\n<p>Para disponer de&nbsp; muestras de frecuencia a espacios menores que (2\u03c0\/N) donde N&gt;L, una forma sencilla es <strong>rellenar con ceros<\/strong> o <strong>zero-padding<\/strong>. Con lo que la se\u00f1al se alarga antes de realizar el c\u00e1lculo para la DFT de N puntos.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> h_{zp}[n] = \\begin{cases} h[n] &amp; n=\\text {0, 1, ..., L-1} \\\\0 &amp; n= L, L+1, ... , N-1 \\end{cases} <\/span>\n\n\n\n<h2 class=\"wp-block-heading\">4.1 Ejemplo: Respuesta de frecuencias con DFT con zero-padding<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 8.4 p315<\/p>\n\n\n\n<p>Suponer que requiere una gr\u00e1fica de respuesta de frecuencia de un filtro FIR de 8 puntos. Para evaluar la respuesta de frecuencia con mejor resoluci\u00f3n mediante tama\u00f1os de paso mas peque\u00f1os entre frecuencias, se usar\u00e1 relleno con ceros o zero-padding, usando un n\u00famero par en N, por ejemplo N=80.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_rect_zeropaddingL16N80.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_rect_zeropaddingL16N80.png\" alt=\"fft rect zeropadding L=16 N=80\" class=\"wp-image-431\" \/><\/a><\/figure>\n\n\n\n<p><br>En el caso que N=40, el resultado tiene menor resoluci\u00f3n considerando que el intervalo \u03c9 se mantiene entre [-\u03c0, \u03c0]<\/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\/fft_rect_zeropaddingL16N40.png\" alt=\"fft rect zero padding L16 N40\" class=\"wp-image-20631\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>DFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">peri\u00f3dicas<\/a><\/p>\n\n\n\n<p><a href=\"#freqneg\">freq negativas<\/a><\/p>\n\n\n\n<p>simetr\u00eda <a href=\"#conjugada\">conjugada<\/a><\/p>\n\n\n\n<p><a href=\"#zeropadding\" data-type=\"internal\" data-id=\"#zeropadding\">zero padding<\/a><\/p>\n\n\n\n<p><a href=\"#dftcos\">ejemplo_cos<\/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\">4.2 Algoritmo en Python<\/h3>\n\n\n\n<p>El filtro FIR se puede realizar usando un rect\u00e1ngulo con funciones escal\u00f3n o Heaviside(n), luego evaluando para las muestras ti.<\/p>\n\n\n\n<p>Para obtener la DFT se usa <code>np.fft.fft(xn, n=N)<\/code>, si n es menor que el tama\u00f1o de la se\u00f1al de entrada, la entrada se trunca. Si&nbsp; es mas grande, se usa zero-padding para completar las muestras. Por lo que la instrucci\u00f3n de Numpy contempla el uso de zero-padding, lo que simplifica el uso del algoritmo presentado de forma did\u00e1ctica paso a paso.<\/p>\n\n\n\n<p>El centrado del espectro de frecuencias se puede realizar usando un desplazamiento de \u00edndices <code>ki_shift<\/code>.<\/p>\n\n\n\n<p>El resultado del algoritmo, con X[k] centrada, se presenta como:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>k0: 0 ; i: 40\nfreq_Hz: 0.0 ; Xk&#091;k0]: (8+0j)\n&#091; i, freq&#091;ki],|X&#091;k]| ,X&#091;k]]\n&#091;0, 0.0, 8.0, (8+0j)]\n&#091;1, 0.0125, 7.871076020105053, (7.575558332074842-2.1365284158195137j)]\n&#091;2, 0.025, 7.491613901992368, (6.387650908672175-3.914357511197061j)]\n&#091;3, 0.037500000000000006, 6.883060301425795, (4.672226464156024-5.054386113140136j)]\n...<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Instrucciones en Python<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# ejemplo 8.4 p315 DFT zero-padding\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 = 1\/16  # frecuencia fundamental de se\u00f1al\nancho = 0.5*(1\/f0) # ancho del impulso rectangular\nxt = lambda t: np.heaviside(t,1)-np.heaviside(t-ancho,1)\n\n# para DFT\nN = 80 #2*L # N par mayor que L, tramos DFT\n\n# PROCEDIMIENTO\n# muestreo de se\u00f1al x&#x5B;n]\nt0 = 0 ; tn = 1*(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    # ki indices de orden\n    ki = np.arange(0,N,1)\n    ki_shift = np.copy(ki)\n    ki_shift&#x5B;mitad:] = ki&#x5B;mitad:]-N\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(311)\n    plt.stem(ki&#x5B;0:len(xn)],np.real(xn),label='x&#x5B;n]',\n             markerfmt ='C2.',linefmt='C2-')\n    if N&gt;L:\n        kj = np.arange(L,N,dt)\n        zp = np.zeros(N-L)\n        plt.stem(kj,zp,label = 'zero padding',\n                 markerfmt ='C3.')\n    plt.xlabel('ki')\n    \n    plt.title('x&#x5B;n] vs |x&#x5B;k]|'+LN_texto+', '+zp_texto)\n    plt.legend()\n\n    plt.subplot(312)\n    plt.stem(ki&#x5B;0:mitad], Xkmagn&#x5B;0:mitad],\n             label='X&#x5B;k], k_=&#x5B;0:N\/2]',\n             markerfmt ='C0.', linefmt='C0-')\n    plt.stem(ki&#x5B;mitad:], Xkmagn&#x5B;mitad:],\n             label='X&#x5B;k], k_=&#x5B;N\/2:]',\n             markerfmt ='C1.',linefmt='C1-')\n    plt.stem(N,0,markerfmt ='C3.')\n    plt.xlabel('ki_')\n    plt.legend()\n\n    plt.subplot(313)\n    plt.stem(ki_shift&#x5B;0:mitad], Xkmagn&#x5B;0:mitad],\n             label='H&#x5B;k] centrada]',\n             markerfmt ='C0.',linefmt='C0-')\n    plt.stem(ki_shift&#x5B;mitad:], Xkmagn&#x5B;mitad:],\n             markerfmt ='C1.',linefmt='C1-')\n    plt.stem(mitad,0,markerfmt ='C3.')\n    plt.xlabel('ki')\n    plt.legend()\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 alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>DFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">peri\u00f3dicas<\/a><\/p>\n\n\n\n<p><a href=\"#freqneg\">freq negativas<\/a><\/p>\n\n\n\n<p>simetr\u00eda <a href=\"#conjugada\">conjugada<\/a><\/p>\n\n\n\n<p><a href=\"#zeropadding\" data-type=\"internal\" data-id=\"#zeropadding\">zero padding<\/a><\/p>\n\n\n\n<p><a href=\"#dftcos\">ejemplo_cos<\/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=\"dftcos\">5. DFT de una se\u00f1al Real tipo Coseno<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: McClellan 8.2.5 p316<\/p>\n\n\n\n<p>Considere la se\u00f1al de entrada x[n] coseno, de frecuencia 0.2 de forma discreta para L=50 tramos en tiempo en un intervalo de dos periodos. Para la DFT considere el caso que N=L, no se requiere relleno de ceros.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x[n] = 5 cos(2\\pi(0.1)n]<\/span>\n\n\n\n<p class=\"has-text-align-center\">n = 0, 1, ..., L-1<\/p>\n\n\n\n<p>Una se\u00f1al senoidal se puede escribir como la suma de exponenciales complejos y usar la propiedad de linealidad para encontrar el resultado.<\/p>\n\n\n\n<p>El resultado de la DFT muestra la caracter\u00edstica de simetr\u00eda donde ocurre un m\u00e1ximo (pico), en este caso en <\/p>\n\n\n\n<p>k=k<sub>0<\/sub>=1 y k=N-k<sub>0<\/sub>=50-1=49. <\/p>\n\n\n\n<p>Las correspondientes frecuencias en Hertz son -0.1 y 0.1. La altura de los picos son aproximadamente AL\/2 = 5(50)\/2 = 125.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_seno_L50N50.png\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_seno_L50N50.png\" alt=\"fft seno L=50 N=50\" class=\"wp-image-433\" \/><\/a><\/figure>\n\n\n\n<p>Resultados num\u00e9ricos con el algoritmo:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>k0: 1 ; i: 26\n<strong>freq_Hz: 0.1<\/strong> ; Xk&#091;k0]: (125+1.509903313490213e-14j)\n&#091; i, freq&#091;ki],|X&#091;k]| ,X&#091;k]]\n&#091;0, 0.0, 9.492406860545088e-15, (9.492406860545088e-15+0j)]\n<strong>&#091;1, 0.1, 125.0, (125+1.509903313490213e-14j)]<\/strong>\n&#091;2, 0.2, 4.842919552269065e-15, (-4.774353709997803e-15-8.120446056592065e-16j)]\n&#091;3, 0.30000000000000004, 3.4364294309926203e-15, (2.3207649852950894e-15-2.5343829855056534e-15j)]\n&#091;4, 0.4, 2.032850942959038e-15, (8.108973628378316e-16+1.8641159897474457e-15j)]<\/code><\/pre>\n\n\n\n<p>Para el caso que L&lt;N, el valor de N se aumenta a 8*L, N=400, el resultado del pico de frecuencia se mantiene respecto al caso anterior.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_seno_L50N400.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1857\" height=\"1023\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2024\/12\/fft_seno_L50N400.png\" alt=\"fft seno L=50 N=400\" class=\"wp-image-435\" \/><\/a><\/figure>\n\n\n\n<p>los resultados num\u00e9ricos con el algoritmo son:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>k0: 8 ; i: 208\n<strong>freq_Hz: 0.1<\/strong> ; Xk&#091;k0]: (125.00000000000001+1.554312234475219e-14j)\n&#091; i, freq&#091;ki],|X&#091;k]| ,X&#091;k]]\n&#091;4, 0.05, 53.33891994969286, (4.999999999999986+53.10405240092081j)]\n&#091;5, 0.0625, 75.60689606012141, (33.14721982316793+67.95339984018891j)]\n&#091;6, 0.07500000000000001, 96.58278363275512, (70.7485680957908+65.74856809579083j)]\n&#091;7, 0.08750000000000001, 113.74232040562568, (105.80156476944595+41.75337523593449j)]\n<strong>&#091;8, 0.1, 125.00000000000001, (125.00000000000001+1.554312234475219e-14j)]<\/strong>\n&#091;9, 0.1125, 128.94638956201757, (119.85004661115146-47.572446945521044j)]\n&#091;10, 0.125, 125.00127087574828, (90.85388423989122-85.85388423989122j)]\n&#091;11, 0.1375, 113.46542771722382, (47.653106752530654-102.97370879930693j)]<\/code><\/pre>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# ejemplo 8.7 p318 DFT zero-padding cos()\n# telg1034 DSP fiec-espol edelros@espol.edu.ec\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# INGRESO\nL = 50   # Tramos en un periodo\n\n# se\u00f1al es rectangular peri\u00f3dico rect&#x5B;n]\nf0 = 0.1  # frecuencia fundamental de se\u00f1al\nxt = lambda t: 5*np.cos(2*np.pi*f0*t)\n\n# para DFT\nN = 8*L # N par mayor que L, tramos DFT\n\n# PROCEDIMIENTO\n# muestreo de se\u00f1al x&#x5B;n]\nt0 = 0 ; tn = 1*(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    if N&gt;L:\n        tj = np.arange(L*dt,N*dt,dt)\n        zp = np.zeros(N-L)\n        plt.stem(tj,zp,label = 'zero padding',\n                 markerfmt ='C3.')\n    plt.stem(L*dt,0,markerfmt ='C4.')\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.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 alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p>DFT:<\/p>\n\n\n\n<p><a href=\"#periodicas\">peri\u00f3dicas<\/a><\/p>\n\n\n\n<p><a href=\"#freqneg\">freq negativas<\/a><\/p>\n\n\n\n<p>simetr\u00eda <a href=\"#conjugada\">conjugada<\/a><\/p>\n\n\n\n<p><a href=\"#zeropadding\" data-type=\"internal\" data-id=\"#zeropadding\">zero padding<\/a><\/p>\n\n\n\n<p><a href=\"#dftcos\">ejemplo_cos<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>DFT: peri\u00f3dicas freq negativas simetr\u00eda conjugada zero padding ejemplo_cos 1. Periodicidad Referencia: McClellan 8.2.1 p311 La DFT de una secuencia finita de N-puntos es una versi\u00f3n discreta de DTFT: k= 0, 1, ..., N-1 Dado que DTFT X(ej\u03c9) es siempre peri\u00f3dica con periodo 2\u03c0, la DFT X[k] debe ser por lo tanto tambi\u00e9n peri\u00f3dica. Esto [&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-362","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\/362","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=362"}],"version-history":[{"count":4,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/362\/revisions"}],"predecessor-version":[{"id":21463,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/362\/revisions\/21463"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}