USAC, Fac. Ing., Aplic. 2N, Prof. J. Saquimux, Aux. C. Pérez (Borrador) Ejemplo 1 Encontremos la serie de Fourier en tiempo discreto de la onda periódica cuadrada para tiempo discreto mostrada en la figura 𝑓[𝑛] 𝑁 = 10 1 3 -2 -1 0 1 4 5 6 7 13 2 8 9 10 11 12 𝑛 -1 𝑁 = 10 Calculo analítico a mano Esta señal tiene periodo 𝑁 = 10. Para calcular los coeficientes de Fourier, se debe sumar 𝑛 sobre cualesquiera 10 valores consecutivos de 𝑓[𝑛]; de 0 a 9, o de −1 a 8, o de −2 a 7, etc. Por simplicidad seleccionemos de −2 a 7. 1 𝑓 𝑘 = 𝑁 1 = 10 𝑁−1 𝑓𝑛𝑒 −2𝜋𝑖 𝑛𝑘 𝑁 𝑛=0 7 𝑓𝑛𝑒 −𝜋𝑖 𝑛𝑘 5 𝑛=−2 1 = 10 1 = 10 9 𝑓𝑛𝑒 −2𝜋𝑖 𝑛𝑘 10 𝑛=0 2 𝑒 −𝜋𝑖 𝑛𝑘 5 1 = 10 7 − 𝑛=−2 𝑒 −𝜋𝑖 𝑛𝑘 5 𝑛=3 7 𝑛𝑘 𝑓 𝑛 𝑒 −2𝜋𝑖 10 , 𝑘 = 0, 1, ⋯ ,9 𝑛=−2 2 1 = 10 𝑒 −𝜋𝑖 𝑛𝑘 5 2 𝑒 −𝜋𝑖 − 𝑛=−2 (𝑛+5)𝑘 5 𝑛=−2 Cambiando límites 1 = 10 2 𝑒 −𝜋𝑖 𝑛𝑘 5 2 − 𝑛=−2 𝑒 −𝜋𝑖 𝑒 −𝜋𝑖𝑘 𝑛=−2 1 = 10 1 = 10 𝑛𝑘 5 2 𝑒 𝑛=−2 −𝜋𝑖 𝑛𝑘 5 2 𝑒 −𝜋𝑖 1 = 10 𝑛𝑘 5 2 𝑒 −𝜋𝑖 𝑛𝑘 5 − 𝑒 −𝜋𝑖 𝑛𝑘 5 𝑒 −𝜋𝑖𝑘 𝑛=−2 1 − 𝑒 −𝜋𝑖𝑘 𝑛=−2 1 1 − cos𝜋𝑘 + 𝑖sin𝜋𝑘 = 10 2 𝑒 −𝜋𝑖 𝑛=−2 Cero para todo 𝑘 entero 𝑛𝑘 5 1 − cos𝜋𝑘 1 para 𝑘 = 0, 2, 4, 6 𝑦 8 -1 para 𝑘 = 1, 3, 5, 7 𝑦 9 Ejemplo, serie de Fourier en tiempo discreto 𝑓 𝑘 = 2 10 2 𝑒 −𝜋𝑖 𝑛𝑘 5 𝑛=−2 1 = 5 2 𝑒 −𝜋𝑖 𝑘 = 1, 3, 5,7 𝑦 9 𝑛=−2 0, 𝑘 = 0, 2, 6, 𝑦 8 La suma 2 1 𝑓 𝑘 = 5 𝑒 −𝜋𝑖 𝑛𝑘 5 , 𝑘 = 1, 3, 5,7 𝑦 9 𝑛=−2 Se puede reescribir como 1 𝑓 [2𝑟 + 1] = 5 𝑛𝑘 5 , 2 𝑒 −𝜋𝑖 𝑛(2𝑟+1) 5 , 𝑟 = 0, 1, 2, 3 𝑦 4 𝑛=−2 Usando la fórmula para la suma finita (se demuestra en variable compleja), 𝑞 𝑒 −𝑖𝜔𝑛 𝑛=−𝑞 Puesto que en la suma 1 sin ω 𝑞 + 2 , 𝜔 ≠ 2𝜋𝑚, 𝜔 = sin 2 2𝑞 + 1, 𝜔 = 2𝜋𝑚, 2 𝑒 −𝑖𝜋 (2𝑟+1) 𝑛 5 , 𝑚 𝑒𝑛𝑡𝑒𝑟𝑜 𝑚 𝑒𝑛𝑡𝑒𝑟𝑜 𝑟 = 0, 1, 2, 3 𝑦 4, 𝑛=−2 (2𝑘+1) (2𝑟+1) 𝜔 = 𝜋 5 , la no igualdad de la fórmula 𝜔 = 𝜋 5 ≠ 2𝜋𝑚 implica que 2𝑟 + 1 ≠ 10𝑚 la cual siempre se cumple para todo entero 𝑚 con 𝑟 = 0, 1, 2, 𝑦 4; pues el lado izquierdo siempre es impar y el lado derecho es par, por lo que la suma se reduce a solamente 1 si 𝑟 es 0, 2 y 4; -1 si 𝑟 es 1 y 3. 2𝑟 + 1 1 sin 𝜋 1 (−1)𝑟 2 = = , 𝑟 = 0, 1, 2, 3 𝑦 4 2𝑟 + 1 2𝑟 + 1 5 5 sin 𝜋 sin 𝜋 𝑛=−2 10 10 Esta expresión se puede reescribir como 𝑘 2 𝑘 1 1 sin 𝜋 2 1 (−1)𝑘 −𝑖𝜋 𝑛 𝑓 𝑘 = 𝑒 5 = = , 𝑘 = 1, 3, 5, 7 𝑦 9 5 5 sin 𝜋 𝑘 5 sin 𝜋 𝑘 𝑛=−2 10 10 1 𝑓 2𝑟 + 1 = 5 2 2𝑟+1 𝑒 −𝑖𝜋 5 𝑛 Por lo que finalmente tenemos 1 (−1)𝑘 , 5 sin 𝜋 𝑘 𝑓 𝑘 = 10 0, 𝑘 = 1, 3, 5, 7 𝑦 9 𝑘 = 0, 2, 6, 𝑦 8 2 Ejemplo, serie de Fourier en tiempo discreto Evaluando, tenemos los coeficientes, 𝑘 𝑓 [𝑘] 0 0.6472 0 -0.2472 0 0.2 0 -0.2472 0 0.6472 0 1 2 3 4 5 6 7 8 9 La grafica del espectro de amplitud (coeficientes 𝑓 [𝑘] en función de 𝑘) es 𝑓 [𝑘] -11 -7 -10 -9 -8 -3 -6 -5 -4 3 -2 -1 0 1 2 7 4 5 6 11 8 9 10 12 13 𝑘 |𝑓 [𝑘]| -12 -13 -10 -11 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 𝑘 Podemos recuperar los valores de 𝑓[𝑛], usando los valores de 𝑓 [𝑘] calculados, con la fórmula inversa, 𝑁−1 𝑛𝑘 𝑓 𝑘 𝑒 2𝜋𝑖 𝑁 𝑓𝑛 = 𝑘=0 Por ejemplo para 𝑓[0], sustituyendo los valores de la tabla 9 𝑓0 = 𝑓 𝑘𝑒 2𝜋𝑖 0×𝑘 10 𝑘=0 9 = 𝑓 𝑘 = 2 0.6472 − 0.2472 + 0.2 = 1 𝑘=0 1 3 Ejemplo, serie de Fourier en tiempo discreto Para 𝑓[1] 9 𝑘 1 3 5 7 9 𝑓 𝑘 𝑒 2𝜋𝑖 10 = 𝑓 [1] 𝑒 2𝜋𝑖 10 + 𝑓 3 𝑒 2𝜋𝑖 10 + 𝑓 5 𝑒 2𝜋𝑖 10 + 𝑓 7 𝑒 2𝜋𝑖 10 + 𝑓 [9]𝑒 2𝜋𝑖 10 𝑓1 = 𝑘=0 1 3 5 7 9 = 0.6472𝑒 2𝜋𝑖 10 − 0.2472𝑒 2𝜋𝑖 10 + 0.2𝑒 2𝜋𝑖 10 − 0.2472𝑒 2𝜋𝑖 10 + 0.6472𝑒 2𝜋𝑖 10 = 1 Etc. Calculo con programa desarrollado en Python (el programa se muestra al final) El programa calcula la sumatorias 𝑓 [𝑘] y 𝑓[𝑛] para 𝑁 = 10 y grafica las partes real, imaginaria y módulo de 𝑓 [𝑘], y grafica la señal discreta en el tiempo 𝑓[𝑛]. Modulo de f[k] fk[0] = 0.000 fk[1] = 0.647 fk[2] = 0.000 fk[3] = 0.247 fk[4] = 0.000 fk[5] = 0.200 fk[6] = 0.000 fk[7] = 0.247 fk[8] = 0.000 fk[9] = 0.647 fk[10] = 0.000 Graficas 4 Ejemplo, serie de Fourier en tiempo discreto Note que la parte imaginaria aparece de orden de 10−16 , estos valores se generan por los cálculos numéricos que ejecuta el programa en Python. Sus valores exactos son cero. Recuperación de valores de 𝑓[𝑛] con la inversa: 𝑁−1 𝑛𝑘 𝑓 𝑘 𝑒 2𝜋𝑖 𝑁 𝑓𝑛 = 𝑛=0 fn[0] fn[1] fn[2] fn[3] fn[4] fn[5] fn[6] fn[7] fn[8] fn[9] = = = = = = = = = = 1.000 1.000 1.000 -1.000 -1.000 -1.000 -1.000 -1.000 1.000 1.000 Gráfica de 𝑓[𝑛] Graficas de 𝑓 [𝑘] y 𝑓[𝑛] usando el comando fft e ifft de Python (ver programa al final) Definiendo la función continua 𝑓[𝑥] con la función escalón unitario 𝐻(𝑥) y generando una lista de 𝑁 = 27 , datos-muestras consecutivos. 𝑓[𝑥] = (𝐻(𝑥) − 𝐻(𝑥 − 𝑁/4)) − (𝐻(𝑥 − 𝑁/4) − 𝐻(𝑥 − 3𝑁/4)) + (𝐻(𝑥 − 3𝑁/4) − 𝐻(𝑥 − 𝑁)) 5 Ejemplo, serie de Fourier en tiempo discreto Calculo de 𝑓 [𝑘] para 𝑁 = 10 con Wolfram alpha Con el comando Fourier[{1, 1, 1, −1, −1, −1, −1, −1, 1, 1}] Se obtienen los valores, {0, 2.04667, 0, −0.781758, 0, 0.632456, 0, −0.781758, 0, 2.04667} Calculo de 𝑓[𝑛] usando los 𝑓 [𝑘], con el comando InverseFourier[{0, 2.04667, 0, −0.7817, 0, 0.6324, 0, −0.7817, 0, 2.04667}] Se obtienen {1.00002 +0. ,1.00001 +0. ,0.999953 +7.02167×10-17 ,0.999953+7.02167×10-17 ,-1.00001+0. ,-1.00002+0. ,-1.00001+0. ,0.999953-7.02167×10-17 ,0.999953 -7.02167×10-17 ,1.00001 +0. } Que aproximan a la señal original. Note que los valores de 𝑓[𝑘] obtenidos con el Wolfram alpha son proporcionales a los calculados con la sumatoria: 6 Ejemplo, serie de Fourier en tiempo discreto {0,0.647, 0, -0.247, 0, 0.200, 0, -0.247, 0, 0.647} 2.04667 0.647 = −0.7817 −0.247 = 0.6324 0.200 = 3.16 Programa en Python para calcular y graficar 𝑓 [𝑘] y 𝑓[𝑛] para 𝑁 = 10 # Calcula la serie discreta de Fourier(o transformada discreta de Fourier) # f[k] k = 0, 1,... N-1, del vector f[n] n = 0, 1, ... N - 1 # Grafica Re(f[k]), Im(f[k]), Abs(f[k]) # Calcula el vector f[n] (con la inversa) y grafica f[n] # f(t) = 1, -2 <= t <= 2; -1, 3 <= t <= 7; T = N = 10. from math import* from cmath import* N = 10 # ingrese periodo F = [] print 'Modulo de f[k]' for k in range(N + 1): Fn = 0 for m in range(-2, 3): Fn += (exp(-2*pi*1j*m*k/10.0)- exp(-2*pi*1j*(m+5)*k/10.0)) Fn = Fn/float(10) F.append(Fn) y = abs(F[k]) print 'X[%d] = %0.3f' %(k, y) for i in range(N + 1): def ax(s): return i + 0*s def ay(s): return s*(F[i]) def ar(s): return s*F[i].real def ai(s): return s*F[i].imag from pylab import* s = linspace(0, 1, 100) u = ax(s); v = abs(ay(s)); vr = ar(s); vi = ai(s) figure(1) subplot(311) plot(u, vr, 'b') title('Parte real, parte imaginaria y modulo de f[k]') ylabel('Re[x[k]]') grid(True) subplot(312) plot(u, vi, 'r') ylabel('Im[x[k]]') grid(True) subplot(313) xlabel('k') ylabel('Abs[x[k]]') grid(True) plot(u, v, 'k') show() 7 Ejemplo, serie de Fourier en tiempo discreto print '----------------------' print 'Valores de f[n]' X = [] for n in range(N): Xn = 0 for k in range(N): Xn += F[k]*exp(2*pi*1j*n*k/10.0) X.append(Xn) x = X[n] print 'X[%d] = %0.3f' %(n, x) for i in range(N): def an(s): return i + 0*s def yn(s): return s*(X[i]) from pylab import* s = linspace(0, 1, 100) u = an(s); v = yn(s) plot(u, v, 'b') title('Tren de pulsos en tiempo discreto f[n]') ylabel('x[n]') xlabel('n') axis([-2, 11, -1.5, 1.5]) grid(True) show() Graficas de 𝑓 [𝑘] y 𝑓[𝑛] usando los comandos fft e ifft de Python # graficas f[k] y f[n] usando fft de g(x) y la ifft from math import*; from numpy import*; from scipy import*; from pylab import* N = 2**7 # Ingrese el periodo como potencia de 2 def H(x): return where(x < 0, 0.0, 1) def g(x): return (H(x)-H(x-N/4.0))-(H(x-N/4.0)-H(x-3*N/4.0))+(H(x-3*N/4.0)-H(xN)) xlista = arange(N) ylista = [g(x) for x in xlista] zlista = fft(ylista) figure(1) subplot(211) plot(xlista[0:N], abs(zlista[0:N])) title('Graficas abs(f[k]) y f[n]') ylabel('f[k], fft(n)') xlabel('k') grid('True') subplot(212) plot(xlista[0:N], ifft(zlista)[0:N]) ylabel('f[n], ifft(n)') xlabel('n') grid('True') show() 8