None
Métodos potenciales de prospección, FCAG, 2023.
sinusoide de frecuencia cero). Considero la constante igual a $1$ y cinco muestras. La TDF muestra un "1" y todos ceros. Ahora el dilema. Si realmente la funcion muestreada en el dominio ambiental (espacio o tiempo) es una constante, entonces esta TDF es correcta.
puntos en la TDF, deberia extender con la misma constante los bordes de la función a modo de zero-padding. Si hago el zero-padding tradicional, es decir relleno con $0$ los bordes de la funcion muestreada en el dominio ambiental, entonces estoy 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}()$ asociado al cajon en tiempo. Puede pensar en una constante como una sinusoide con frecuencia cero.
trata de una sinusoide muestreada con infinitas muestras. Si se hace zero-padding, ya no se esta en presencia de una sinusoide, sino de una funcion que es un sector de sinusoide en un mar de ceros. 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
plt.xkcd()
plt.rcParams.update({'font.size': 14}) # tamaño de fuente
# =============================================================
# REPASO, TDF 1D
# =============================================================
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()
En 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 estoy agregando 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.
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, extiendo la señal con sus valores en los bordes y observamos el resultado.
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.