1.7 Espectro – Operaciones en dominio de tiempo y frecuencia

[ Escala o sumar ‘c’ ] [ desplaza t ] [ derivada ] [ desplaza_f ] [ algoritmo ]

Operaciones en dominio de tiempo y frecuencia

Referencia: McClellan 3.3 p81

Uno de los beneficios de uso del espectro de frecuencias es que las operaciones sobre x(t) se muestran como resultados simples en la gráfica de espectro. Estos cambios relacionados en el dominio de t y f se denominan propiedades de la representación espectral. Para los ejemplos se usará el algoritmo de producto de sinusoides.

[ Escala o sumar ‘c’ ] [ desplaza t ] [ derivada ] [ desplaza_f ] [ algoritmo ]
..


1. Escalar o sumar con una constante

Referencia: McClellan 3.3.1 y 3.3.2 p81

Multiplicar una señal por un factor ‘c‘ constante cambia la escala de amplitud en el espectro por el mismo factor ‘c‘, pero deja las frecuencias sin cambios.

cx(t)=ck=MMakej2πfkt=k=MM(cak)ej2πfkt c x(t) = c \sum_{k=-M}^{M} a_k e^{j 2 \pi f_k t} = \sum_{k=-M}^{M} (c a_k) e^{j 2 \pi f_k t}

Sumar una constante a una señal x(t)+c, cambia la amplitud compleja de solo del componente constante o frecuencia f=0

x(t)+c=f0akej2πfkt+[a0ej2π(0)t+c] x(t) + c = \sum_{f \ne 0} a_k e^{j 2 \pi f_k t} + \Big[a_0 e^{j 2 \pi (0) t} + c \Big]

1.1 Ejemplo

Para la señal x(t) mostrada

x(t)=32+6cos(6πtπ/3)+4cos(14πt+π/4) x(t) = \frac{3}{2} + 6 \cos ( 6 \pi t - \pi /3) + 4 \cos ( 14 \pi t + \pi/4)

realizar las operaciones

y(t)=2x(t)+6 y(t) = 2x(t) +6

La amplitud de las señales en f=±3 y ±7 se duplican en el factor 2,  El valor de la constante a la frecuencia cero, también se duplica por el factor 2 y se añade la constante 6  dando como resultado 2(1.5) +6 = 9

1.2 Resultado con algoritmo

Ingreso

# INGRESO
x1 = 3/2 + 6*sym.cos(6*pi*t - pi/3) + 4*sym.cos(14*pi*t + pi/4)
x2 = 2*x1
x3 = 6
x4 = x2+x3

# Para espectro de frecuencias y fasores
x_senales = [x1,x2,x3,x4]
x_etiqueta = ['x1(t)','(2)x1(t)','x3(t)','(2)x1(t)+x3(t)']

Resultado

senal:   6*sin(6*pi*t + pi/6) + 4*cos(14*pi*t + pi/4) + 1.5
  espectro:
   freq : [-7. -3.  0.  3.  7.]
   ampl : [2.  3.  1.5 3.  2. ]
   fase : [-pi/4 pi/3 0 -pi/3 pi/4]
   etiq : ['$2$$ e^j(- \\frac{\\pi}{4})$' '$3$$ e^j(\\frac{\\pi}{3})$' '$1.5$'
 '$3$$ e^j(- \\frac{\\pi}{3})$' '$2$$ e^j(\\frac{\\pi}{4})$']
   x_expand : 6*sin(6*pi*t + pi/6) + 4*cos(14*pi*t + pi/4) + 1.5
   freq_max : 7.0
   freq_min : 3.0
   BW : 4.0
senal:   12*sin(6*pi*t + pi/6) + 8*cos(14*pi*t + pi/4) + 3.0
  espectro:
   freq : [-7. -3.  0.  3.  7.]
   ampl : [4 6 3 6 4]
   fase : [-pi/4 pi/3 0 -pi/3 pi/4]
   etiq : ['$4$$ e^j(- \\frac{\\pi}{4})$' '$6$$ e^j(\\frac{\\pi}{3})$' '$3$'
 '$6$$ e^j(- \\frac{\\pi}{3})$' '$4$$ e^j(\\frac{\\pi}{4})$']
   x_expand : 12*sin(6*pi*t + pi/6) + 8*cos(14*pi*t + pi/4) + 3
   freq_max : 7.0
   freq_min : 3.0
   BW : 4.0
senal:   6
  espectro:
   freq : [0.]
   ampl : [6]
   fase : [0]
   etiq : ['$6$']
   x_expand : 6
   freq_max : 0.0
   freq_min : 0
   BW : 0.0
