5.2 Transformada de Fourier – Señales aperiódicas continuas en tiempo con Python

Referencia: Oppenjeim 4.1. p285, Lathi 7.2 p680

El planteamiento de Fourier es que una señal aperiódica (no periódica) puede observarse como una señal periódica con periodo infinito.

Ejercicio 1. exponencial decreciente con μ(t)

Referencia: Oppenheim Ejercicio 4.1 p290, Lathi ejemplo 7.1 p685, Hsu Ejemplo 5.2 p218

Considere la señal contínua exponencial decreciente, desarrolle la transformada de Fourier

x(t) =e^{-at} \mu (t) \text{ ; } a \gt 0

el integral a desarrollar,

X(j\omega) =\int_{-\infty}^{\infty} e^{-at} \mu (t) e^{-j \omega t} \delta t X(j\omega) =\int_{0}^{\infty} e^{-(a+j\omega)t} \delta t =-\frac{1}{a+j\omega} e^{-(a+j\omega)t} \Big|_{0}^{\infty} X(j\omega) =-\frac{1}{a+j\omega} e^{-(a+j\omega)(\infty)} +\frac{1}{a+j\omega} e^{-(a+j\omega)(0)} X(j\omega) = \frac{1}{a+j\omega}

para a>0

Se obtiene una parte real y otra imaginaria al evaluar F(w) en un intervalo que incluya -a y a.

También es posible observar la magnitud y fase de F(w) en una gráfica.

Se observa por ejemplo que el valor de la magnitud |F(0)| = 1/a. También que la fase se encuentra acotada en π/2 y que fase(F(-a)) = -π/4.

Usando el algoritmo con Python se obtiene el siguiente resultado:

 expresion f(t):
 -a*t             
e    *Heaviside(t)

 expresion F(w):
   1   
-------
a + I*w

 |F(w)|:
     1      
------------
   _________
  /  2    2 
\/  a  + w  

 F(w)_fase:
     /w\
-atan|-|
     \a/
>>>

Instrucciones en Python

# Transformada de Fourier de señales aperiodicas
# integral de Fourier
# blog.espol.edu.ec/telg1001/
import sympy as sym
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
j = sym.I ; W = sym.oo
w = sym.Symbol('w',real=True)

t = sym.Symbol('t', real=True,)
a = sym.Symbol('a', real=True,positive=True)
b = sym.Symbol('b', real=True,positive=True)
T = sym.Symbol('T', real=True,positive=True)

ft = sym.exp(-a*t)*sym.Heaviside(t) # Ej 4.1 Oppenheim
[ta,tb] = [-sym.oo,sym.oo] # Intervalo Integración

#ft = sym.exp(-a*np.abs(t)) # Ej 4.2 Oppenheim
#[ta,tb] = [-sym.oo,sym.oo] # Intervalo Integración

# parametros para grafica
a1 = 2 # valor a
T1 = 1 # valor T o periodo

# intervalo de gráfica [a_lim,b_lim]
a_tlim = -2*T1
b_tlim = 2*T1
muestras = 52

# PROCEDIMIENTO
ftw = ft*sym.exp(-j*w*t)

# integral general en intervalo t
Fw_F = sym.integrate(ftw,(t,ta,tb))
if Fw_F.is_Piecewise:
    Fw = Fw_F.args[0] # primer intervalo
    Fw = Fw[0] # expresión buscada
else:
    Fw = Fw_F
Fw = Fw.simplify()

# Magnitud y Fase
Fw_magn = sym.Abs(Fw)
Fw_fase = sym.atan(sym.im(Fw)/sym.re(Fw))

# SALIDA
print('\n expresion f(t):')
sym.pprint(ft)
print('\n expresion F(w):')
sym.pprint(Fw)
print('\n |F(w)|:')
sym.pprint(Fw_magn)
print('\n F(w)_fase:')
sym.pprint(Fw_fase)


# GRAFICA valores ----------------
# f(t)
fta = sym.lambdify(t,ft.subs({a:a1,T:T1}))
ti  = np.linspace(a_tlim,b_tlim,muestras)
fti = fta(ti)

# F(w) magnitud y fase
Fw_mg = sym.lambdify(w,Fw_magn.subs({a:a1,T:T1}))
Fw_fs = sym.lambdify(w,Fw_fase.subs({a:a1,T:T1}))
a_wlim = a1*4
wi  = np.linspace(-a_wlim,a_wlim,muestras)
Fwi_mg = Fw_mg(wi) # evalua wi
Fwi_fs = Fw_fs(wi) 
if Fw_fase.is_constant():
    Fwi_fs=np.ones(len(wi))*Fw_fase

