Skip to content

Collision decode: AIS SIC + ADS-B findings (sighting-based ICAO clock)#97

Merged
kevinelliott merged 1 commit into
masterfrom
collision-decode
Jun 11, 2026
Merged

Collision decode: AIS SIC + ADS-B findings (sighting-based ICAO clock)#97
kevinelliott merged 1 commit into
masterfrom
collision-decode

Conversation

@kevinelliott

Copy link
Copy Markdown
Contributor

What

The collision-decode round, honestly reported:

  • AIS successive interference cancellation: a confirmed FCS-valid burst is reconstructed exactly — the bits are known and the synthesis is the modulator's own GMSK waveform — least-squares scaled with its own CFO estimate, subtracted from the window, and the residual re-hunted and decoded for a colliding burst. No gain on the bench fixture: the missing 17 payloads never anchor at any threshold (0.72 → 0.55 changes nothing) — they're the genuinely weakest tail of distant base stations, not collisions. The machinery is in place for dense coastal traffic where slot collisions are routine.
  • ADS-B in-frame collision scanning: falsified on modes1 (−7 unique). Scanning inside decoded frame spans produces mid-frame false DF11 candidates that pollute the ICAO cache. Reverted, documented.
  • Lasting fix from the experiment: the ICAO cache staleness clock ticks on sightings rather than candidate attempts — attempt-based aging thrashes under near-floor gates.

Gates

All green at current floors (ADS-B 323 ≥ 310, AIS 51 ≥ 48, VDL2 44 ≥ 42); full workspace passing.

🤖 Generated with Claude Code

- AIS successive interference cancellation: a confirmed FCS-valid
  burst is reconstructed exactly (known bits through the modulator's
  own GMSK synthesis), least-squares scaled with per-burst CFO,
  subtracted, and the residual re-hunted/decoded for a colliding
  burst. Measured: no gain on the (sparse, inland) bench fixture -
  the missing 17 never anchor at any threshold; they are deep-weak,
  not collisions. Machinery in place for dense traffic.
- ADS-B in-frame collision scanning falsified on modes1 (-7 unique:
  mid-frame false DF11 candidates pollute the ICAO cache); reverted.
- Lasting fix from that experiment: the ICAO cache staleness clock
  now ticks on sightings, not candidate attempts (attempt-based
  aging thrashes under near-floor gates).
- hunt refactored around a shared slice-based template metric.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@kevinelliott, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 38 minutes and 2 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more credits in the billing tab to continue.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 32a8054f-b7c6-4c3c-be2f-26a62a179a6e

📥 Commits

Reviewing files that changed from the base of the PR and between 9349c51 and 9c751c7.

📒 Files selected for processing (4)
  • crates/xng-mode-adsb/src/demod.rs
  • crates/xng-mode-adsb/src/frame.rs
  • crates/xng-mode-ais/src/coherent.rs
  • docs/notes/BENCHMARKS.md
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch collision-decode

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@kevinelliott kevinelliott merged commit 5a99b68 into master Jun 11, 2026
3 checks passed
@kevinelliott kevinelliott deleted the collision-decode branch June 11, 2026 20:26

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9c751c7b8d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +341 to +342
let dphi = (c2 * c1.conj()).arg();
let cfo_step = Complex::from_polar(1.0, dphi / (n as f32 / 2.0));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the decoded CFO when cancelling AIS bursts

For AIS bursts with ordinary carrier offsets, this whole-burst phase-slope estimate aliases because arg() wraps the phase difference between the two halves; at 48 kHz and a typical ~1-slot waveform, the unambiguous range is only on the order of 40 Hz, while the decoder accepts offsets up to ±1200 Hz. In those cases SIC subtracts the confirmed frame with the wrong per-sample rotation, leaving the original burst in the residual (or adding interference), so collision recovery only works for near-zero CFO bursts even though try_decode already found a usable coarse/fine CFO.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant