ELINTIR ML/RF MAPPER

s.Link — our own radio link

We write the physical and link layers ourselves. s.Link joins the station to the operator point to point: bearing telemetry out, commands back — no relays and no internet in between.

Not one mode, but a ladder

Every distinct use of the radio here is a separate named profile with its own budget and its own tests, not a "setting" of the one next to it. The three narrowband ones differ by exactly one lever: the slower the symbols, the narrower the receiver's noise bandwidth — and the further it hears.

ProfileSymbols/sBandwidthWhat it buysStatus
Shared with the sweep240 000≈250 kHz The modem lives inside the station's 30.72 MS/s hardware profile: an exact ×32 division in DSP, with no fractional resampler and none of the timing wander one brings. the only one to detect on the shared chain
Long range25 00026 kHz A tenfold narrower noise bandwidth: −10 dB, so 3.2× the reach. The link carries 11 bytes every 15 s — there is simply nothing here to spend rate on. deployed, the default
Half rate12 500≈13 kHz Half as wide again. Theory promises 10·log₁₀2 = 3.01 dB, measured 2.7–3.0. One slow frame instead of two fast ones — the slot does not move. launchable; air by loopback, not by field
4K video15 360 00019.2 MHz 1024 bytes in 0.557 ms — 14.7 Mbit/s of payload, inside the AD9363's 20 MHz ceiling. Its own profile, not the narrowband one "turned up". off-air
A profile is a property of both ends
A receiver keyed to the long-range profile sees a half-rate burst as eight samples per symbol while it searches four — so long range does not decode half rate, and half rate does not decode long range. Switching one end alone takes the link down in both directions. A receiver listening for both profiles at once does not rescue this: it is ~3 dB deafer, handing back exactly what the profile earns. That was measured and rejected, not assumed.
There is no third halving — and the crystals are to blame, not the schedule
The reference-oscillator offset between two boards is measured: 5.01 ppm, which is 4.4 kHz at 872 MHz. GMSK tolerates ≈40% of the symbol rate, and that tolerance falls with the rate while the offset does not: 12.5 ksym/s has 5 kHz and still covers the offset, 6.25 has 2.5 kHz and hands back −4.8 dB instead of the promised +5.9, and 3.125 does not decode at all. Shared clock discipline — the same GPS/PPS that frequency hopping needs — opens this ladder back up.

Narrowband bandwidths are GMSK BT=0.5 at ≈1.04 of the symbol rate (the same rule that gives 26 kHz at 25 ksym/s). The 19.2 MHz for 4K is a constant from the code.

MeasuredValueWhen
Downlink station → operator, a 29.6 min window777 of 803 packets = 96.8%, median SNR 38.5–40.7 dB05.09 · on air
Uplink operator → station, 2 min21 of 21 = 100%, 0 undecoded05.09 · on air
Loss after capture, s.Link 1.1 vs 1.02.0% of captured energy wasted instead of 10.8%05.09 · on air
Decode threshold on the air+2.27 dB15.08 · on air
Half-rate profile 12.5 ksym/s, gain~3 dB on a real RF capture (+2.7…2.8 in simulation)01.09 · RF loopback
Receiver sensitivity, gain+3.47 dB from a matched filter16.08 · AWGN simulation
Transmitter speed, gain×10.2, the signal bit-identical17.08 · measured
Reference oscillator offset between two boards5.01 ppm — 4,369 Hz at 872 MHz12.08 · measured
AD9361 retune — the basis of frequency hopping≤0.133 ms settling, 28 of 28 transitions24.08 · measured
Jamming resistance: GMSK vs chirpGMSK dies to a jammer 1…4 dB weaker than itself, chirp holds +13…+28 dB06.09 · simulation
s.Link, continuous session5 h 20 min, 4863 framesbench
s.Link, authentication failures0 of 4863bench
s.Link duty cycle, remote station2.3% — 83 s of air per hourmeasured
s.Link duty cycle, operator0% when idlecode constant
640×480 video through the whole chain60 of 60 frames byte-exact22.08 · bench

What this table does not carry is range. There has never been a distance trial in the field, so every kilometre in our calculations is a link budget, not a measurement. The 05.09 on-air figures come from the working station ↔ operator link; the 1.1-vs-1.0 comparison rests on windows of 29.6 and 131 min — the direction is unambiguous, the precision of the number is not.

These are not plans or intentions: the code is written, the chain closes on the bench, the tests are green. Exactly one thing is missing — a run on the air.

640×480 video channel
The whole chain joined for the first time: H.265 → fragmenter → outer Reed-Solomon code → PHY → and back. 60 of 60 frames byte-exact, and ffmpeg played the result. The radio is not involved yet.
Drone control over s.Link
A compressed subset of MAVLink, ~72 bit/s in long-range mode. The code is written and tested, but has never been on the air.
s.Link4k — a rooted mesh for 4K video
Video relaying without trusting the relay: it forwards the authenticated 1024-byte packet without parsing H.265 or decrypting it. Routes and slots are handed out by the ground sink, and flooding is forbidden by design — every duplicate would consume a full burst on every subsequent hop. Earlier than the other rows here: the wire format, the capacity model and packet FEC are already implemented off-air — with no live radio path yet. Next comes the scheduler simulator.

