feat(notch): protected-band remez notch stage + global settings + pipeline dispatch (ticket 44) #43
No reviewers
Labels
No labels
accessibility
bug
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
ykp/gensig!43
Loading…
Reference in a new issue
No description provided.
Delete branch "protected-notch-stage"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Round 9 W2 — the signal-processing stage for protected bands (spec §5.3.3 is the authority; #42 shipped the W1 data layer).
The stage —
protected_notch.py(new)One remez FIR notch per counted record, applied successively in table order:
[0, w], pass fromw + Transition— the remez shape deduced from the record), remix. A plain real symmetric filter would also cut the mirror band — for a 985–995 MHz record the mirror (RF 1005–1015) survives at +0.26 dB while the notch reaches −73 dB at centre (wide transition, cap unhit).Rejection:δp/δswithδp = 10^(ripple/20)−1andδs = 10^(−rejection/20).[fc−BW/2, fc+BW/2]contributes no filter; zero counted records ⇒ bit-identical passthrough.Global settings (operator decision #7)
notch_passband_ripple_db(default 0.05, range [0.001, 1.0] dB) andnotch_tap_cap(default 512, range [16, 4096]) — validators, JSON persistence (tolerant of old files), and two new settings-dialog rows.Dispatch
pipeline.apply_post_chaingains the ProtectedNotch stage between BandIsolation and Windowing; docstring chain updated.Tests —
tests/test_protected_notch.py(18)Design shape (odd taps, mix centre, cap hit), out-of-baseband skip, one-sided semantics (the headline contract), stopband-weight math, cascade composition (order-invariant in the interior — each stage is diagonal in frequency; the convolution-edge samples legitimately differ), span-gate skip, no-mutation, passthroughs, count helper, post-chain wiring, settings defaults/validation/round-trip/form mapping, tap-cap flow, determinism. Premise sets (settings
to_dictkeys, dialog field shape) updated.Gate
pytest: 1278 passed / 63 skipped, coverage 94.53 %ruff+mypy: clean