senal:   12*sin(6*pi*t + pi/6) + 8*cos(14*pi*t + pi/4) + 9.0
  espectro:
   freq : [-7. -3.  0.  3.  7.]
   ampl : [4 6 9 6 4]
   fase : [-pi/4 pi/3 0 -pi/3 pi/4]
   etiq : ['$4$$ e^j(- \\frac{\\pi}{4})$' '$6$$ e^j(\\frac{\\pi}{3})$' '$9$'
 '$6$$ e^j(- \\frac{\\pi}{3})$' '$4$$ e^j(\\frac{\\pi}{4})$']
   x_expand : 12*sin(6*pi*t + pi/6) + 8*cos(14*pi*t + pi/4) + 9
   freq_max : 7.0
   freq_min : 3.0
   BW : 4.0

gráfica de espectro de frecuencias
espectro Senales Operación escala Suma Constante

[ Escala o sumar ‘c’ ] [ desplaza t ] [ derivada ] [ desplaza_f ] [ algoritmo ]
..


2. Desplazamiento en tiempo o multiplicar por exponencial complejo

Referencia: McClellan 3.3.3 p84

Para desplazamiento en el tiempo, las frecuencias no cambia, solo hay cambio de fase en las amplitudes complejas del espectro.

y(t)=x(tτd)bk=akej2πfkτd y(t) = x(t-\tau_d)\leftrightarrow b_k = a_k e^{-j2\pi f_k \tau_d}

dado que

y(t)=x(tτd)=kakej2πfk(tτd)=k(akej2πfkτd)ej2πfkt y(t) = x(t-\tau_d) = \sum_k a_k e^{-j2\pi f_k (t-\tau_d)} = \sum_k \Big(a_k e^{-j2\pi f_k \tau_d }\Big) e^{j2\pi f_k t}

2.1 Ejemplo

Considere x(t) con un retraso τd que es 1/4 de su periodo.

x(t)=6cos(250πt) x(t) = 6 \cos(250 \pi t) T=1/125 T = 1/125 τd=T4=(1125)14=1500=0.002 \tau_d = \frac{T}{4} = \Big( \frac{1}{125} \Big) \frac{1}{4} = \frac{1}{500} = 0.002 ej250π(0.002)=ej0.5π=j e^{-j250 \pi (0.002)} = e^{-j 0.5 \pi} = -j x(t0.002)=6sin(250πt) x(t-0.002) = 6 \sin(250 \pi t)

2.2 Resultado con algoritmo

Ingreso

# INGRESO
x0 = 6*sym.cos(250*pi*t)
x1 = x0.subs(t,t-0.002)

# Para espectro de frecuencias y fasores
x_senales = [x0,x1]
x_etiqueta = ['x(t)','x(t-0.002)']

Resultado

x_senales: 
senal:   6*cos(250*pi*t)
  espectro:
   freq : [-125.  125.]
   ampl : [3 3]
   fase : [0 0]
   etiq : ['$3$' '$3$']
   x_expand : 6*cos(250*pi*t)
   freq_max : 125.0
   freq_min : 125.0
   BW : 0.0
senal:   6*cos(pi*(250*t - 0.5))
  espectro:
   freq : [-125.  125.]
   ampl : [3 3]
   fase : [0.5*pi -0.5*pi]
   etiq : ['$3$$ e^j(0.5 \\pi)$' '$3$$ e^j(- 0.5 \\pi)$']
   x_expand : 3*I*cos(250*pi*t) + 3*I*cos(250*pi*t - 1.0*pi) + 6*cos(250*pi*t - 0.5*pi)
   freq_max : 125.0
   freq_min : 125.0
   BW : 0.0

gráfica de espectro de frecuencias

espectro Señales Operación desplazamiento en tiempo

[ Escala o sumar ‘c’ ] [ desplaza t ] [ derivada ] [ desplaza_f ] [ algoritmo ]
..


3. Diferenciación en tiempo

Referencia: McClellan 3.3.4 p84

La derivada de una señal x(t) no realiza cambios en las frecuencias, las amplitudes en el espectro de frecuencia se modifican como

y(t)=ddtx(t)bk=(j2πfk)ak y(t) = \frac{d}{dt}x(t) \leftrightarrow b_k =( j 2 \pi f_k) a_k

dado que

y(t)=ddtx(t)=kakddtej2πfkt=k((j2πfk)ak)ej2πfkt y(t) = \frac{d}{dt} x(t) = \sum_k a_k \frac{d}{dt}e^{ j 2 \pi f_k t} = \sum_k \Big(( j 2 \pi f_k) a_k\Big) e^{j 2 \pi f_k t }