# F(w) real e imaginaria
Fwa = sym.lambdify(w,Fw.subs({a:a1,T:T1}))
a_wlim = a1*4
wi  = np.linspace(-a_wlim,a_wlim,muestras)
Fwi = Fwa(wi) # evalua wi

# f(t) dominio t
figura, graf_fti = plt.subplots()
plt.plot(ti,fti,label='f(t)',color='blue')
plt.xlabel('t')
plt.ylabel('f(t)')
etiq = str(a1)+'; T='+str(T1)
plt.title(r'f(t) = $'+str(sym.latex(ft))+'$ ; a='+etiq)
plt.grid()

# F(w) real e imaginaria
figura, graf_Fwi = plt.subplots(2,1)

graf_Fwi[0].plot(wi,np.real(Fwi),label='Re(F(w))',
                 color='orange')
graf_Fwi[0].legend()
graf_Fwi[0].set_ylabel('Re (F(w)) ')
graf_Fwi[0].grid()

graf_Fwi[1].plot(wi,np.imag(Fwi),label='Imag(F(w))',
                 color='brown')
graf_Fwi[1].legend()
graf_Fwi[1].set_xlabel('w')
graf_Fwi[1].set_ylabel('imag(F(w))')
graf_Fwi[1].grid()

plt.suptitle(r'F(w) = $'+str(sym.latex(Fw))+'$')
# plt.show()

# F(w) magnitud y fase
figura, graf_Fw = plt.subplots(2,1)

graf_Fw[0].plot(wi,Fwi_mg,label='F(w)_magn',
                color='orange')
Fwa0 = Fw_mg(0)
Fwa1 = Fw_mg(-a1)
Fwa2 = Fw_mg(a1)
graf_Fw[0].stem(-a1,Fwa1,linefmt ='--')
graf_Fw[0].stem(a1,Fwa2,linefmt ='--')
etiqueta1 = '('+str(a1)+','+str(np.round(Fwa2,4))+')'
graf_Fw[0].annotate(etiqueta1, xy=(a1,Fwa2))
etiqueta0 = '('+str(0)+','+str(np.round(Fwa0,4))+')'
graf_Fw[0].scatter(0,Fwa0)
graf_Fw[0].annotate(etiqueta0, xy=(0,Fwa0))
graf_Fw[0].legend()
graf_Fw[0].set_ylabel('F(w) magnitud ')
graf_Fw[0].grid()

graf_Fw[1].plot(wi,Fwi_fs,label='F(w)_fase',
                 color='brown')
graf_Fw[1].axhline(np.pi/2,linestyle ='--')
graf_Fw[1].axhline(-np.pi/2,linestyle ='--')
Fwa1f = Fw_fs(-a1)
Fwa2f = Fw_fs(a1)
graf_Fw[1].stem(-a1,Fwa1f,linefmt ='--')
graf_Fw[1].stem(a1,Fwa2f,linefmt ='--')
etiqueta3 = '('+str(a1)+','+str(np.round(Fwa2f,4))+')'
graf_Fw[1].annotate(etiqueta3, xy=(a1,Fwa2f))
graf_Fw[1].legend()
graf_Fw[1].set_xlabel('w')
graf_Fw[1].set_ylabel('F(w) fase')
graf_Fw[1].grid()

plt.suptitle(r'F(w) = $'+str(sym.latex(Fw))+'$')

plt.show()

Ejercicio 2. exponencial decreciente con |t|, función par

Referencia: Oppenheim Ejercicio 4.2 p291, Lathi ejemplo 7. p685, Hsu 5.21 p248

Considere la señal contínua exponencial decreciente, desarrolle la transformada de Fourier

x(t) =e^{-a|t|} \text{ ; } a \gt 0

X(j\omega) = \int_{-\infty}^{\infty}e^{-a|t|} e^{-j \omega t} \delta t X(j\omega) = \int_{-\infty}^{0}e^{at} e^{-j \omega t} \delta t + \int_{0}^{\infty}e^{-at} e^{-j \omega t} \delta t = \int_{-\infty}^{0}e^{at-j \omega t} \delta t + \int_{0}^{\infty}e^{-at-j \omega t} \delta t = \frac{1}{at-j \omega} e^{(a-j \omega) t}\Big|_{-\infty}^{0} - \frac{1}{a+j\omega}e^{-(at+j \omega) t} \Big| _{0}^{\infty} = \Big[ \frac{1}{at-j \omega} e^{(a-j \omega) (0)} - \frac{1}{at-j \omega t} e^{(a-j \omega) (-\infty)} \Big] + - \Big[ \frac{1}{a+j\omega}e^{-(at+j \omega) (\infty)} - \frac{1}{a+j\omega}e^{-(at+j \omega)(0)}\Big] = \frac{1}{a-j\omega} +\frac{1}{a+j\omega} = \frac{a+j\omega+ a-j\omega}{(a-j\omega)(a+j\omega)} X(j\omega) = \frac{2a}{(a^2+\omega^2)}

