bandsaunter/tests
The Dust Council 2aa8739f25 Tune SSB to the carrier, and read the sideband from the signal
An SSB capture was tuned to the centroid of the detected energy, which is
what every other mode wants and the one thing SSB cannot use. Its
demodulator is a filter that opens at the suppressed carrier, so centring
on the middle of the voice filtered off its lower half and shifted the
rest down by the error. Measured against known transmitters that error was
+2445 Hz on 20 m and -2486 Hz on 80 m, against 35 Hz for NFM and 9 Hz for
AM, which do not care either way. On real speech the difference is a clean
transcript versus nothing recognisable at all.

Speech puts most of its power just above the carrier, so the occupied band
leans towards it. ssb_alignment() reads that lean: it locates the carrier
to within about 100 Hz and names the sideband at the same time, without
recourse to any convention. The offset is applied inside the demodulator
at the IF rate, where it costs a fraction of what shifting the full-rate
stream would, and the reported frequency becomes the carrier -- the
frequency an operator would dial in.

The sideband was also decided by "LSB below 10 MHz, USB above", which
overrode a band plan that already knew better and demodulated 60 m as LSB.
The measurement decides now, the band plan when the signal has no lean to
read, and the convention only when neither has anything to say.

The simulator was transmitting SSB unfiltered, several times wider than
anything on the air, because it applied no transmit audio filter -- and
that filter is what makes a signal single-sideband. Its absence hid the
whole problem from the tests.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 23:09:44 -07:00
..
morse_gen.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
signals.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
speech.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_announce.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_classify.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_dsp.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_morse.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_quality.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_ranges.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_scanner.py Make the simulator reproducible and widen the burst tests 2026-08-21 22:29:29 -07:00
test_settings.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_ssb.py Tune SSB to the carrier, and read the sideband from the signal 2026-08-21 23:09:44 -07:00
test_transcribe.py Package the speech recogniser and its model for apt 2026-08-21 22:12:24 -07:00
test_tui.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_ui.py Initial commit: bandsaunter, an RTL-SDR signal scanner 2026-08-21 20:50:20 -07:00
test_version.py Add packaging, date-based versioning, and full install docs 2026-08-21 21:05:51 -07:00