3.1 Ejemplo

Derivar x(t) que tiene sin() y una constante.

x(t)=7+6cos(250πt) x(t) = 7 + 6 \cos(250 \pi t)

La frecuencia f=0 tiene magnitud 7 que es (j 2 π (0)) = 0 que se elimina de la expresión. En la frecuencia de 125 Hz el término se multiplica por (j 2 π (125))

(j2π(125))(3j)=750π (j 2 \pi (125)) (-3j) = 750 \pi ddtx(t)=1500πcos(250πt) \frac{d}{dt} x(t) = 1500 \pi \cos(250 \pi t)

3.2  Resultados con el algoritmo

Ingreso

# INGRESO
x0 = 7 + 6*sym.sin(250*pi*t)
x1 = sym.diff(x0,t)

# Para espectro de frecuencias y fasores
x_senales = [x0,x1]
x_etiqueta = ['x(t)',"x'(t)"]

Resultado

x_senales: 
senal:   6*cos(250*pi*t)
  espectro:
   freq : [-125.  125.]
   ampl : [3 3]
   fase : [0 0]
   etiq : ['$3$' '$3$']
   x_expand : 6*cos(250*pi*t)
   freq_max : 125.0
   freq_min : 125.0
   BW : 0.0
senal:   6*cos(pi*(250*t - 0.5))
  espectro:
   freq : [-125.  125.]
   ampl : [3 3]
   fase : [0.5*pi -0.5*pi]
   etiq : ['$3$$ e^j(0.5 \\pi)$' '$3$$ e^j(- 0.5 \\pi)$']
   x_expand : 3*I*cos(250*pi*t) + 3*I*cos(250*pi*t - 1.0*pi) + 6*cos(250*pi*t - 0.5*pi)
   freq_max : 125.0
   freq_min : 125.0
   BW : 0.0
>>> 

gráfica de espectro de frecuencias

espectro Señales Operación derivada

[ Escala o sumar ‘c’ ] [ desplaza t ] [ derivada ] [ desplaza_f ] [ algoritmo ]
..


4. Desplazamiento de frecuencia

Referencia: McClellan 3.3.5 p85

Multiplicar una señal x(t) por una sinusoide o una exponencial compleja tiene como resultado que las frecuencias en el espectro se desplazan.

y(t)=x(t)Acos(2πfct+φ) y(t) = x(t) A \cos(2 \pi f_c t + \varphi) =x(t)12Aejφej2πfct+x(t)12Aejφej2πfct = x(t) \frac{1}{2} A e^{j\varphi}e^{j 2 \pi f_c t } + x(t) \frac{1}{2} A e^{-j\varphi}e^{-j 2 \pi f_c t }

que es el resultado observado en el producto de sinusoides y tema tratado para AM

y(t)=Aejφej2πfctkakej2πfkt y(t) = A e^{j\varphi}e^{j 2 \pi f_c t } \sum_k a_k e^{j 2 \pi f_k t } y(t)=k(akAejφ)ej2π(fk+fc)t y(t) = \sum_k \Big(a_k A e^{j\varphi} \Big) e^{j 2 \pi (f_k+f_c) t }

Que se interpreta en el espectro de frecuencias, cada frecuencia en x(t) se desplaza por fc, suponiendo que fc>0. Todas las amplitudes complejas se multiplican por la amplitud compleja del exponencial complejo.

4.1 Ejemplo

Para una señal x(t) con varios componentes mostrada en la gráfica de espectro de frecuencias, añadir a la gráfica los resultados de las operaciones indicadas:

x1(t)=x(t)cos(2π9t) x_1(t) = x(t) \cos(2 \pi 9 t) x1(t)=x(t)sin(2π9t) x_1(t) = x(t) \sin(2 \pi 9 t)

Siendo

x(t)=8+4cos(2πt)+4cos(2π(2)t)+12cos(2π(3)t+π/2) x(t) = 8 + 4 \cos(2 \pi t) + 4\cos(2\pi(2)t)+ 12\cos( 2 \pi (3)t + \pi/2)

4.2  Resultados con el algoritmo

Ingreso

# INGRESO
x0 = 8 + 4*sym.cos(DosPi*t) + 4*sym.cos(DosPi*2*t)+ 12*sym.cos(DosPi*3*t + pi/2)
x1 = x0*sym.cos(DosPi*9*t)
x2 = x0*sym.sin(DosPi*9*t)

# Para espectro de frecuencias y fasores
x_senales = [x0,x1,x2]
x_etiqueta = ['x(t)','x(t)*cos(2*pi*9*t)','x(t)*sin(2*pi*9*t)']

