fix: a zero-width band fires on equality or not at all, and the text now says which
The earlier correction moved the claim rather than fixing it: four places still said the float-equality test "never fires on a real-valued signal", and a +/-1 square is a real-valued signal -- a standalone check against a band of [1, 1] fired 19 times, because `inside` is true at +1 and false at -1, so the signal changes side on every transition. All four now state the measured behaviour: an exact float-equality test against the level, which an ordinary signal never satisfies and a signal sitting at the level satisfies on every transition. Neither answer is a band, which is the reason the second spin is clamped an increment away rather than the detector special-cased -- the same conclusion, now resting on a true premise. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
c8f10f59dc
commit
aa8ec1794a
4 files changed
+18
-9
No files matched your search
@@ -687,8 +687,11 @@ modes are unchanged, and only the question "did an event happen at this sample"
|
|||||||
because that is the first sample at which the width is known. `<` a width shorter than the
|
because that is the first sample at which the width is known. `<` a width shorter than the
|
||||||
signal's own pulses is the glitch trigger: nothing but a runt satisfies it.
|
signal's own pulses is the glitch trigger: nothing but a runt satisfies it.
|
||||||
- **window** — the signal entering or leaving a band between two levels. A band is two levels,
|
- **window** — the signal entering or leaving a band between two levels. A band is two levels,
|
||||||
so the panel refuses a zero-width one: it reduces the condition to a float-equality test,
|
so the panel refuses a zero-width one: it reduces the condition to an exact float-equality
|
||||||
which on a real-valued signal never fires.
|
test against the level, which an ordinary signal never satisfies and a signal sitting *at*
|
||||||
|
the level satisfies on every transition — a ±1 square against a band of `[1, 1]` fired 19
|
||||||
|
times in a standalone check. Neither answer is a band, which is why the second spin is
|
||||||
|
clamped an increment away rather than the detector special-cased.
|
||||||
- **dropout** — the *absence* of a crossing for longer than a timeout. One event per outage:
|
- **dropout** — the *absence* of a crossing for longer than a timeout. One event per outage:
|
||||||
the condition re-arms only when a crossing returns.
|
the condition re-arms only when a crossing returns.
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -119,8 +119,11 @@ double EventDetector::feed_window(double value, double t) noexcept {
|
|||||||
if (inside == inside_) return kNoEvent;
|
if (inside == inside_) return kNoEvent;
|
||||||
inside_ = inside;
|
inside_ = inside;
|
||||||
// The event is the *change of side*, so `Rising` reads as "into the band" and `Falling`
|
// The event is the *change of side*, so `Rising` reads as "into the band" and `Falling`
|
||||||
// as "out of it". A band of zero width reduces the condition to an equality test on a
|
// as "out of it". A band of zero width is not a band: `inside` reduces to an exact
|
||||||
// real-valued signal, which is a float-equality test and therefore unusable: the panel refuses one.
|
// float-equality test against the level, so the condition fires on none of an ordinary
|
||||||
|
// signal's samples and on every transition of one that sits exactly at the level -- a
|
||||||
|
// +/-1 square against a band of [1, 1] fired 19 times in a standalone check. Neither
|
||||||
|
// answer is a band, so the panel refuses one.
|
||||||
const bool fired = (cond_.edge == TriggerEdge::Rising && inside) ||
|
const bool fired = (cond_.edge == TriggerEdge::Rising && inside) ||
|
||||||
(cond_.edge == TriggerEdge::Falling && !inside) ||
|
(cond_.edge == TriggerEdge::Falling && !inside) ||
|
||||||
cond_.edge == TriggerEdge::Both;
|
cond_.edge == TriggerEdge::Both;
|
||||||
|
|||||||
@@ -34,8 +34,10 @@ share. <b>Arm</b> starts watching; <tt>a</tt> arms and disarms from the keyboard
|
|||||||
behaviour. <b>Pulse width</b> — a crossing and its return, qualified by how long the excursion
|
behaviour. <b>Pulse width</b> — a crossing and its return, qualified by how long the excursion
|
||||||
lasted: less than, greater than, within or outside a pair of widths; the event is timed at the
|
lasted: less than, greater than, within or outside a pair of widths; the event is timed at the
|
||||||
closing edge. <b>Window</b> — the signal entering or leaving a band between two levels; the
|
closing edge. <b>Window</b> — the signal entering or leaving a band between two levels; the
|
||||||
panel keeps the two levels at least one increment apart, because a zero-width band reduces the
|
panel keeps the two levels at least one increment apart, because a zero-width band is not a
|
||||||
condition to a float-equality test that never fires on a real-valued signal. <b>Dropout</b> —
|
band: the condition becomes an exact float-equality test against the level, which an ordinary
|
||||||
|
signal never satisfies and a signal sitting at the level satisfies on every transition.
|
||||||
|
<b>Dropout</b> —
|
||||||
the absence of a crossing for longer than a timeout; one event per outage, re-arms when a
|
the absence of a crossing for longer than a timeout; one event per outage, re-arms when a
|
||||||
crossing returns.
|
crossing returns.
|
||||||
• The shape's own rows are the only ones shown; the rest are hidden, so the panel never offers
|
• The shape's own rows are the only ones shown; the rest are hidden, so the panel never offers
|
||||||
|
|||||||
+4
-3
@@ -6983,9 +6983,10 @@ GtkWidget* build_trigger_panel(App& app) {
|
|||||||
app.trigger_level2_spin = spin(-1.0e12, 1.0e12, 0.01, 4);
|
app.trigger_level2_spin = spin(-1.0e12, 1.0e12, 0.01, 4);
|
||||||
gtk_widget_set_tooltip_text(app.trigger_level2_spin,
|
gtk_widget_set_tooltip_text(app.trigger_level2_spin,
|
||||||
"the band's other edge; it is kept at least one increment away "
|
"the band's other edge; it is kept at least one increment away "
|
||||||
"from the level, because a band of zero width reduces the "
|
"from the level, because a band of zero width is not a band: the "
|
||||||
"condition to a float-equality test, which on a real-valued "
|
"condition becomes an exact float-equality test against the level, "
|
||||||
"signal never fires");
|
"which an ordinary signal never satisfies and a signal sitting at "
|
||||||
|
"the level satisfies on every transition");
|
||||||
app.trigger_level2_row = labeled_box("to level", app.trigger_level2_spin);
|
app.trigger_level2_row = labeled_box("to level", app.trigger_level2_spin);
|
||||||
gtk_box_append(GTK_BOX(box), app.trigger_level2_row);
|
gtk_box_append(GTK_BOX(box), app.trigger_level2_row);
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user