Why "just add a watt" does not add range

The obvious answer to range is an amplifier. We costed it and checked it, and it turned out to be mostly a trap. We publish it because this is the part of engineering that shows whether someone has actually worked with hardware.

+20…+23 dBm +12 dB → ×2 2 W → ×4.7 free space near the ground 0 +15 dB +30 dB ×1 ×5 range gain from added power
Near the ground the exponent is 4, not 2
In the two-ray model range grows far more slowly than power: 2 W (+27 dBm) buys only ×4.7, not ×22. Doubling the range costs 12 dB, not 6. The sweet spot is +20…+23 dBm, not watts.
An ungated amplifier deafens its own receiver
It holds the noise floor up permanently, because the local oscillator cannot switch off between bursts. One metre of antenna separation costs −4.8 dB of our own sensitivity, half a metre −9.5 dB. A low-noise amplifier makes this worse, not better. The conclusion: the gate has to be switched together with the burst.
The real blocker is our own array
A strong transmitter nearby drives the KrakenSDR into clipping, and distance does not save it. A beacon of a few milliwatts already does this. It needs the array blanked for the duration of the burst plus a limiter — without them every bearing frame is contaminated.
~9 dB sits there for free
The transmitter's digital scale sits 12 dB below full. GMSK has a constant envelope and needs no such headroom — +8…+9 dB can be taken with no hardware at all. The flip side of the same fact: the "+6 dBm" budget line is probably overstated by those same 12 dB, so the range calculation may be optimistic by a factor of two. First measurement: power at the connector.
An LNA earns its place on feeder loss, not noise figure
On noise figure alone it gives only ~3.6 dB. But it takes cable loss out of the budget, and that is what decides: a 10 m mast is worth +14 dB, while RG58 at 866 MHz eats 6 dB over ten metres and 26 dB over forty-four.
The asymmetry of roles is already in the code
The operator console must be findable by nobody, so it sends only what the operator deliberately sent. Hence the split: the power amplifier goes on the station only, the low-noise one on the operator. A power amplifier on the operator side would be the worst of the four combinations.

Where the link grows next

These, by contrast, are plans, and we label them as such. What is already implemented off-air is said plainly; the number still missing before the air is named.

Frequency hopping keyed to the link key
The hop order is derived from the key and the clock the two ends already share: nothing extra goes on the air, and without the key the next channel cannot be guessed. The channel set is first filtered against the frequency plan — the key permutes the order, not the placement. A wide set buys up to ~28 dB of processing gain against a barrage jammer. The honest limit: the hop rate is capped by clock synchronisation, not by the radio. The radio side is already measured — a retune settles in ≤0.133 ms (28 of 28 transitions), so a hop on every slot fits the budget with sevenfold margin; the clocks do not, since the station's stock timesyncd only supports ~0.3 s between hops and only a shared timebase (~10 ms spread) makes a per-slot hop legitimate. That is why time discipline comes before any radio work — done wrong, hopping makes a working link worse. The hop-order and hop-plan code is already in the tree and under test; it has never been switched on over the air.
Mesh — s.Link4k, a rooted relay for 4K
A scheduled mesh, not flooding: the ground sink computes the route and the TDMA grants, and a relay forwards the authenticated 1024-byte packet without decrypting it or parsing H.265. A direct route carries 2160p30 in the capacity model; every single-frequency relay divides the airtime. Status: the wire format, the capacity model and packet FEC are implemented off-air — a Cauchy-Reed-Solomon erasure code over 992-byte symbols, the rest of the 1024-byte packet being the authentication tag. There is still no live radio path. Next comes the scheduler simulator: HDL and a transmitter deliberately do not start until it is green.
Video
The 640×480 chain already closes on the bench — 60 of 60 frames byte-exact; only the air remains. The high-rate video profile will be its own named PHY profile with its own budget and tests, not a tuning of narrowband s.Link; 4K rides the mesh above.
PHY robustness
An interleaver over the convolutional code is a direct win against pulsed jamming, waits on nothing else, and goes first. Then the chirp: a modulation bench (8,038 runs, 06.09, simulated on the tree's real modulators and decoders) showed a gap no GMSK profile closes — 15–33 dB of jamming resistance. Every GMSK profile dies to a jammer 1…4 dB weaker than its own signal; chirp holds +13…+28. Narrowing the bandwidth buys sensitivity and not jamming resistance: a narrowband jammer narrows along with you. Within the same 43 ms budget the chirp is also 4.3–4.7 dB more sensitive than spread GMSK. The CSS core and its tests are already in the tree; it has never been on the air.
Operator survivability
The operator must not be direction-findable. At idle their emission is zero — measured. Next: commands at the least sufficient power driven by the station's telemetry, a randomised emission instant inside the slot, and re-acquiring a lost link with no fixed rendezvous channel — only the station transmits, the operator just listens.
30 km of range
The order of work is costed: directional antennas at both ends first (+8…12 dBi — they help both directions at once), then the console's local noise — a measured ~29 dB above the receiver's own floor — and only then an amplifier. Every existing number was taken on one site; a 1–3 km field run comes before any money is spent on range.

We can show the link working in person. The full technical wiki and the protocol specification live in the data room.