Resultado

x_senales: 
senal:   8 - 12*sin(3*t*(2*pi)) + 4*cos(t*(2*pi)) + 4*cos(2*t*(2*pi))
  espectro:
   freq : [-3. -2. -1.  0.  1.  2.  3.]
   ampl : [6 2 2 8 2 2 6]
   fase : [-pi/2 0 0 0 0 0 pi/2]
   etiq : ['$6$$ e^j(- \\frac{\\pi}{2})$' '$2$' '$2$' '$8$' '$2$' '$2$'
 '$6$$ e^j(\\frac{\\pi}{2})$']
   x_expand : -6*I*(-I*sin(6*pi*t) + cos(6*pi*t)) + 6*I*(I*sin(6*pi*t) + cos(6*pi*t)) + 4*cos(2*pi*t) + 4*cos(4*pi*t) + 8
   freq_max : 3.0
   freq_min : 1.0
   BW : 2.0
senal:   (8 - 12*sin(3*t*(2*pi)) + 4*cos(t*(2*pi)) + 4*cos(2*t*(2*pi)))*cos(9*t*(2*pi))
  espectro:
   freq : [-12. -11. -10.  -9.  -8.  -7.  -6.   6.   7.   8.   9.  10.  11.  12.]
   ampl : [3 1 1 4 1 1 3 3 1 1 4 1 1 3]
   fase : [-pi/2 0 0 0 0 0 pi/2 -pi/2 0 0 0 0 0 pi/2]
   etiq : ['$3$$ e^j(- \\frac{\\pi}{2})$' '$1$' '$1$' '$4$' '$1$' '$1$'
 '$3$$ e^j(\\frac{\\pi}{2})$' '$3$$ e^j(- \\frac{\\pi}{2})$' '$1$' '$1$'
 '$4$' '$1$' '$1$' '$3$$ e^j(\\frac{\\pi}{2})$']
   x_expand : 3*I*(-I*sin(12*pi*t) + cos(12*pi*t)) - 3*I*(I*sin(12*pi*t) + cos(12*pi*t)) - 3*I*(-I*sin(24*pi*t) + cos(24*pi*t)) + 3*I*(I*sin(24*pi*t) + cos(24*pi*t)) + 8*cos(18*pi*t)
   freq_max : 12.0
   freq_min : 6.0
   BW : 6.0
senal:   (8 - 12*sin(3*t*(2*pi)) + 4*cos(t*(2*pi)) + 4*cos(2*t*(2*pi)))*sin(9*t*(2*pi))
  espectro:
   freq : [-12. -11. -10.  -9.  -8.  -7.  -6.   6.   7.   8.   9.  10.  11.  12.]
   ampl : [3 1 1 4 1 1 3 3 1 1 4 1 1 3]
   fase : [0 pi/2 pi/2 pi/2 pi/2 pi/2 pi pi -pi/2 -pi/2 -pi/2 -pi/2 -pi/2 0]
   etiq : ['$3$' '$1$$ e^j(\\frac{\\pi}{2})$' '$1$$ e^j(\\frac{\\pi}{2})$'
 '$4$$ e^j(\\frac{\\pi}{2})$' '$1$$ e^j(\\frac{\\pi}{2})$'
 '$1$$ e^j(\\frac{\\pi}{2})$' '$3$$ e^j(\\pi)$' '$3$$ e^j(\\pi)$'
 '$1$$ e^j(- \\frac{\\pi}{2})$' '$1$$ e^j(- \\frac{\\pi}{2})$'
 '$4$$ e^j(- \\frac{\\pi}{2})$' '$1$$ e^j(- \\frac{\\pi}{2})$'
 '$1$$ e^j(- \\frac{\\pi}{2})$' '$3$']
   x_expand : I*(-I*sin(14*pi*t) + cos(14*pi*t)) - I*(I*sin(14*pi*t) + cos(14*pi*t)) + I*(-I*sin(16*pi*t) + cos(16*pi*t)) - I*(I*sin(16*pi*t) + cos(16*pi*t)) + 4*I*(-I*sin(18*pi*t) + cos(18*pi*t)) - 4*I*(I*sin(18*pi*t) + cos(18*pi*t)) + I*(-I*sin(20*pi*t) + cos(20*pi*t)) - I*(I*sin(20*pi*t) + cos(20*pi*t)) + I*(-I*sin(22*pi*t) + cos(22*pi*t)) - I*(I*sin(22*pi*t) + cos(22*pi*t)) - 6*cos(12*pi*t) + 6*cos(24*pi*t)
   freq_max : 12.0
   freq_min : 6.0
   BW : 6.0

