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 4 5 6 7 13 -2 -1 0 1 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 𝑁 𝑓 𝑛 𝑒 −2𝜋𝑖𝑛𝑘𝑁 𝑁−1 𝑛=0 = 1 10 𝑓 𝑛 𝑒 −2𝜋𝑖𝑛𝑘10 9 𝑛=0 = 1 10 𝑓 𝑛 𝑒 −2𝜋𝑖𝑛𝑘10 7 𝑛=−2 , 𝑘 = 0, 1, ⋯ ,9 = 1 10 𝑓 𝑛 𝑒 −𝜋𝑖𝑛𝑘5 7 𝑛=−2 = 1 10 𝑒 −𝜋𝑖𝑛𝑘5 2 𝑛=−2 − 𝑒−𝜋𝑖𝑛𝑘5 7 𝑛=3 = 1 10 𝑒 −𝜋𝑖𝑛𝑘5 2 𝑛=−2 − 𝑒−𝜋𝑖(𝑛+5)𝑘5 2 𝑛=−2 Cambiando límites = 1 10 𝑒 −𝜋𝑖𝑛𝑘5 2 𝑛=−2 − 𝑒−𝜋𝑖𝑛𝑘5 2 𝑛=−2 𝑒−𝜋𝑖𝑘 = 1 10 𝑒 −𝜋𝑖𝑛𝑘5 − 𝑒−𝜋𝑖𝑛𝑘5𝑒−𝜋𝑖𝑘 2 𝑛=−2 = 1 10 𝑒 −𝜋𝑖𝑛𝑘5 1 − 𝑒−𝜋𝑖𝑘 2 𝑛=−2 = 1 10 𝑒 −𝜋𝑖𝑛𝑘5 1 − cos𝜋𝑘 + 𝑖sin𝜋𝑘 2 𝑛=−2 = 1 10 𝑒 −𝜋𝑖𝑛𝑘5 1 − cos𝜋𝑘 2 𝑛=−2
Cero para todo 𝑘 entero 1 para 𝑘 = 0, 2, 4, 6 𝑦 8 -1 para 𝑘 = 1, 3, 5, 7 𝑦 9
2 𝑓 𝑘 = 2 10 𝑒 −𝜋𝑖𝑛𝑘5 = 2 𝑛=−2 1 5 𝑒 −𝜋𝑖𝑛𝑘5, 𝑘 = 1, 3, 5,7 𝑦 9 2 𝑛=−2 0, 𝑘 = 0, 2, 6, 𝑦 8 La suma 𝑓 𝑘 = 1 5 𝑒 −𝜋𝑖𝑛𝑘5, 𝑘 = 1, 3, 5,7 𝑦 9 2 𝑛=−2
Se puede reescribir como 𝑓 [2𝑟 + 1] =1 5 𝑒 −𝜋𝑖𝑛(2𝑟+1)5 , 𝑟 = 0, 1, 2, 3 𝑦 4 2 𝑛=−2
Usando la fórmula para la suma finita (se demuestra en variable compleja),
𝑒−𝑖𝜔𝑛 𝑞 𝑛=−𝑞 = sin ω 𝑞 +12 sin 𝜔2 , 𝜔 ≠ 2𝜋𝑚, 𝑚 𝑒𝑛𝑡𝑒𝑟𝑜 2𝑞 + 1, 𝜔 = 2𝜋𝑚, 𝑚 𝑒𝑛𝑡𝑒𝑟𝑜 Puesto que en la suma
𝑒−𝑖𝜋(2𝑟+1)5 𝑛, 𝑟 = 0, 1, 2, 3 𝑦 4 2 𝑛=−2 , 𝜔 = 𝜋(2𝑘+1) 5 , la no igualdad de la fórmula 𝜔 = 𝜋 (2𝑟+1) 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 5 𝑒 −𝑖𝜋 2𝑟+1 5 𝑛 = 2 𝑛=−2 1 5 sin 𝜋 2𝑟 + 1 2 sin 𝜋 2𝑟 + 1 10 =1 5 (−1)𝑟 sin 𝜋 2𝑟 + 1 10 , 𝑟 = 0, 1, 2, 3 𝑦 4 Esta expresión se puede reescribir como
𝑓 𝑘 =1 5 𝑒−𝑖𝜋𝑘5𝑛= 2 𝑛=−2 1 5 sin 𝜋𝑘2 sin 𝜋10 𝑘 = 1 5 (−1)𝑘 sin 𝜋10 𝑘 , 𝑘 = 1, 3, 5, 7 𝑦 9 Por lo que finalmente tenemos
𝑓 𝑘 = 1 5 (−1)𝑘 sin 𝜋10 𝑘 , 𝑘 = 1, 3, 5, 7 𝑦 9 0, 𝑘 = 0, 2, 6, 𝑦 8
3 Evaluando, tenemos los coeficientes,
𝑘 𝑓 [𝑘] 0 0 1 0.6472 2 0 3 -0.2472 4 0 5 0.2 6 0 7 -0.2472 8 0 9 0.6472
La grafica del espectro de amplitud (coeficientes 𝑓 [𝑘] en función de 𝑘) es 𝑓 [𝑘] -11 -7 -3 3 7 11 -10 -9 -8 -6 -5 -4 -2 -1 0 1 2 4 5 6 8 9 10 12 13 𝑘 |𝑓 [𝑘]| -12 -10 -13 -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,
𝑓 𝑛 = 𝑓 𝑘 𝑒2𝜋𝑖𝑛𝑘𝑁 𝑁−1
𝑘=0
Por ejemplo para 𝑓[0], sustituyendo los valores de la tabla 𝑓 0 = 𝑓 𝑘 𝑒2𝜋𝑖0×𝑘10 = 𝑓 𝑘 9 𝑘=0 9 𝑘=0 = 2 0.6472 − 0.2472 + 0.2 = 1 1
4 Para 𝑓[1] 𝑓 1 = 𝑓 𝑘 𝑒2𝜋𝑖 𝑘10 = 𝑓 [1] 9 𝑘=0 𝑒2𝜋𝑖 110+ 𝑓 3 𝑒2𝜋𝑖 310+ 𝑓 5 𝑒2𝜋𝑖 510+ 𝑓 7 𝑒2𝜋𝑖 710+ 𝑓 [9]𝑒2𝜋𝑖 910 = 0.6472𝑒2𝜋𝑖 110− 0.2472𝑒2𝜋𝑖 310+ 0.2𝑒2𝜋𝑖 510 − 0.2472𝑒2𝜋𝑖 710 + 0.6472𝑒2𝜋𝑖 910 = 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
5 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:
𝑓 𝑛 = 𝑓 𝑘 𝑒2𝜋𝑖𝑛𝑘𝑁 𝑁−1 𝑛=0 fn[0] = 1.000 fn[1] = 1.000 fn[2] = 1.000 fn[3] = -1.000 fn[4] = -1.000 fn[5] = -1.000 fn[6] = -1.000 fn[7] = -1.000 fn[8] = 1.000 fn[9] = 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.
6 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:
7
{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.16Programa 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()
8 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(x-N)) 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()