slope_filter open bounds, signed velocities, and slowness-based bounds #708
Replies: 2 comments 1 reply
-
|
Hey @alanfbaird, Thanks for raising the issue. I am doing field work this week, but I will think about and write more next week. In the meantime, maybe @Shihao-Yuan has some ideas? I think he did the orignal slope filter implementation. |
Beta Was this translation helpful? Give feedback.
-
|
Hi @alanfbaird, thanks for the feedback. At the moment, slope_filter requires a sorted length-4 filt=[a, b, c, d], regardless of whether the values are interpreted as velocity or slowness. For directional=True, the filter is applied to signed slope values, so negative-velocity filters must indeed be numerically sorted (e.g., [-vd, -vc, -vb, -va] rather than simply negating [va, vb, vc, vd]). This is consistent with the underlying implementation, although I agree it is not necessarily obvious from a user's perspective and should probably be documented more explicitly. Open bounds are currently not supported. The filter specification always requires four finite values. Your examples using ... makes sense to me, particularly for symmetric magnitude-based filtering when directional=False. I can see how expressions such as (..., ..., vc, vd) or (va, vb, ..., ...) would be more intuitive than constructing the equivalent signed directional filters manually. I will generalize the parameterization for open bounds in the following days. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
I’d like to discuss the
Patch.slope_filterAPI from a user perspective, especially around directional filters, open bounds, and whether slowness should be supported as an alternative to velocity.Currently
slope_filtertakes a sorted length-4filt=[va, vb, vc, vd]. Withdirectional=False, these appear to behave like apparent velocity magnitudes. Withdirectional=True, the sign of the values indicates propagation direction, so a negative-velocity filter must be sorted numerically. For example, instead of simply negating[va, vb, vc, vd]to[-va, -vb, -vc, -vd], the valid signed order appears to be[-vd, -vc, -vb, -va].This is technically consistent with filtering on signed slope values, but it is unintuitive to me as a user because I tend to think of “high velocity” and “low velocity” by absolute value, with direction as a separate concept.
One case I’d find useful is open symmetric magnitude bounds when
directional=False, similar topass_filterallowing...for open frequency bounds. For example:patch.slope_filter(filt=(..., ..., vc, vd))patch.slope_filter(filt=(va, vb, ..., ...))Conceptually, these could map onto the existing signed directional representation:
filt=(-vd, -vc, vc, vd), directional=Truefilt=(-vb, -va, va, vb), directional=True, invert=TrueThe
invert=Truepart for the high-velocity pass is also slightly unintuitive. In the symmetric/magnitude mental model,(va, vb, ..., ...)reads like “pass above this lower bound.” But in the signed representation,(-vb, -va, va, vb)describes the central low-velocity band, so getting the high-velocity pass requires inverting it. In other words, what feels like a lower bound in the symmetric API becomes the edge of a central low-velocity notch/pass region internally. That mapping works, but it is easy to trip over.More generally, I wonder if slowness bounds should be supported as an alternative to velocity bounds. For many seismic/DAS use cases, arrivals are naturally bounded in slowness by the medium, e.g.
p = +/- 1 / v. This makes filters around broadside or near-zero-slowness arrivals easier to express. A “high velocity pass” is equivalent to a near-zero slowness pass, which is conceptually continuous in slowness but awkward in velocity because velocity tends toward +/- infinity at zero slowness.Questions
directional=Falsesymmetric velocity filters?velocity=/slowness=or a separatedirection=argument make this clearer long-term?Beta Was this translation helpful? Give feedback.
All reactions