# Stereo-channel cancellation: a reproducible Robot 36 check

4 November 2026 / Alex Carter / CannedRocket / alex.carter@saltyisland.dev

This is new controlled audio-routing evidence, not an upstream bug report, product benchmark or RF test. No new upstream comment or PR has been submitted. The arithmetic average of two equal opposite-polarity channels is exactly zero even though either channel is audible alone.

## Actual results

Using the unchanged source code of Open-SSTV 0.6.18 at base f773bd4fcb9da0c68ab915e9a1fa2c024bfdcc98:

- Same-polarity stereo: decoder exit0, VIS0x08 / Robot36, image320x240.
- Opposite-polarity stereo: each channel RMS5612.3414 in int16 units; arithmetic mono RMS0, exit1 / no SSTV header.
- Explicit left-channel extraction: recovered PCM exactly equals the original mono source, exit0, image320x240. The recovered image pixels match the same-polarity control exactly.

This tests a documented average-to-mono path. It is not evidence that all stereo recordings are faulty or that SSTV Signal Desk has the same channel policy. Real recordings need separate channel inspection; selecting one channel can discard useful content in the other. Preserve the original recording.

## Reproduce

Use Python3.11+ in an environment with Open-SSTV's dependencies and FFmpeg. Follow the pinned project's installation instructions. The original generated WAV is https://sstv.org.uk/samples/first-decode/robot36.wav ; its SHA-256 is dbb64c8cb34d3599c5aa7c36144746039632832da554eefff324a9fc68ae0166.

Download reproduce-stereo-channel-check.py, then run with the pinned repository and a new output directory:

```sh
PYTHONPATH=/path/to/Open-SSTV/src python reproduce-stereo-channel-check.py robot36.wav /path/to/Open-SSTV new-results
```

The script generates both stereo controls, runs the actual decoder on all three cases, and writes WAVs, PNGs, logs and report.json. It does not play audio or use a radio. It verifies the source checksum and unchanged decoder source before starting.

For an ordinary stereo audio recording, select the useful channel after checking it, rather than blindly averaging:

```sh
ffmpeg -i recording.wav -af 'pan=mono|c0=c0' -c:a pcm_s16le left.wav
ffmpeg -i recording.wav -af 'pan=mono|c0=c1' -c:a pcm_s16le right.wav
```

Do not apply these commands blindly to raw I/Q data. Demodulate an I/Q recording into ordinary audio with a suitable SDR tool first.

## Primary references and rights

- Open-SSTV pinned audio loader: https://github.com/bucknova/Open-SSTV/blob/f773bd4fcb9da0c68ab915e9a1fa2c024bfdcc98/src/open_sstv/audio/file_io.py
- FFmpeg pan filter: https://www.ffmpeg.org/ffmpeg-filters.html#pan-1
- FFmpeg first-channel example: https://ffmpeg.org/pipermail/ffmpeg-user/2021-February/051748.html

The generated source sample and new reproduction script are CannedRocket test material, supplied for reproducing and explaining this check. Open-SSTV remains a separate GPL-licensed project; no source from that project is copied into the reproduction script. No endorsement or publication obligation is implied. The source sample remains unchanged and belongs to the existing public practice library.
