None
Métodos potenciales de prospección, FCAG, 2024.
a) La TDF de una constante debe ser un impulso (spike). (Pensemos en una sinusoide de frecuencia cero). Si consideramos la señal digital como 5 muestras iguales a $1$, La TDF muestra un "1" y el resto ceros (color rojo). Ahora el dilema. Si realmente la función muestreada en el dominio ambiental (espacio o tiempo) es una constante, entonces esta TDF es correcta.
b) Si deseamos ver mas puntos en la TDF, deberíamos extender con la misma constante los bordes de la función a modo de zero-padding. Si realizamos el zero-padding tradicional, es decir rellenando con $0$ los bordes de la función muestreada en el dominio ambiental, entonces estamos asumiendo que no es una constante y que se trata de una función con soporte acotado. En este caso, la TDF da la sinusoide cardinal $\textrm{sinc}()$ asociada al cajón en tiempo (color verde).
c) Ahora una sinusoide. Sin zero padding, es el resultado correcto si se trata de una sinusoide muestreada con infinitas muestras. Si se hace zero-padding, la señal digital es una función que es un sector de un sinusoide rodeada de ceros (color verde). Se observa el ripple asociado a la convolución en el dominio transformado con el seno cardinal.
En estos ejemplos usamos número de onda digital $\kappa = k \Delta x$, siendo $k$ el número de onda.
import numpy as np
import matplotlib.pyplot as plt
# REPASO, TDF 1D
#plt.xkcd()
#plt.rcParams.update({'font.size': 14}) # tamaño de fuente
def signal3(T=10,dx=1):
T=10
dx=T/10.
x = np.arange(0,3*T)*dx
n = len(x)
npad = 256
s = np.cos(2*np.pi*x/np.float64(T))
S = np.abs(np.fft.fft(s))
Spad = np.abs(np.fft.fft(s,npad))
Sc = np.abs(np.fft.fftshift(Spad))
dw = 2*np.pi/np.float64(n)
w = np.arange(n)*dw
dw_pad = 2*np.pi/np.float64(npad)
wpad = np.arange(npad)*dw_pad
wc = (2*np.pi)*np.fft.fftfreq(n)
wcpad = (2*np.pi)*np.fft.fftfreq(npad)
wcpad = np.sort(wcpad) # evita linea en plt.plot
return s,x,S,w,Spad,wpad,Sc,wcpad,wc
n = 5
h1 = np.ones(5)/np.float64(n) # promedio simple
h2 = np.pad(h1,5,mode='constant') # zero-padding
#h2 = np.pad(h1,5,mode='linear_ramp') # rampa lineal
#h2 = np.pad(h1,5,mode='edge') # extiendo con los valores del borde
h3,x,H3,w3,H3pad,w3pad,H3c,w3cpad,w3c=signal3(T=10,dx=1)
n = len(h1)
npad = 256
dt = 1
dw = 2*np.pi/np.float64(n)
dw_pad = 2*np.pi/np.float64(npad)
t = np.arange(n)*dt
tpad = np.arange(len(h2))*dt-n*dt
w = np.arange(n)*dw
wpad = np.arange(npad)*dw_pad
H1 = np.abs(np.fft.fft(h1))
H1c = np.abs(np.fft.fftshift(H1))
H2 = np.abs(np.fft.fft(h2,npad))
H2c = np.abs(np.fft.fftshift(H2))
wc = (2*np.pi)*np.fft.fftfreq(len(h1))
wcpad = (2*np.pi)*np.fft.fftfreq(npad)
wcpad = np.sort(wcpad) # evita linea en el display
# Gráficos
plt.figure(1,figsize=(18,12))
plt.subplot(331)
plt.title('a)',loc='left')
plt.yticks([])
plt.xticks(t)
plt.title('$s(x_n)$',loc='center')
plt.stem(t,h1,basefmt=" ")#,use_line_collection=True)
plt.subplot(332)
plt.yticks([])
plt.title('$|S(\kappa_n)|$',loc='center')
plt.xticks([0,np.pi,2*np.pi],[r'$0$',r'$\pi$',r'$2\pi$'])
plt.xlim([-0.5,2*np.pi+0.5])
(markers, stemlines, baseline) = plt.stem(w,H1,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
plt.subplot(333)
plt.yticks([])
plt.title('$|S(\kappa_n)|$',loc='center')
plt.xticks([-np.pi-0.5,0,np.pi+0.5],[r'$-\pi$',r'$0$',r'$\pi$'])
plt.xlim([-np.pi-0.5,np.pi+0.5])
(markers, stemlines, baseline) = plt.stem(wc,H1,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
plt.subplot(334)
plt.yticks([])
plt.xticks(t)
plt.title('b)',loc='left')
plt.stem(tpad,h2,basefmt=" ")#,use_line_collection=True)
plt.subplot(335)
plt.yticks([])
plt.xticks([0,np.pi,2*np.pi],[r'$0$',r'$\pi$',r'$2\pi$'])
plt.xlim([-0.5,2*np.pi+0.5])
plt.plot(wpad,H2,color='limegreen')
plt.xlim([-0.5,2*np.pi+0.5])
(markers, stemlines, baseline) = plt.stem(w,H1,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
plt.subplot(336)
plt.yticks([])
plt.xticks([-np.pi,0,np.pi],[r'$-\pi$',r'$0$',r'$\pi$'])
plt.xlim([-np.pi-0.5,np.pi+0.5])
plt.plot(wcpad,H2c,color='limegreen')
(markers, stemlines, baseline) = plt.stem(wc,H1,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
plt.subplot(337)
plt.yticks([])
plt.title('c)',loc='left')
plt.xlabel('$x_n$')
plt.stem(x,h3,basefmt=" ")#,use_line_collection=True)
plt.subplot(338)
plt.yticks([])
plt.xlabel('$\kappa_n$')
plt.xticks([0,np.pi,2*np.pi],[r'$0$',r'$\pi$',r'$2\pi$'])
plt.xlim([-0.5,2*np.pi+0.5])
plt.plot(w3pad,H3pad,color='limegreen')
(markers, stemlines, baseline) = plt.stem(w3,H3,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
plt.subplot(339)
plt.yticks([])
plt.xlabel('$\kappa_n$')
plt.xticks([-np.pi,0,np.pi],[r'$-\pi$',r'$0$',r'$\pi$'])
plt.plot(w3cpad,np.fft.fftshift(H3pad),color='limegreen')
plt.xlim([-np.pi-0.5,np.pi+0.5])
(markers, stemlines, baseline) = plt.stem(w3c,H3,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
#plt.savefig('about_fft1d.pdf',dpi=300,bbox_inches='tight',papertype='a4')
plt.show()
los métodos potenciales de prospección se utiliza muchas veces completar con una rampa lineal el dato de entrada con el objeto de reducir el ripple en el dominio transformado. Aqui vemos que sucede con el ejemplo sencillo de la función constante del caso b).
El resultado ahora tiene una mayor energia en $\kappa=0$ debido a que se agregan valores no nulos en los bordes (lo que se suma al promedio de la función original, aumentando el valor de la TDF en $\kappa=0$). La TDF tiene menos lóbulos laterales y tendería a simular la TDF de una constante.
# Ejemplo rampa lineal
h2 = np.pad(h1,5,mode='linear_ramp') # rampa lineal
H2 = np.abs(np.fft.fft(h2,npad))
H2c = np.abs(np.fft.fftshift(H2))
# Gráficos:
plt.figure(1,figsize=(18,12))
plt.subplot(334)
plt.yticks([])
plt.xticks(t)
plt.title('b)',loc='left')
plt.stem(tpad,h2,basefmt=" ")#,use_line_collection=True)
plt.xlabel('$x_n$')
plt.subplot(335)
plt.yticks([])
plt.xticks([0,np.pi,2*np.pi],[r'$0$',r'$\pi$',r'$2\pi$'])
plt.xlim([-0.5,2*np.pi+0.5])
plt.plot(wpad,H2,color='limegreen')
plt.xlabel('$\kappa_n$')
plt.xlim([-0.5,2*np.pi+0.5])
(markers, stemlines, baseline) = plt.stem(w,H1,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
plt.subplot(336)
plt.yticks([])
plt.xticks([-np.pi,0,np.pi],[r'$-\pi$',r'$0$',r'$\pi$'])
plt.xlim([-np.pi-0.5,np.pi+0.5])
plt.plot(wcpad,H2c,color='limegreen')
plt.xlabel('$\kappa_n$')
(markers, stemlines, baseline) = plt.stem(wc,H1,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
plt.show()
Por último, extendemos la señal con sus valores en los bordes y observamos el resultado.
# Ejemplo extendiendo los valores en los bordes
h2 = np.pad(h1,5,mode='edge') # extiendo con los valores del borde
H2 = np.abs(np.fft.fft(h2,npad))
H2c = np.abs(np.fft.fftshift(H2))
# Gráficos:
plt.figure(1,figsize=(18,12))
plt.subplot(334)
plt.yticks([])
plt.xticks(t)
plt.title('b)',loc='left')
plt.stem(tpad,h2,basefmt=" ")#,use_line_collection=True)
plt.xlabel('$x_n$')
plt.subplot(335)
plt.yticks([])
plt.xticks([0,np.pi,2*np.pi],[r'$0$',r'$\pi$',r'$2\pi$'])
plt.xlim([-0.5,2*np.pi+0.5])
plt.plot(wpad,H2,color='limegreen')
plt.xlabel('$\kappa_n$')
plt.xlim([-0.5,2*np.pi+0.5])
(markers, stemlines, baseline) = plt.stem(w,H1,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
plt.subplot(336)
plt.yticks([])
plt.xticks([-np.pi,0,np.pi],[r'$-\pi$',r'$0$',r'$\pi$'])
plt.xlim([-np.pi-0.5,np.pi+0.5])
plt.plot(wcpad,H2c,color='limegreen')
plt.xlabel('$\kappa_n$')
(markers, stemlines, baseline) = plt.stem(wc,H1,markerfmt='ro',basefmt=" ")#,use_line_collection=True)
plt.setp(stemlines, linestyle="-", color="tomato", linewidth=1)
plt.setp(markers,color="tomato", linewidth=1)
plt.show()
Eso es todo por hoy.