Módulo del espectro

Código auxiliar

# Cargo paquetitos
using DSP, FFTW
# Y armo un par de funciones auxiliares
stem(args...; kwargs...) = sticks(args...; 
  																marker=:circle, 
  																leg=false, 
  																kwargs...)
# Delta
d(n) = n == 0 ? 1. : 0. 
# Escalón
u(n) = n >= 0 ? 1. : 0. 
using Plots # esto está demorando como un minuto :S
Plots.default(:legend, false)
false

Armemos dos señales coseno de frecuencias diferentes de duración 10s (afuera valen 0), muestreémoslas durante cierto tiempo, y tomemos la DFT

f1  = 10
f2  = 15
sup = 10
w(t) = u(t) - u(t - sup)
x1(t) = cos(2π*f1*t) * w(t)
x2(t) = cos(2π*f2*t) * w(t)
sr    = 100 # frec de muestreo (Hz) -- cumple con Nyquist
t_tot = 20 # duración total de muestreo (s)
ts    = range(0; stop=t_tot, step=1/sr)
x1s = x1.(ts)
x2s = x2.(ts)
x1sf = fft(x1s)
x2sf = fft(x2s)
;

Conseguimos muestras de la transformada de las señales.

Grafico el módulo de los espectros, sólo en sus frecuencias positivas (ya sé que es simétrico porque eran señales reales).

fs = range(0; stop=sr, length=length(x1sf)) #aprox
  
plot(fs, [abs.(x1sf), abs.(x2sf)];
  xlim   = (0, sr/2),
  xlabel = "f (Hz)",
  title = "Módulo de los espectros",
  legend = true,
  lab   = ["|X1|" "|X2|"]
)

Veamos cómo quedaría el espectro de la suma

plot(fs, abs.(x1sf .+ x2sf);
  xlim   = (0, sr/2),
  xlabel = "f (Hz)",
  title = "|X1 + X2|"
)

La suma, en los primeros 10 segundos, se ve algo así

plot(t -> x1(t) + x2(t), 1, 1.5)

y luego se hace cero

plot(t -> x1(t) + x2(t), -1, 12)

Veamos ahora el espectro de una señal que, en los primeros 10 segundos es igual al primer coseno, y en los segundos 10s, al segundo

plot(t -> x1(t) + x2(t - 10), -1, 22)
plot(t -> x1(t) + x2(t - 10), 9.6, 10.4)
x12seq = x1.(ts) .+ x2.(ts .- 10)
plot(fs, abs.(fft(x12seq));
  xlim   = (0, sr/2),
  xlabel = "f (Hz)",
  title = "Módulo del espectro de x1 seguido de x2"
)

¡¡Se ve casi igual que el caso de las dos señales simultáneas!!

Y el espectro (módulo) de la secuencia en orden inverso también se ve igual

x21seq = x1.(ts .- 10) .+ x2.(ts)
plot(fs, abs.(fft(x21seq));
  xlim   = (0, sr/2),
  xlabel = "f (Hz)",
  title = "Módulo del espectro de x1 seguido de x2"
)

Mirando el módulo del espectro, no tenemos idea de qué tiempos son los responsables de la energía que tiene la señal en cada frecuencia (esa información está en la derivada de la fase en función de la frecuencia).

Runtimes (1)