Para desarrollar el ejercicio con el algoritmo, la entrada de señal se expresaría en el algoritmo como:

ft = sym.exp(-a*np.abs(t)) # Ej 4.2 Oppenheim
[ta,tb] = [-sym.oo,sym.oo] # Intervalo Integración

el resultado a comparar con el desarrollo analítico es:

 expresion f(t):
 -a*|t|
e      

 expresion F(w):
  2*a  
-------
 2    2
a  + w 

 |F(w)|:
  2*a  
-------
 2    2
a  + w 

 F(w)_fase:
0

Grafica de F(w) magnitud y fase

El algoritmo es el mismo que el ejercicio 1, modificando el bloque de ingreso para el problema


Ejercicio 3. Rectangular centrada en origen

Referencia: Oppenheim Ejercicio 4.4 p293, Lathi ejemplo 7.2 p689, Hsu 5.19 p247

Considere la señal pulso rectangular o pulso compuerta (gate), desarrolle la transformada de Fourier

x(t) =\begin{cases}1 && |t|<T_1, \\ 0 && |t|>T_1\end{cases} X(j \omega) = \int_{-T_1}^{T_1} e^{-j\omega t} \delta t = -\frac{1}{j \omega} e^{-j\omega t}\Big|_{-T_1}^{T_1} = -\frac{1}{j \omega} \Big[ e^{-j\omega (T_1)} - e^{-j\omega (-T_1)}\Big] = -\frac{1}{j \omega} \Big[ e^{-T_1 j\omega } - e^{jT_1\omega } \Big] = \frac{1}{j \omega} e^{T_1 j\omega} - \frac{1}{j \omega} e^{-T_1 j\omega }

en este punto es conveniente usar la forma trigonometrica de un exponencial con exponente complejo

= \frac{1}{j \omega} (\cos (T_1\omega)+j \sin(T_1\omega)) - \frac{1}{j \omega} (cos(T_1 \omega) -jsin(T_1\omega)) = \frac{1}{j \omega}\cos (T_1\omega)+j\frac{1}{j \omega} \sin(T_1\omega) - \frac{1}{j \omega} cos(T_1 \omega) +j\frac{1}{j \omega} sin(T_1\omega)) X(j \omega) = 2\frac{\sin(T_1\omega)}{\omega}

Para desarrollar el ejercicio con el algoritmo, la señal se expresaría como:

ft = sym.Heaviside(t+T)-sym.Heaviside(t-T) # Ej 4.4 Oppenheim
[ta,tb] = [-sym.oo,sym.oo] # Intervalo tiempo

obteniendo el siguiente resultado

 expresion f(t):
-Heaviside(-T + t) + Heaviside(T + t)

 expresion F(w):
2*sin(T*w)
----------
    w     

 |F(w)|:
  |sin(T*w)|
2*|--------|
  |   w    |

 F(w)_fase:
0

con la siguiente gráfica f(T)

gráfica de F(w) parte real e imaginaria

El algoritmo es el mismo que el ejercicio 1, modificando el bloque de ingreso para el problema


Ejercicio 4. Pulso unitario

Referencia: Oppenheim Ejercicio 4.3 p292, Lathi ejemplo 7.3 p693, Hsu 5.1 p218

Considere la señal pulso unitario, desarrolle la transformada de Fourier

x(t) = \delta (t)

X(j\omega) = \int_{-\infty}^{\infty} \delta (t) e^{-j \omega t} \delta t = 1

Es decir la transformada de Fourier tiene componentes de todas las frecuencias.

El algoritmo entrega el siguiente resultado:

 expresion f(t):
DiracDelta(t)

 expresion F(w):
1

 |F(w)|:
1

 F(w)_fase:
0

El pulso unitario se define en Sympy como:

ft = sym.DiracDelta(t) # Ej 4.3 Oppenheim

En la parte gráfica, el pulsos unitarios se grafican con plt.stem(0,1), no requiriendo el resto de las graficas para observar el resultado.

El algoritmo es el mismo que el ejercicio 1, modificando el bloque de ingreso para el problema

Tarea: Realizar otros ejercicios con exponenciales para comprobar la operación del algoritmo.