docs: add comprehensive README with satellite constellation info

This commit is contained in:
Ryan Malloy 2026-02-12 16:45:31 -07:00
parent 5867c54de3
commit 91bef4ea63

161
README.md
View File

@ -1,64 +1,151 @@
# gr-sarsat-modern # gr-sarsat-modern
GNU Radio 3.10+ compatible Cospas-Sarsat 406 MHz beacon decoder. GNU Radio 3.10+ blocks for decoding **Cospas-Sarsat** 406 MHz emergency distress beacons.
Ported from [zleffke/gr-sarsat](https://github.com/zleffke/gr-sarsat) (2018, GNU Radio 3.7). Ported from [zleffke/gr-sarsat](https://github.com/zleffke/gr-sarsat) (2018, GNU Radio 3.7).
## What is Cospas-Sarsat?
**Cospas-Sarsat** is the international satellite-based search and rescue (SAR) system that has helped save over **60,000 lives** since 1982. It detects and locates emergency beacons carried by:
- **EPIRBs** (Emergency Position Indicating Radio Beacons) - Maritime
- **ELTs** (Emergency Locator Transmitters) - Aviation
- **PLBs** (Personal Locator Beacons) - Hikers, adventurers
When activated, these beacons transmit a 406 MHz signal that is picked up by a constellation of satellites and relayed to ground stations (LUTs) for position determination.
## The Satellite Constellation
Cospas-Sarsat uses **three types of satellites** to provide global coverage:
### LEOSAR (Low Earth Orbit)
| Satellite | Operator | Orbit |
|-----------|----------|-------|
| NOAA-15, 18, 19 | USA | ~850 km polar |
| MetOp-A, B, C | EUMETSAT | ~817 km polar |
| COSMOS (Sarsat-10,11,12) | Russia | ~1000 km polar |
LEO satellites can **Doppler-locate** beacons (no GPS needed) but only see a portion of Earth at any time.
### MEOSAR (Medium Earth Orbit)
| Constellation | Satellites | Coverage |
|---------------|------------|----------|
| GPS | Block IIF/III (18 SAR payloads) | Global |
| Galileo | 24 satellites | Global |
| GLONASS | 24 satellites | Global |
MEOSAR provides **near-instantaneous global coverage** and can locate GPS-equipped beacons within minutes.
### GEOSAR (Geostationary)
| Satellite | Position | Coverage |
|-----------|----------|----------|
| GOES-16/17 | 75°W / 137°W | Americas |
| MSG (Meteosat) | 0° / 41.5°E | Europe/Africa |
| INSAT-3D/3DR | 82°E / 74°E | Indian Ocean |
| MTSAT/Himawari | 140°E | Asia-Pacific |
GEO satellites provide **immediate alerting** but cannot determine position (beacon must have GPS).
## Signal Specifications
| Parameter | Value |
|-----------|-------|
| **Frequency** | 406.025 MHz (±1 kHz) |
| **Modulation** | Phase modulation, Biphase-L encoded |
| **Bit Rate** | 400 bps |
| **Power** | 5W (37 dBm) minimum |
| **Message Length** | 112 or 144 bits |
| **Burst Duration** | ~440 ms every 50 seconds |
### Frame Structure
```
┌─────────────┬──────────────────────────────────────────────────────┐
│ Frame Sync │ PDS Frame (576 bits) │
│ 15 bits │ │
│ 0x7FF ├──────────────────┬──────────────────┬────────────────┤
│ │ SARP Msg 1 │ SARP Msg 2 │ SARP Msg 3 │
│ │ (24 bytes) │ (24 bytes) │ (24 bytes) │
│ │ Sync: 0xD60 │ Sync: 0xD60 │ Sync: 0xD60 │
└─────────────┴──────────────────┴──────────────────┴────────────────┘
```
## Blocks ## Blocks
| Block | Description | | Block | Type | Description |
|-------|-------------| |-------|------|-------------|
| **Biphase-L Decoder** | Decodes Manchester/Biphase-L encoded bit stream | | **Biphase-L Decoder** | `decim_block` | Decodes Manchester/Biphase-L symbols (2:1 decimation) |
| **PDS Frame Sync** | Synchronizes and extracts 72-byte PDS frames | | **PDS Frame Sync** | `sync_block` | Detects frame sync, extracts 72-byte PDS frames |
| **SARP Message Extractor** | Splits PDS frames into 24-byte SARP messages | | **SARP Message Extractor** | `basic_block` | Splits frames into 24-byte SARP messages, validates sync |
## Installation ## Installation
```bash ```bash
# Install Python package # Clone
git clone https://git.supported.systems/rf/gr-sarsat-modern.git
cd gr-sarsat-modern cd gr-sarsat-modern
# Install Python package
pip install -e . pip install -e .
# Copy GRC blocks to GNU Radio # Install GRC blocks
cp grc/*.yml ~/.local/share/gnuradio/grc/blocks/ cp grc/*.yml ~/.local/share/gnuradio/grc/blocks/
``` ```
## Signal Chain ## Signal Chain
``` ```
RF Input (406 MHz) ┌──────────────┐ ┌──────────────┐ ┌─────────────────┐
| │ RTL-SDR │────▶│ FM Demod │────▶│ Clock Recovery │
v │ 406.025 MHz │ │ │ │ MM, 400 bps │
[FM Demod] -> [Clock Recovery] -> [Slicer] └──────────────┘ └──────────────┘ └────────┬────────┘
|
v
[Correlate Access Code - Tag] (Frame sync: 0x7FF, tag: "pds_sync") ┌──────────────────────────────────────────────────────────────────┐
| │ Correlate Access Code - Tag │
v │ Pattern: 0x7FF (15 ones), Tag: "pds_sync" │
[Biphase-L Decoder] └──────────────────────────────────────────────────┬───────────────┘
|
v
[PDS Frame Sync] ┌──────────────────┐ ┌──────────────────┐ ┌────────────────┐
| │ Biphase-L Decode │────▶│ PDS Frame Sync │────▶│ SARP Extract │
v │ (2:1 decim) │ │ (PDU out) │ │ valid/invalid │
[SARP Message Extractor] └──────────────────┘ └──────────────────┘ └────────────────┘
|
+---> valid (sync word OK)
+---> invalid (sync word mismatch)
``` ```
## Protocol Background ## Example Flowgraph
Cospas-Sarsat is the international satellite-based search and rescue system: A minimal flowgraph for receiving SARSAT beacons:
- **Frequency**: 406.025 MHz 1. **Source**: RTL-SDR @ 406.025 MHz, 250 kHz sample rate
- **Modulation**: Phase-modulated carrier, Biphase-L encoded 2. **Filter**: Low-pass, 15 kHz bandwidth
- **Bit rate**: 400 bps 3. **FM Demod**: Quadrature demod
- **Frame structure**: 4. **Clock Recovery**: M&M, omega=625 (250k/400), mu=0.5
- 15-bit frame sync (0x7FF) 5. **Binary Slicer**: Threshold at 0
- 576-bit PDS frame (3 × 24-byte SARP messages) 6. **Correlate Access Code - Tag**: Pattern `0x7FF`, Threshold 0
- Each SARP message starts with 0xD60 sync word 7. **Biphase-L Decoder**: Our block
8. **PDS Frame Sync**: Our block, tag_name="pds_sync"
9. **SARP Message Extractor**: Our block
## Beacon Message Contents
A decoded SARP message contains:
- **Protocol Flag**: Standard or National Location
- **Country Code**: 10-bit MID (Maritime Identification Digit)
- **Beacon ID**: Unique identifier (MMSI for EPIRBs)
- **Position**: Encoded lat/lon or GPS coordinates
- **BCH Codes**: Error correction (can recover from bit errors)
## References
- [Cospas-Sarsat System Overview](https://www.cospas-sarsat.int/en/system-overview)
- [406 MHz Beacon Specification (T.001)](https://www.cospas-sarsat.int/en/documents-pro/t-001-specification-for-cospas-sarsat-406-mhz-distress-beacons)
- [Original gr-sarsat by zleffke](https://github.com/zleffke/gr-sarsat)
## License ## License
MIT License - Original work (c) 2018 zleffke MIT License
- Original work (c) 2018 zleffke
- GNU Radio 3.10 port (c) 2025 supported.systems