USAC, Fac. Ing., Aplic. 2N, Prof. J. Saquimux, Aux. C. Pérez (Borrador)

Anuncio
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
Descargar