Found while implementing #125. REQ-DEM-021 lists nine pulse-shaping filters and a test counts
them. Implementing REQ-DEM-010's MSK row needed a tenth, and this records why, because a
requirement's own count is not a thing to change quietly.
The tenth
The linearised-MSK main pulse: half a cycle of a cosine across two symbols.
MSK is π/2-BPSK at the bit rate shaped by that pulse. The catalogue's existing Half Sine is half
a cosine across one symbol — the shaping of an offset format's staggered axes, and of MSK read at
half the bit rate, where a symbol is two bits.
The two are one factor of two apart and produce entirely different signals:
| Pulse at the bit rate |
Envelope varies by |
EVM |
Is it MSK? |
| Half sine, one symbol |
240 dB (it reaches zero at every symbol boundary) |
0.000000 %rms |
No |
| Half cosine, two symbols |
0.17 dB |
0.000000 %rms |
Yes |
Both demodulate perfectly. Only one is a constant-envelope modulation, and constant envelope is the
entire reason MSK exists — a transmitter with no envelope variation can be run at saturation. A
round trip that checked only EVM would have accepted the wrong one, which is why
FormatCatalogueTests now measures the envelope as well.
Why this is the requirement's own logic
REQ-DEM-021 already carries the exactly analogous filter for the other member of that family:
EDGE's c₀(t), the linearised-GMSK main pulse, is in the list because EDGE cannot be measured
without it. MSK's linear pulse is the same object for the case with no Gaussian filter in front of
the modulator. Listing one and not the other looks like an omission rather than a decision.
Implemented
PulseFilterType.Msk = 9, appended so that no older state file contains the value.
PulseFilterCatalogueTests.TheCatalogueHasTheNineTypesTheRequirementListsAndOneItImplies now
asserts ten and says which is which.
What to decide
Whether REQ-DEM-021's text should say ten and name it — in which case this is a specification
edit and sync_issues.py regenerates the issue — or whether MSK should instead be demodulated in
its offset form at half the bit rate, where the existing Half Sine is the right pulse and no tenth
entry is needed. The cost of that alternative is the symbol rate an operator types: it would be
half the bit rate, where the reference product and every standard quote the bit rate.
Found while implementing #125.
REQ-DEM-021lists nine pulse-shaping filters and a test countsthem. Implementing
REQ-DEM-010's MSK row needed a tenth, and this records why, because arequirement's own count is not a thing to change quietly.
The tenth
The linearised-MSK main pulse: half a cycle of a cosine across two symbols.
MSK is π/2-BPSK at the bit rate shaped by that pulse. The catalogue's existing Half Sine is half
a cosine across one symbol — the shaping of an offset format's staggered axes, and of MSK read at
half the bit rate, where a symbol is two bits.
The two are one factor of two apart and produce entirely different signals:
Both demodulate perfectly. Only one is a constant-envelope modulation, and constant envelope is the
entire reason MSK exists — a transmitter with no envelope variation can be run at saturation. A
round trip that checked only EVM would have accepted the wrong one, which is why
FormatCatalogueTestsnow measures the envelope as well.Why this is the requirement's own logic
REQ-DEM-021already carries the exactly analogous filter for the other member of that family:EDGE's
c₀(t), the linearised-GMSK main pulse, is in the list because EDGE cannot be measuredwithout it. MSK's linear pulse is the same object for the case with no Gaussian filter in front of
the modulator. Listing one and not the other looks like an omission rather than a decision.
Implemented
PulseFilterType.Msk = 9, appended so that no older state file contains the value.PulseFilterCatalogueTests.TheCatalogueHasTheNineTypesTheRequirementListsAndOneItImpliesnowasserts ten and says which is which.
What to decide
Whether
REQ-DEM-021's text should say ten and name it — in which case this is a specificationedit and
sync_issues.pyregenerates the issue — or whether MSK should instead be demodulated inits offset form at half the bit rate, where the existing Half Sine is the right pulse and no tenth
entry is needed. The cost of that alternative is the symbol rate an operator types: it would be
half the bit rate, where the reference product and every standard quote the bit rate.