Both requirements delegate a choice rather than making one, and both choices are load-bearing. This
records what was chosen, what it was measured against, and what changing it would cost.
1. Which normalisation applies to which filter
REQ-DEM-022a asks the implementation to "apply one documented normalisation step at a single
point in the code, and state which normalisation applies to the measurement filter and which to
the reference filter". It does not say which.
Chosen — and they are different, which is the part worth arguing about:
- Measurement → unit DC gain. An unmodulated carrier comes out at exactly the level it went in
at, at every span. That makes REQ-DEM-023's "changing the span does not change the measured
amplitude of a CW tone by more than 0.01 dB" true by construction: measured across spans 4 to 32,
the deviation is 1.5e-14 dB. In the tap domain that is Σh = 1, because the DC gain of a
discrete convolution is the sum of its taps.
- Reference → unit peak. The reference waveform's value at a symbol instant has to be the
constellation point that was decided. Any other scale puts the ideal and the measured waveforms on
different scales and the difference lands in EVM.
The alternative — one convention for both — cannot work: unit peak on the measurement filter makes a
CW tone's amplitude depend on the span, and unit DC gain on the reference filter scales the ideal
waveform away from the decided symbols. The requirement's phrasing implies it already knew that.
They are applied in one place, PulseFilter.Normalise, with the continuous counterpart in
PulseFilter.Scale. The unit-energy normalisation that used to live in PulseShaping — a third
convention, and the one that made the cascade overshoot by ≈3.8× as the requirement notes — is gone.
2. Which truncation window
REQ-DEM-023 requires "windowed truncation" with "stopband sidelobes below those of a rectangularly
truncated filter of the same span". It does not say which window — and the obvious ones break
REQ-DEM-022a's cascade identity. Measured (α = 0.35, 16 samples/symbol,
evidence/req-dem-022a/cascade-and-window.txt):
| window |
cascade ±8 |
cascade ±64 |
worst sidelobe at ±8 |
| rectangular |
5.40e-4 |
3.18e-6 |
−55.6 dB |
| tukey 0.25 |
6.89e-4 |
1.51e-6 |
−61.0 dB |
| hann |
4.71e-3 ✗ |
2.77e-5 ✗ |
−95.9 dB |
| blackman |
7.42e-3 ✗ |
4.52e-5 ✗ |
−105.9 dB |
REQ-DEM-022a demands under 1e-3 at ±8 and under 5e-6 at ±64. Hann and Blackman fail both, by
four and eight times — they win the sidelobe contest and lose the requirement.
Chosen: a Tukey taper over a quarter of the length — an eighth at each end, raised-cosine
shaped. It satisfies both requirements at once: quieter than a rectangular truncation at every span
(measured in the build: −61.3 vs −55.7 dB at ±8, −115.2 vs −81.6 dB at ±32), and a cascade error at
±64 that is better than rectangular's rather than worse.
So there is no conflict between the two requirements — but only because the window was chosen by
measuring it against both, and a reasonable person reaching for Hann would have broken one of them
silently.
To unroll
PulseFilter.TaperFraction is the whole of the second question — one constant, with this table in
its remarks. PulseFilter.Normalise and PulseFilter.Scale are the whole of the first.
Delivered with #139 and #140.
Both requirements delegate a choice rather than making one, and both choices are load-bearing. This
records what was chosen, what it was measured against, and what changing it would cost.
1. Which normalisation applies to which filter
REQ-DEM-022aasks the implementation to "apply one documented normalisation step at a singlepoint in the code, and state which normalisation applies to the measurement filter and which to
the reference filter". It does not say which.
Chosen — and they are different, which is the part worth arguing about:
at, at every span. That makes
REQ-DEM-023's "changing the span does not change the measuredamplitude of a CW tone by more than 0.01 dB" true by construction: measured across spans 4 to 32,
the deviation is 1.5e-14 dB. In the tap domain that is Σh = 1, because the DC gain of a
discrete convolution is the sum of its taps.
constellation point that was decided. Any other scale puts the ideal and the measured waveforms on
different scales and the difference lands in EVM.
The alternative — one convention for both — cannot work: unit peak on the measurement filter makes a
CW tone's amplitude depend on the span, and unit DC gain on the reference filter scales the ideal
waveform away from the decided symbols. The requirement's phrasing implies it already knew that.
They are applied in one place,
PulseFilter.Normalise, with the continuous counterpart inPulseFilter.Scale. The unit-energy normalisation that used to live inPulseShaping— a thirdconvention, and the one that made the cascade overshoot by ≈3.8× as the requirement notes — is gone.
2. Which truncation window
REQ-DEM-023requires "windowed truncation" with "stopband sidelobes below those of a rectangularlytruncated filter of the same span". It does not say which window — and the obvious ones break
REQ-DEM-022a's cascade identity. Measured (α = 0.35, 16 samples/symbol,evidence/req-dem-022a/cascade-and-window.txt):REQ-DEM-022ademands under 1e-3 at ±8 and under 5e-6 at ±64. Hann and Blackman fail both, byfour and eight times — they win the sidelobe contest and lose the requirement.
Chosen: a Tukey taper over a quarter of the length — an eighth at each end, raised-cosine
shaped. It satisfies both requirements at once: quieter than a rectangular truncation at every span
(measured in the build: −61.3 vs −55.7 dB at ±8, −115.2 vs −81.6 dB at ±32), and a cascade error at
±64 that is better than rectangular's rather than worse.
So there is no conflict between the two requirements — but only because the window was chosen by
measuring it against both, and a reasonable person reaching for Hann would have broken one of them
silently.
To unroll
PulseFilter.TaperFractionis the whole of the second question — one constant, with this table inits remarks.
PulseFilter.NormaliseandPulseFilter.Scaleare the whole of the first.Delivered with #139 and #140.