Skip to content

Commit b506315

Browse files
authored
Merge pull request #173 from airframesio/iridium-demod-acquisition
iridium: matched-filter burst acquisition + per-peak detection (3x weak-burst IDA yield)
2 parents 49a6760 + bfc89db commit b506315

14 files changed

Lines changed: 1431 additions & 431 deletions

File tree

‎Cargo.lock‎

Lines changed: 14 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ exclude = ["legacy"]
44
resolver = "2"
55

66
[workspace.package]
7-
version = "0.19.0"
7+
version = "0.20.0"
88
edition = "2021"
99
license = "MIT OR Apache-2.0"
1010
repository = "https://github.com/airframesio/xng"

‎README.md‎

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ cores that share one capture, one message model, one application layer,
1616
and one set of outputs (including first-class
1717
[airframes.io](https://airframes.io) feeding).
1818

19-
On off-air benchmark captures xng **beats dumpvdl2 on VDL2** and
20-
decodes **97–99 % of the strongest oracles for Mode S, HFDL, and
21-
AIS** (readsb, dump1090-fa, dumphfdl, AIS-catcher) while finding
22-
Mode S frames they miss — see the
23-
[benchmarks](#benchmarks) below; every number is enforced by a
24-
[CI regression gate](bench/) on each pull request.
19+
On off-air benchmark captures xng **beats dumpvdl2 on VDL2 and
20+
gr-iridium on Iridium**, and decodes **97–99 % of the strongest
21+
oracles for Mode S, HFDL, and AIS** (readsb, dump1090-fa, dumphfdl,
22+
AIS-catcher) while finding Mode S frames they miss — see the
23+
[benchmarks](#benchmarks) below; every count-gated number is enforced
24+
by a [CI regression gate](bench/) on each pull request.
2525

2626
Releases ship binaries for Linux (x86_64/arm64, tarball + .deb), macOS
2727
Apple Silicon, and multi-arch Docker images.
@@ -65,7 +65,7 @@ conventions — invisible to loopback testing — were caught only this way).
6565
| Inmarsat Aero L (JAERO port) | `aero` | 1545–1547 MHz | P-channels 600/1200 bps + 10.5 kbps, ACARS/ADS-C/CPDLC, **C-channel assignment SUs (voice-circuit frequencies from call setup)**; **C-channel voice circuits (8.4 kbps OQPSK): AMBE voice-frame extraction + call-progress/telephony signal units** | Real Inmarsat recordings: 600 bps + 10.5k both decode off-air; C-channel RF loopback |
6666
| Inmarsat Aero C bursts | `aero-c` | C-band | R/T-channel signal units | RF loopback |
6767
| Inmarsat STD-C / EGC | `std-c` | 1537–1542 MHz | NCS frames, EGC SafetyNET/FleetNET text, logical-channel messages | Off-air EGC capture, field-exact vs reference |
68-
| Iridium | `iridium` | 1616–1626.5 MHz | Ring alerts (live satellite positions), broadcasts, **ACARS over SBD**, **pager messages (IMS) with multi-part reassembly**, **voice-channel classification (VDA/VO6/VOD/VOZ/VOC) with AMBE extraction**, **IP-channel frames (IIP ARQ / IIQ / IIR)**, wideband burst hunting across the band | Every layer validated: bit-perfect demod of gr-iridium's reference burst (direct *and* via the wideband hunter) + field-identical decode vs the iridium-toolkit oracle |
68+
| Iridium | `iridium` | 1616–1626.5 MHz | Ring alerts (live satellite positions), broadcasts, **ACARS over SBD (multi-packet Layer-B reassembly for long messages)**, **pager messages (IMS) with multi-part reassembly**, **voice-channel classification (VDA/VO6/VOD/VOZ/VOC) with AMBE extraction**, **IP-channel frames (IIP ARQ / IIQ / IIR)**, wideband burst hunting across the band | Every layer validated: bit-perfect demod of gr-iridium's reference burst (direct *and* via the wideband hunter) + field-identical decode vs the iridium-toolkit oracle; on a shared 300 s off-air capture xng decodes **758 CRC-OK IDA frames vs gr-iridium's 573 (132 %)** — see [Benchmarks](#benchmarks) |
6969
| AIS (ITU-R M.1371) | `ais` | 161.975/162.025 MHz | NMEA AIVDM (UDP + TCP servers) plus **field decode for types 1–27**: positions/kinematics (class A/B, SAR, long-range), static & voyage data, binary and safety messages, aids to navigation, **DGNSS, link/channel management, group assignment** | pyais-exact field vectors; off-air benchmark **91 % of AIS-catcher with zero false decodes**, CI-fenced |
7070
| Mode S / ADS-B | `adsb` | 1090 MHz | **CPR positions** (airborne, surface via `--receiver-pos`), velocity, squawk, altitude replies, **Comm-B/BDS registers** (callsign, selected altitude, track/turn, heading/speed — pyModeS-validated), single-bit CRC repair, per-aircraft tracking, **SBS + Beast outputs**; any rate ≥ 2 MS/s including **native 2.4 MS/s** | **98–99 % of readsb/dump1090-fa** with frames each of them misses (see [Benchmarks](#benchmarks)); field-exact vs pyModeS |
7171

@@ -99,12 +99,23 @@ hypothesis](docs/notes/BENCHMARKS.md); fenced in CI by
9999

100100
| Mode | Reference decoder | Reference | xng | | xng-exclusive frames |
101101
|---|---|---:|---:|---|---:|
102+
| Iridium (IDA) † | gr-iridium | 573 | **758** | **132 %** | — |
102103
| VDL Mode 2 | dumpvdl2 | 41 | **44** | **107 %** | — |
103104
| Mode S @2.4 MS/s | readsb (`--no-fix`) | 167 | **164** | 98 % | 5 |
104105
| Mode S @2 MS/s | dump1090-fa (`--no-fix`) | 162 | **161** | 99 % | 7 |
105106
| HFDL | dumphfdl | 37 | **36** | 97 % | — |
106107
| AIS | AIS-catcher | 53 | **48** | 91 % | 0 |
107108

109+
**†** CRC-OK IDA frames over a shared 300 s off-air capture (Airspy R2,
110+
1622 MHz, 10 MS/s). That capture is 11 GB — too large to vendor in CI,
111+
so unlike the rows above it is not count-gated; the Iridium demod core is
112+
fenced instead by bit-exact and field-exact oracle tests. xng decodes
113+
**758** CRC-OK IDA frames to gr-iridium's **573** on that capture (total
114+
IDA 1577 vs 1214), and even its **587 distinct-content** frames exceed
115+
gr-iridium's raw 573 — the gap was weak-burst frame *production*, closed
116+
by porting gr's peak-relative end-of-frame rule (xng had been truncating
117+
weak frames on the first faded symbol). See [Iridium notes](docs/notes/IRIDIUM.md).
118+
108119
The HFDL and AIS gaps are characterized down to the burst: the missing
109120
frames are the weakest signals at the margin of one inland antenna —
110121
not protocol or decode defects (the AIS campaign that took 68 % → 91 %
@@ -122,9 +133,9 @@ The binaries need `libsoapysdr` at runtime (plus `libairspy`/`libairspyhf`
122133
for native Airspy):
123134

124135
```bash
125-
sudo apt install ./xng-0.19.0-arm64.deb # pulls runtime deps
136+
sudo apt install ./xng-0.20.0-arm64.deb # pulls runtime deps
126137
# or
127-
tar xzf xng-v0.19.0-x86_64-unknown-linux-gnu.tar.gz && sudo cp xng /usr/local/bin/
138+
tar xzf xng-v0.20.0-x86_64-unknown-linux-gnu.tar.gz && sudo cp xng /usr/local/bin/
128139
```
129140

130141
Multi-arch Docker images (amd64/arm64/armv7) are published per tag:

0 commit comments

Comments
 (0)