gráfica de espectro de frecuencias

espectro Señales Operación desplaza freq
[ Escala o sumar ‘c’ ] [ desplaza t ] [ derivada ] [ desplaza_f ] [ algoritmo ]
..


5. Algoritmo en Python

La instrucciones en Python para cada ejercicio a observar en el dominio de la frecuencia requiere actualiar la sección de INGRESO que fué proporcinada en cada sección anterior. El algoritmo se presenta como ejemplo la escala o suma de una constante.

# ejemplo 3-3.1 p82 escala o suma con una constante
# telg1034 DSP fiec-espol edelros@espol.edu.ec
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
import telg1034 as dsp

# variables
from telg1034 import t,A,w,f,p,pi,DosPi,I,equivalentes

# INGRESO
x1 = 3/2 + 6*sym.cos(6*pi*t - pi/3) + 4*sym.cos(14*pi*t + pi/4)
x2 = 2*x1
x3 = 6
x4 = x2+x3

# Para espectro de frecuencias y fasores
x_senales = [x1,x2,x3,x4]
x_etiqueta = ['x1(t)','(2)x1(t)','x3(t)','(2)x1(t)+x3(t)']

# PROCEDIMIENTO
x_conteo = len(x_senales)
x_espectro = [] ; freq_max_graf = 1; freq_min_graf = 0
for unasenal in x_senales:
    # operaciones para espectro
    x_term = dsp.x_list_term_Add(unasenal)
    Xe_term = dsp.cos_to_euler_one_term(x_term)
    x_term_expand = dsp.euler_to_cos_list(Xe_term)
    Xe_term_spectr = dsp.cos_spectrum_list(x_term)
    
    # espectro de cada señal
    un_espectro = {}
    freq = Xe_term_spectr['freq']
    ampl = Xe_term_spectr['ampl']
    fase = Xe_term_spectr['fase']
    un_espectro['freq'] = freq
    un_espectro['ampl'] = ampl
    un_espectro['fase'] = fase
    un_espectro['etiq'] = Xe_term_spectr['etiq']
    un_espectro['x_expand'] = x_term_expand
    
    # ancho de banda
    freq_max = float(max(freq))
    if len(freq[freq>0])>0:
        freq_min = float(min(freq[freq>0]))
    else:
        freq_min = 0
    un_espectro['freq_max'] = freq_max
    un_espectro['freq_min'] = freq_min
    freq_centro = (freq_max+freq_min)/2
    un_espectro['BW'] = freq_max-freq_min

    x_espectro.append(un_espectro)
    # freq_max para grafica, eje unificado x_senales
    if freq_max>freq_max_graf:
        freq_max_graf = freq_max

# SALIDA
print('x_senales: ')
for i in range(x_conteo):
    print('senal:  ',x_senales[i])
    print('  espectro:')
    unespectro = x_espectro[i]
    for unparam in unespectro:
        print('  ',unparam,':',unespectro[unparam])

# GRAFICAS de espectro de frecuencias ---------
graf_dx = 0.14
fig_espectro = plt.figure()
for i in range(0,x_conteo,1):
    unespectro = x_espectro[i]
    freq = unespectro['freq']
    ampl = unespectro['ampl']
    etiqueta = unespectro['etiq']
    ampl_max = float(max(ampl))
    # grafica
    graf_sub = x_conteo*100+10+i+1
    graf_fasor = fig_espectro.add_subplot(graf_sub)
    if freq_max_graf!=0:
        graf_fasor.set_xlim([-freq_max_graf*(1+graf_dx),
                             freq_max_graf*(1+graf_dx)])
    else:
        graf_fasor.set_xlim([-1,1])
    graf_fasor.set_ylim([0,ampl_max*(1+graf_dx*2)])
    graf_fasor.grid()
    graf_fasor.axhline(0,color='black')
    graf_fasor.axvline(0,linestyle='dotted',color='grey')
    graf_fasor.stem(freq,ampl) # grafica magnitud
    for k in range(0,len(freq),1): # etiquetas de fasor
        plt.annotate(etiqueta[k],xy=(freq[k],ampl[k]),
                     xytext=(0,5),textcoords='offset points',
                     ha='center')
    graf_fasor.set_ylabel(x_etiqueta[i])
    if i == 0:
        graf_fasor.set_title('Espectro: x_senales')
    if i ==(x_conteo-1):
        graf_fasor.set_xlabel('freq Hz')

plt.show()

[ Escala o sumar ‘c’ ] [ desplaza t ] [ derivada ] [ desplaza_f ] [ algoritmo ]