Lo que para señales y sistemas representa un componente importante en el análisis de sistemas LTI, al poder representar los sistemas por bloques en serie y paralelo semejante a lo realizado con la transformada de Laplace:
La convergencia de la transformada de Fourier se garantiza bajo ciertas condiciones. El análisis de Fourier para el estudio de sistemas LTI se restringe a los que sus respuestas al impulso tienen transformada de Fourier. Los detalles se mostrarán en cada ejercicio presentado.
Ejemplo 1. H(ω) desde una ecuación diferencial
Referencia: Oppenheim Ej 4.25 p331
Considere un sistema LTI estable que se caracteriza por la ecuación diferencial,
Para facilitar encontrar h(t) se usan fracciones parciales respecto a jω, de forma semejante a lo realizado para el dominio s con instrucciones de Sympy-Python, Las instrucciones las puede recordar observando el ejercicio 2, donde se adjunta el algoritmo.
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# blog.espol.edu.ec/telg1001/import sympy as sym
# INGRESO
t = sym.Symbol('t', real=True,)
w = sym.Symbol('w', real=True)
a = sym.Symbol('a', real=True,positive=True)
T = sym.Symbol('T', real=True,positive=True)
j = sym.I
u = sym.Heaviside(t)
d = sym.DiracDelta(t)
ft = sym.exp(-a*t)*u
#ft = sym.exp(-a*sym.Abs(t))#ft = sym.Heaviside(t+T)-sym.Heaviside(t-T)#ft = d# PROCEDIMIENTO
unilateral = False
ftw = ft*sym.exp(-j*w*t) # f(t,w) para integrar
ftw = sym.expand(ftw) # expresion de sumas
ftw = sym.powsimp(ftw) # simplifica exponentes
lim_a = 0 # unilateralifnot(unilateral):
lim_a = -sym.oo
# integral de Fourier
Fw_F = sym.integrate(ftw,(t,lim_a,sym.oo))
if Fw_F.is_Piecewise:
Fw = Fw_F.args[0] # primera ecuacion e intervalo
Fw = Fw[0] # solo expresionelse:
Fw = Fw_F
Fw = Fw.simplify()
# Magnitud y Fase
Fw_magn = sym.Abs(Fw)
Fw_fase = sym.atan(sym.im(Fw)/sym.re(Fw))
# SALIDAprint('\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)
Instrucción simplificada con Sympy
La librería Sympy incorpora una función para determinar en forma simbólica la transformada de Fourier, se usa la instrucción para simplificar el algoritmo anterior.
# Transformada de Fourier de señales aperiodicas# blog.espol.edu.ec/telg1001/import sympy as sym
# INGRESO
t = sym.Symbol('t', real=True,)
w = sym.Symbol('w', real=True)
a = sym.Symbol('a', real=True,positive=True)
T = sym.Symbol('T', real=True,positive=True)
j = sym.I
u = sym.Heaviside(t)
d = sym.DiracDelta(t)
ft = sym.exp(-a*t)*u
#ft = sym.exp(-a*sym.Abs(t))#ft = u.subs(t,t+T)-u.subs(t,t-T)#ft = d# PROCEDIMIENTO
ft = sym.expand(ft) # expresion de sumas
Fw = sym.fourier_transform(ft,t,w/(2*sym.pi))
# Magnitud y Fase
Fw_magn = sym.Abs(Fw)
Fw_fase = sym.atan(sym.im(Fw)/sym.re(Fw))
# SALIDAprint('\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)
Instrucciones para añadir la gráfica
Para las gráficas, se dan valores a las constantes a, T, se define el intervalo de la gráfica y el número de muestras a usar.
Luego se sustituye en las ecuaciones resultantes los valores de ‘a‘ con ‘a_k‘ obteniendo valores para las gráficas. La gráfica para f(t) se realiza de forma semejante en la unidad 1. Para la gráfica F(w) se usan una gráfica con parte Real e Imaginaria, otra gráfica para magnitud y fase.
# GRAFICA ----------------import numpy as np
import matplotlib.pyplot as plt
import telg1001 as fcnm
equivalentes = [{'DiracDelta': lambda x: 1*(x==0)},
{'Heaviside': lambda x,y: np.heaviside(x, 1)},
'numpy',]
a_k = 2 # valor de 'a' constante# Grafica, intervalo tiempo [t_a,t_b]
T_k = 1 # valor T o periodo
t_a = -2*T_k ; t_b = 2*T_k
muestras = 52 # 51 resolucion grafica
ft = ft.subs({a:a_k,T:T_k}) # a tiene valor a_k
Fw = Fw.subs({a:a_k,T:T_k})
Fw_magn = Fw_magn.subs({a:a_k,T:T_k})
Fw_fase = Fw_fase.subs({a:a_k,T:T_k})
figura_ft = fcnm.graficar_ft(ft,t_a,t_b,muestras)
# F(w) real e imaginaria
w_a = -a_k*4 ; w_b = a_k*4
wi = np.linspace(w_a,w_b,muestras)
# convierte a sympy una constante
Fw = sym.sympify(Fw,w)
if Fw.has(w): # no es constante
F_w = sym.lambdify(w,Fw,
modules=equivalentes)
else:
F_w = lambda w: Fw + 0*w
Fwi = F_w(wi) # evalua wi# F(w) magnitud y fase# convierte a sympy una constante
Fw_magn = sym.sympify(Fw_magn,w)
if Fw_magn.has(w): # no es constante
F_w_magn = sym.lambdify(w,Fw_magn,
modules=equivalentes)
else:
F_w_magn = lambda w: Fw_magn + 0*w
# convierte a sympy una constante
Fw_fase = sym.sympify(Fw_fase,w)
if Fw_fase.has(w): # no es constante
F_w_fase = sym.lambdify(w,Fw_fase,
modules=equivalentes)
else:
F_w_fase = lambda w: Fw_fase + 0*w
Fwi_magn = F_w_magn(wi) # evalua wi
Fwi_fase = F_w_fase(wi)
# F(w) real e imaginaria
fig_Fw, 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
fig_Fwmg, graf_Fw = plt.subplots(2,1)
graf_Fw[0].plot(wi,Fwi_magn,label='F(w)_magn',
color='orange')
Fwa0 = F_w_magn(0)
Fwa1 = F_w_magn(-a_k)
Fwa2 = F_w_magn(a_k)
if Fw_magn.has(w): # no es constante
graf_Fw[0].stem([-a_k,a_k],[Fwa1,Fwa2],
basefmt=' ',linefmt ='--')
etiqueta1 = '('+str(a_k)+','+str(round(Fwa2,4))+')'
graf_Fw[0].annotate(etiqueta1, xy=(a_k,Fwa2))
etiqueta0 = '('+str(0)+','+str(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_fase,label='F(w)_fase',
color='brown')
graf_Fw[1].axhline(np.pi/2,linestyle ='--')
graf_Fw[1].axhline(-np.pi/2,linestyle ='--')
if Fw_magn.has(w): # no es constante
Fwa1f = F_w_fase(-a_k)
Fwa2f = F_w_fase(a_k)
graf_Fw[1].stem([-a_k,a_k],[Fwa1f,Fwa2f],
basefmt=' ',linefmt ='--')
etiqueta3 = '('+str(a_k)+','+str(round(Fwa2f,4))+')'
graf_Fw[1].annotate(etiqueta3, xy=(a_k,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()
Se puede ver que la exponencial con frecuencia ω0 + 2π es la misma que aquella con la frecuencia ω0.
Existe una situación diferente en el caso contínuo, en el cual las señales ejω0t son todas distintas para distintos valores de ω0.
En el caso discreto, éstas señales no son distintas, ya que la señal con frecuencia ω0 es idéntica a las señales con frecuencias ω0 ± 2π , ω0 ± 4π, … y las que le siguen. Por lo tanto, al considerar las exponenciales complejas, necesitamos tomar en cuenta solamente un intervalo de frecuencia de longitud 2π dentro del cual se escoge ω0.
ω0N = 2π m
o de otra forma
ω0/2π = m/N
Para el caso de m=1 y N=2
otra prueba con m=7 y N=4
con m=2 y N=1
El código en python para realizar las gráficas es:
# Señales discretas, y(t) a y[t]# propuesta:edelros@espol.edu.ecimport numpy as np
import math
import matplotlib.pyplot as plt
# Definir la funcion para el ejemplodefanalogica(f,t):
# función matemática CAMBIAR AQUI
y=np.cos(f*t)
return(y)
# Programa para graficar la función# INGRESO
rango = 4 # float(input('rangos en periodos de analogica:'))
m = 1 # float(input('frecuencia de analógica:'))
N = 2 # float(input('frecuencia digital:'))# PROCEDIMIENTO# grafica analogica
puntoscontinuos = 500
t0 = -rango*2*np.pi*m/2
tn = rango*2*np.pi*m/2
t = np.linspace(t0,tn,puntoscontinuos+1)
yanalog = analogica(m,t)
# grafica digital
deltaD = (2*np.pi*m)/(2*N)
muestreo = int((tn-t0)//deltaD +1)
td = np.linspace(t0,tn,muestreo)
ydigital = analogica(m,td)
# SALIDA - GRAFICA#Escala y para el grafico
margen = 0.1*np.max(yanalog)
ymax = np.max(yanalog)+margen
ymin = np.min(yanalog)-margen
plt.figure(1)
plt.suptitle('Señal Analogica vs digital')
plt.subplot(211) # grafica de 2x1 arriba
plt.plot(t,yanalog)
plt.axis((t0,tn,ymin,ymax))
plt.ylabel('y(t)')
plt.subplot(212) # grafica de 2x1 abajo
plt.plot(td,ydigital,'ro')
plt.axis((t0,tn,ymin,ymax))
plt.ylabel('Digital: y[t]')
plt.show()
Ejemplo. Serie de Fourier de rectángulo(t) con Integral de Sympy
Referencia: Lathi 6.5 p617, Chapra 5ed Ejemplo 19.2 p548
Utilice la serie de Fourier continua para aproximar la función de onda cuadrada o rectangular. Para el cálculo del ejemplo se usará hasta 4 términos de la serie.
Para determinar las expresiones de los coeficientes, en Python se usa la librería Sympy que nos facilita el desarrollo las fórmulas simbólicas ak y bk.
Si requiere revisar el concepto se adjunta el enlace:
# Serie de Fourier, con n coeficientes# Ref.Chapra 5ed Ejemplo 19.2 p548/pdf572import sympy as sym
# INGRESO
t = sym.Symbol('t')
T0 = 2*sym.pi ; t0 = -T0/2 # periodo ; t_inicio
ft = sym.Piecewise((-1,t <-T0/2),
(-1,t <-T0/4),
( 1,t < T0/4),
(-1,t < T0/2),
(-1,True),)
n = 4 # número de coeficientes# PROCEDIMIENTO
w0 = 2*sym.pi/T0
k = sym.Symbol('k')
# Términos ak para coseno()
enintegral = ft*sym.cos(k*w0*t)
yaintegrado = sym.integrate(enintegral,(t,t0,t0 + T0))
Fak = (2/T0)*yaintegrado
Fak = sym.simplify(Fak)
# Términos bk para seno()
enintegral = ft*sym.sin(k*w0*t)
yaintegrado = sym.integrate(enintegral,(t,t0,t0 + T0))
Fbk = (2/T0)*yaintegrado
Fbk = sym.simplify(Fbk)
# SALIDAprint(' expresión ak:')
sym.pprint(Fak)
print('\n ak formato latex')
print(sym.latex(Fak))
print('\n expresión bk:')
sym.pprint(Fbk)
print('\n bk formato latex')
print(sym.latex(Fbk))
Evaluación de coeficientes
Con las expresiones obtenidas en el bloque anterior, se evalúan los n coeficientes ak y bk, substituyendo en las expresiones los valores en cada índice i y se obtiene como resultado:
coeficientes ak,bk:
k_i : [0, 1, 2, 3]
ak : [0, 4/pi, 0, -4/(3*pi)]
bk : [0, 0, 0, 0]]
Instrucciones Python
Las instrucciones son adicionales al bloque anterior. La evaluación se mantiene usando las expresiones simbólicas usando la instrucción .subs()
# evalua los coeficientes
a0 = Fak.subs(k,0)/2
b0 = Fbk.subs(k,0)
ak = [a0] ; bk = [b0] ; k_i = [0]
i = 1
whilenot(i>=n):
ak_valor = Fak.subs(k,i)
bk_valor = Fbk.subs(k,i)
ak.append(ak_valor)
bk.append(bk_valor)
k_i.append(i)
i = i+1
print('\n coeficientes ak,bk: ')
for uncoef in coef_fourier:
print(uncoef,':',coef_fourier[uncoef])
Expresión de la Serie de Fourier
Encontrados los coeficientes ak y bk, se los usa en la expresión principal
obteniendo la siguiente expresión para la serie de Fourier como fs(t)
serie de Fourier fs(t):
4*cos(t) 4*cos(3*t)
-------- - ----------
pi 3*pi
Instrucciones en Python
Las instrucciones se añaden a continuación de los bloques anteriores,
# serie de Fourier
serieF = ak[0] + 0*t
i = 1
whilenot(i>=n):
serieF = serieF + ak[i]*sym.cos(i*w0*t)
serieF = serieF + bk[i]*sym.sin(i*w0*t)
i = i+1
print('\n serie de Fourier f(t): ')
sym.pprint(serieF)
Gráficas de f(t) y Serie de Fourier
Para comparar la función f(t) con la aproximación en series de Fourier, se usa el intervalo [a,b] con una cantidad de muestras usando la instrucción np.linspace() y guardando el resultado en ti.
Para evaluar los puntos ti en cada expresión, por simplicidad se convierte la expresión de su forma simbólica a numérica lambda, usando sym.lambdify()
Instrucciones en Python
Las instrucciones para graficar las series de Fourier van a continuación de las anteriores,
# Grafica ---------------------import numpy as np
import matplotlib.pyplot as plt
# Evaluación para gráfica
f_t = sym.lambdify(t,ft)
serie_ft = sym.lambdify(t,serieF)
ti = np.linspace(float(t_a),float(t_b),muestras)
fi = f_t(ti)
serie_fi = serie_ft(ti)
# Grafica de Serie de Fourier
plt.plot(ti,fi,label = 'f(t)')
etiqueta = 'coeficientes = '+ str(n)
plt.plot(ti,serie_fi,label = etiqueta)
plt.xlabel('ti')
plt.legend()
plt.grid()
plt.title('Serie de Fourier f(t); T0='+str(T0))
plt.show()
Tarea: Realizar el ejercicio, aumentando el número de términos a 8
Espectro de Fourier de amplitud y fase
Referencia: Lathi 6.1 p599, Chapra 19.3 p551
Los espectros ofrecen información que no aparece en el dominio del tiempo. La gráfica de frecuencias ofrece una representación rápida de la estructura de armónicas, que son como las huellas dactilares que ayudan a caracterizar y entender la forma de una señal complicada.
La gráfica considera todas las magnitudes como positivas. Posteriormente se puede observar como en algunos textos que se incorpora el signo en la grafica de magnitud. En la siguiente sección se trata más éste detalle.
Para mostrar este espectro de frecuencias se incrementó el número de términos de la serie a n=11, para observar mejor la forma de la gráfica.
# espectro de frecuencias k
ak_i = np.array(ak,dtype=float)
bk_i = np.array(bk,dtype=float)
ck_mag = np.sqrt(ak_i**2 + bk_i**2)
ck_fase = np.arctan(-bk_i/ak_i)
revisa0 = (abs(ak_i)>=casicero)
pendiente = -bk_i[revisa0]/ak_i[revisa0]
ck_fase[revisa0] = np.arctan(pendiente)
coef_fourier['ck_mag'] = ck_mag
coef_fourier['ck_fase'] = ck_fase
print('\n coeficientes ak,bk,Ck_mag,Ck_fase: ')
for uncoef in coef_fourier:
print(uncoef,':',coef_fourier[uncoef])
# grafica de espectro de frecuencia
plt.subplot(211)
plt.stem(k_i,ck_mag,label='|Ck|')
plt.ylabel('ck_mag')
plt.title('Espectro de frecuencia ; T0='+str(T0))
plt.legend()
plt.grid()
plt.subplot(212)
plt.stem(k_i,ck_fase,label='Ck_fase')
plt.legend()
plt.ylabel('ck_fase')
plt.xlabel('k_i')
plt.grid()
plt.show()
El algoritmo final como una integración de las partes presentadas se usa en la página siguiente con algunos ejemplos tradicionales de la transformada de Fourier.
Instrucciones Python para Integral de la serie de Fourier con n coeficientes
Se integran todas las partes anteriores en un algoritmo
# Serie de Fourier, con n coeficientes# Ref.Chapra 5ed Ejemplo 19.2 p548/pdf572import sympy as sym
import numpy as np
# INGRESO
t = sym.Symbol('t')
T0 = 2*sym.pi ; t0 = -T0/2 # periodo ; t_inicio
ft = sym.Piecewise((-1,t <-T0/2),
(-1,t <-T0/4),
( 1,t < T0/4),
(-1,t < T0/2),
(-1,True),)
n = 4 # número de coeficientes
t_a = t0 # intervalo de t =[t_a,t_b]
t_b = t0 + T0
muestras = 101 # 51 resolucion grafica
casicero = 1e-10
# PROCEDIMIENTO
w0 = 2*sym.pi/T0
k = sym.Symbol('k')
# Términos ak para coseno()
enintegral = ft*sym.cos(k*w0*t)
yaintegrado = sym.integrate(enintegral,(t,t0,t0 + T0))
Fak = (2/T0)*yaintegrado
Fak = sym.simplify(Fak)
# Términos bk para seno()
enintegral = ft*sym.sin(k*w0*t)
yaintegrado = sym.integrate(enintegral,(t,t0,t0 + T0))
Fbk = (2/T0)*yaintegrado
Fbk = sym.simplify(Fbk)
# evalua los coeficientes
a0 = Fak.subs(k,0)/2
b0 = Fbk.subs(k,0)
ak = [a0] ; bk = [b0] ; k_i = [0]
i = 1
whilenot(i>=n):
ak_valor = Fak.subs(k,i)
bk_valor = Fbk.subs(k,i)
ak.append(ak_valor)
bk.append(bk_valor)
k_i.append(i)
i = i+1
coef_fourier = {'k_i': k_i,
'ak' : ak, 'bk': bk}
# serie de Fourier
serieF = ak[0] + 0*t
i = 1
whilenot(i>=n):
serieF = serieF + ak[i]*sym.cos(i*w0*t)
serieF = serieF + bk[i]*sym.sin(i*w0*t)
i = i+1
# espectro de frecuencias k
ak_i = np.array(ak,dtype=float)
bk_i = np.array(bk,dtype=float)
ck_mag = np.sqrt(ak_i**2 + bk_i**2)
ck_fase = np.arctan(-bk_i/ak_i)
revisa0 = (abs(ak_i)>=casicero)
pendiente = -bk_i[revisa0]/ak_i[revisa0]
ck_fase[revisa0] = np.arctan(pendiente)
coef_fourier['ck_mag'] = ck_mag
coef_fourier['ck_fase'] = ck_fase
# SALIDAprint(' expresión ak:')
sym.pprint(Fak)
print('\n ak formato latex')
print(sym.latex(Fak))
print('\n expresión bk:')
sym.pprint(Fbk)
print('\n bk formato latex')
print(sym.latex(Fbk))
print('\n serie de Fourier f(t): ')
sym.pprint(serieF)
print('\n coeficientes ak,bk,Ck_mag,Ck_fase: ')
for uncoef in coef_fourier:
print(uncoef,':',coef_fourier[uncoef])
# Grafica ---------------------import matplotlib.pyplot as plt
# Evaluación para gráfica
f_t = sym.lambdify(t,ft)
serie_ft = sym.lambdify(t,serieF)
ti = np.linspace(float(t_a),float(t_b),muestras)
fi = f_t(ti)
serie_fi = serie_ft(ti)
# Grafica serie de Fourier
fig_serieF, graf_sF = plt.subplots()
graf_sF.plot(ti,fi,label = 'f(t)')
etiqueta = 'coeficientes = '+ str(n)
graf_sF.plot(ti,serie_fi,label = etiqueta)
graf_sF.set_xlabel('ti')
graf_sF.legend()
graf_sF.grid()
graf_sF.set_title('Serie de Fourier f(t); T0='+str(T0))
# plt.show()# grafica de espectro de frecuencia
fig_espectro, graf_sptr = plt.subplots(2,1)
graf_sptr[0].stem(k_i,ck_mag,label='|Ck|')
graf_sptr[0].set_ylabel('ck_mag')
graf_sptr[0].set_title('Espectro de frecuencia ; T0='+str(T0))
graf_sptr[0].legend()
graf_sptr[0].grid()
graf_sptr[1].stem(k_i,ck_fase,label='Ck_fase')
graf_sptr[1].legend()
graf_sptr[1].set_ylabel('ck_fase')
graf_sptr[1].set_xlabel('k_i')
graf_sptr[1].grid()
plt.show()
Usando el ejercicio 1, se muestra el resultado obtenido usando la instrucción incorporada en Sympy. La función truncate(n) aplicada a la serie, permite obtener los n términos no cero. Existen operaciones adicionales para desplazamiento y escala en x que evitan tener que realizar las operaciones nuevamente y optimizan el tiempo del algoritmo
serie de Fourier f(t):
4*cos(t) 4*cos(3*t) 4*cos(5*t)
-------- - ---------- + ---------- + ...
pi 3*pi 5*pi
serie de Fourier f(t), n términos:
/pi\ /3*pi\
4*cos(t)*sinc|--| 4*cos(3*t)*sinc|----|
\4 / \ 4 /
----------------- - ---------------------
pi 3*pi
serie de Fourier f(t), k términos no cero:
4*cos(t) 4*cos(3*t) 4*cos(5*t) 4*cos(7*t)
-------- - ---------- + ---------- - ----------
pi 3*pi 5*pi 7*pi
>>>
Instrucciones en Python
# Serie de Fourier, con n coeficientes# Ref.Chapra 5ed Ejemplo 19.2 p548/pdf572import sympy as sym
# INGRESO
t = sym.Symbol('t')
T0 = 2*sym.pi ; t0 = 0 # periodo ; t_inicio
ft = sym.Piecewise((-1,t <-T0/2),
(-1,t <-T0/4),
( 1,t < T0/4),
(-1,t < T0/2),
(-1,True),)
n = 4 # número de coeficientes
t_a = t0 # intervalo de t =[t_a,t_b]
t_b = t0 + T0
# PROCEDIMIENTO
serieF = sym.fourier_series(ft,(t,t0,t0+T0))
serieFn = sym.expand(serieF.sigma_approximation(n))
serieFk = serieF.truncate(n)
# SALIDAprint('\n serie de Fourier f(t): ')
sym.pprint(serieF)
print('\n serie de Fourier f(t), n términos: ')
sym.pprint(serieFn)
print('\n serie de Fourier f(t), k términos no cero: ')
sym.pprint(serieFk)
Adicionalmente incorpora otras operaciones para el dominio de la frecuencia como desplazamiento y escalamiento en x