Inspiration

NASA's Deep Space Network (DSN) adds the signals from several dishes to receive weak spacecraft. This is called arraying. Antenna time is limited: at times, the demand for DSN time is up to 40% more than the capacity (NASA OIG, 2023).

To align the dishes, JPL's SUMPLE method uses only the agreement between them. We asked a simple question: what happens when a stronger signal reaches all dishes, for example another spacecraft with the same frame format? Track 1 asks for software that finds, cleans, and decodes weak signals with no human tuning. We wanted a receiver that stays correct in that case and records the cause of each decision.

What it does

Choir is an autonomous MATLAB receiver for 8 simulated dishes.

  • It finds the carrier, aligns the dishes, decodes CCSDS telemetry frames, and writes a telemetry log.
  • It continues to operate after dish failures, clock errors, carrier frequency hops, fades, and interference.
  • It calculates the weight of each dish only from verified frames. A verified frame has a correct CRC, our spacecraft ID (42), and the next frame count.

The telemetry is real NASA Curiosity (MSL) data from the telemanom dataset. The radio link is simulated.

How we built it

  1. Frames. We pack the MSL values into 223-byte CCSDS-style frames. Each frame has a header, the telemetry as 16-bit integers, and a CRC-16 (crcConfig, crcGenerate, crcDetect).
  2. Waveform. ccsdsTMWaveformGenerator (Satellite Communications Toolbox) adds the sync marker 1ACFFC1D, the randomizer, BPSK modulation, and root-raised-cosine pulse shaping.
  3. Channel (hidden truth).
    • Each dish has its own signal level (±3 dB), delay, phase drift, and noise.
    • A seeded random schedule adds faults: a dead dish, a clock error, a carrier hop, a fade, and a noisy dish.
    • It also adds two interferers: a look-alike spacecraft (ID 21, same band) and a wide-band source.
  4. Receiver. The receiver is a state machine with four states:
    • SEARCH: squares the signal and finds the FFT peak.
    • ALIGN: correlates the sync marker on each dish.
    • DECODE: combines the dishes and decodes the frames.
    • FALLBACK: re-aligns the dishes after bad frames.

In DECODE, the dish weights are:

$$ \mathbf{w} = \mathbf{Q}^{-1}\mathbf{h}, \qquad \mathbf{Q} = \mathbf{R} - \mathbf{h}\mathbf{h}^{H} $$

  • \(\mathbf{h}\) is the spacecraft signature across the dishes, learned only from verified frames.
  • \(\mathbf{R}\) is the covariance of the current frame.
  • The eigenvalues of \(\mathbf{Q}\) have the noise level as a lower limit.
    1. Fair comparison. All receivers use the same samples and the same supervisor; only the weights are different. We compare against:
  • the best single dish
  • equal gain
  • SUMPLE
  • sync-marker only: the same calculation as Choir, but with \(\mathbf{h}\) from the 32 known sync-marker bits
  • a bound that knows the transmitted bits
    1. Scoring.
  • An independent scorer compares the log with the transmitted data, bit for bit.
  • Development used seeds 1–30 and 101–120. The final results use new seeds 301–320, run after the receiver was frozen.
  • parfor, binofit, and pwelch produce the results and the plots.
  • Seven automated tests check the CRC, the noise calibration, the fairness of the baselines, and that the truth never reaches the receiver.
    1. Other parts.
  • A Simulink model runs the same receiver code one frame per step, with a Level-2 MATLAB S-Function.
  • A teammate built swarm receivers that find the carrier frequency, phase, timing, and gain together.
  • A Raspberry Pi Pico demo shows the same acceptance rule with 3 LEDs and one photoresistor.

Results

Test (8 dishes, mean 2 dB Es/N0 per dish) Choir SUMPLE
Look-alike spacecraft, +10 dB 88.5% 0.0%
Look-alike spacecraft, +20 dB 87.8% 0.0%
Wide-band source, +10 dB 99.8% 0.8%
Six hidden faults per run (20 runs) 90.6% 77.7% (same supervisor)
Frames logged with incorrect data 0 0
  • Recovery: after a carrier hop, Choir recovered in 284 ms. With the supervisor off, Choir delivered 40.0%.
  • Spectra: with a +10 dB wide-band source, the output noise floor was 0.1 dB for Choir and 16 dB for SUMPLE.
  • Array gain: one dish needs approximately 8 dB to decode a frame. Eight dishes decoded 100% of the frames at 2 dB each. For 8 equal dishes, theory gives an array gain of \(10\log_{10} 8 \approx 9\) dB.

Challenges we faced

  • Self-cancellation. Our first weights used the full frame covariance. At high SNR, small errors in \(\mathbf{h}\) made the array cancel the spacecraft. We fixed this by subtracting \(\mathbf{h}\mathbf{h}^{H}\) and using the noise level as the lower limit for the eigenvalues.
  • A physical interferer model. In the first version, the interferers did not share the delay of each dish, and even the bound failed. We corrected the model: an interferer near the spacecraft direction now passes through the same delay at each dish.
  • A fair baseline. The first SNR estimate for the best-dish baseline gave impossible values. We now measure the noise from the residual of the sync-marker fit. A test checks that, without interference, SUMPLE is within a few frames of the bound.
  • Clock errors. A timing jump on one dish cost several frames. A check in each frame now removes a dish whose sync-marker match collapses, until the dish is re-timed.
  • Data access. The original telemanom download returned HTTP 403, so we used the Kaggle copy. MATLAB has no built-in .npy reader, so we wrote a small one.
  • Simulink. The MATLAB System block needed a Java runtime that was not available, so the model uses a Level-2 MATLAB S-Function.
  • A limit we cannot remove. In one geometry (seed 304), the look-alike arrived with a pattern similar to the spacecraft. All receivers failed there, including the bound. The similarity was 0.81; in the other nine geometries it was 0.16 to 0.58.

$$ \text{similarity} = \frac{|\mathbf{a}^{H}\mathbf{b}|}{\lVert\mathbf{a}\rVert\,\lVert\mathbf{b}\rVert} $$

What we learned

  • Agreement is not a safe reference. Alignment by agreement needs no data knowledge, but it follows the strongest common signal. The decoder check is a better reference.
  • Whole frames beat the sync marker. A verified frame gives 1,816 known symbols, and the sync marker gives 32. That is \(10\log_{10}(1816/32) \approx 17.5\) dB more averaging. Against a +20 dB look-alike, sync-marker only delivered 7.3% and Choir delivered 87.8%.
  • The ID check is necessary. All CCSDS spacecraft use the same sync marker and send correct CRCs.
  • Autonomy needs a supervisor. With the same weights but no supervisor, the result was 40.0% instead of 90.6%.
  • An honest evaluation has three parts: a hidden truth, an independent scorer, and new seeds after the design is frozen.
  • Some cases are physics limits. No dish weighting can separate two signals that arrive in the same way.

What's next

  • Recordings from several real stations.
  • Error-correcting codes (LDPC or turbo).
  • Elastic arraying: using fewer dishes when the signal margin is sufficient.
  • A Stateflow version of the supervisor.

Credits

  • Data: telemanom (Hundman et al., KDD 2018), NASA/JPL.
  • SUMPLE: Rogstad, IPN Progress Report 42-162 (2005).
  • AI assistance: the code was written with AI assistance (Claude). The team reviewed and ran it.

Built With

Share this project:

Updates

Submission history