|
|
|
@ -45,7 +45,6 @@ def data_coherency(data):
|
|
|
|
|
return coherency / (ntraces - 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@timeit
|
|
|
|
|
def goldstein_filter(data, window_size: int = 32, overlap: int = 14, exponent=0.3):
|
|
|
|
|
if num.log2(window_size) % 1.0 or window_size < 4:
|
|
|
|
|
raise ValueError("window_size has to be pow(2) and > 4.")
|
|
|
|
@ -76,17 +75,17 @@ def goldstein_filter(data, window_size: int = 32, overlap: int = 14, exponent=0.
|
|
|
|
|
weights = num.abs(window_fft) ** exponent
|
|
|
|
|
# Optional
|
|
|
|
|
# weights = signal.medfilt2d(weights, kernel_size=3)
|
|
|
|
|
# weights /= weights.sum()
|
|
|
|
|
# window_coherency = data_coherency(window_data)
|
|
|
|
|
window_fft *= weights
|
|
|
|
|
window_filtered = num.fft.irfft2(window_fft)
|
|
|
|
|
|
|
|
|
|
taper_this = taper[: window_filtered.shape[0], : window_filtered.shape[1]]
|
|
|
|
|
# window_fft /= weights.sum()
|
|
|
|
|
window_flt = num.fft.irfft2(window_fft)
|
|
|
|
|
taper_this = taper[: window_flt.shape[0], : window_flt.shape[1]]
|
|
|
|
|
window_flt *= taper_this
|
|
|
|
|
filtered_data[
|
|
|
|
|
px_x : px_x + window_filtered.shape[0],
|
|
|
|
|
px_y : px_y + window_filtered.shape[1],
|
|
|
|
|
] += (
|
|
|
|
|
window_filtered * taper_this
|
|
|
|
|
)
|
|
|
|
|
px_x : px_x + window_flt.shape[0],
|
|
|
|
|
px_y : px_y + window_flt.shape[1],
|
|
|
|
|
] += window_flt
|
|
|
|
|
|
|
|
|
|
return filtered_data
|
|
|
|
|
|
|
|
|
@ -97,29 +96,28 @@ def normalize_diff(data, filtered_data):
|
|
|
|
|
|
|
|
|
|
def plot_goldstein(data):
|
|
|
|
|
def r(data):
|
|
|
|
|
v = num.std(data)
|
|
|
|
|
v = num.std(data) * 2
|
|
|
|
|
return -v, v
|
|
|
|
|
|
|
|
|
|
from .rust import goldstein_filter as goldstein_filter_rust
|
|
|
|
|
|
|
|
|
|
goldstein_filter_rust = timeit(goldstein_filter_rust)
|
|
|
|
|
|
|
|
|
|
window_size = 32
|
|
|
|
|
overlap = 14
|
|
|
|
|
window_size = 64
|
|
|
|
|
overlap = 30
|
|
|
|
|
exponent = 0.5
|
|
|
|
|
adaptive_weights = False
|
|
|
|
|
|
|
|
|
|
imshow_kwargs = dict(aspect=5, cmap="viridis", vmin=-1.0, vmax=1.0)
|
|
|
|
|
|
|
|
|
|
fig, (ax1, ax3, ax4) = plt.subplots(1, 3, sharex=True, sharey=True)
|
|
|
|
|
fig, (ax1, ax2, ax3, ax4) = plt.subplots(1, 4, sharex=True, sharey=True)
|
|
|
|
|
ax1.imshow(data, **imshow_kwargs)
|
|
|
|
|
# image_python = ax2.imshow(data, **imshow_kwargs)
|
|
|
|
|
image_python = ax2.imshow(data, **imshow_kwargs)
|
|
|
|
|
image_rust = ax3.imshow(data, **imshow_kwargs)
|
|
|
|
|
image_diff = ax4.imshow(data, **imshow_kwargs)
|
|
|
|
|
|
|
|
|
|
ax_slider = plt.axes((0.25, 0.05, 0.65, 0.03))
|
|
|
|
|
|
|
|
|
|
ax1.set_title("Data Input")
|
|
|
|
|
# ax2.set_title("Data Filtered (Python)")
|
|
|
|
|
ax2.set_title("Data Filtered (Python)")
|
|
|
|
|
ax3.set_title("Data Filtered (Rust)")
|
|
|
|
|
ax4.set_title("Data Residual")
|
|
|
|
|
|
|
|
|
@ -136,22 +134,26 @@ def plot_goldstein(data):
|
|
|
|
|
global data
|
|
|
|
|
# data = data_bp
|
|
|
|
|
|
|
|
|
|
# data_filtered = goldstein_filter(
|
|
|
|
|
# data, window_size=window_size, exponent=val, overlap=overlap
|
|
|
|
|
# )
|
|
|
|
|
data_filtered_py = goldstein_filter(
|
|
|
|
|
data, window_size=window_size, exponent=val, overlap=overlap
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
data_filtered = goldstein_filter_rust(
|
|
|
|
|
data, window_size=window_size, exponent=val, overlap=overlap
|
|
|
|
|
data, window_size=window_size, exponent=val, overlap=overlap,
|
|
|
|
|
adaptive_weights=adaptive_weights
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# image_python.set_data(data_filtered)
|
|
|
|
|
# image_python.set_norm(Normalize(*r(data_filtered)))
|
|
|
|
|
image_python.set_data(data_filtered_py)
|
|
|
|
|
image_python.set_norm(Normalize(*r(data_filtered_py)))
|
|
|
|
|
image_python.set_norm(None)
|
|
|
|
|
|
|
|
|
|
image_rust.set_data(data_filtered)
|
|
|
|
|
image_rust.set_norm(Normalize(*r(data_filtered)))
|
|
|
|
|
image_rust.set_norm(None)
|
|
|
|
|
|
|
|
|
|
norm_diff = normalize_diff(data, data_filtered)
|
|
|
|
|
image_diff.set_data(norm_diff)
|
|
|
|
|
image_diff.set_norm(Normalize(*r(norm_diff)))
|
|
|
|
|
image_diff.set_norm(None)
|
|
|
|
|
|
|
|
|
|
fig.canvas.draw_idle()
|
|
|
|
|