Receiver, compute and storage in one housing under the carrier. Five
channels are received coherently, and the direction is computed by MUSIC
from raw IQ on board — what goes down is a bearing, not a sample stream.
The other end of s.Link — our own physical and link layer. It takes the
bearing telemetry in and sends commands back. The band is narrow, and in a
waterfall the burst reads as a domestic sensor rather than as a military
channel.
The same s.Link modem on a larger die. In SL-1 the physical layer is
computed by the host, in Python — at 25 000 symbols per second
that is correct and cheap. The high-rate mode does not work that way:
15.36 Msym/s will not pass through USB into Python, the chain has to
live in fabric, and on the SL-1 die only eight of eighty multiplier
slices are free.
A cheap direction finder for the band where a coherent array cannot
work: above 1766 MHz the GR-1 tuner stops, and FPV control and video live
exactly there. Five directional antennas in a ring compare power,
not phase, so neither synchronous channels nor array calibration are
needed. It gives a sector, not a degree — and says how much to trust it.
Transceiver
AD9363 — 70 MHz – 6 GHz, two receive inputs
Compute
Zynq-7010 — FPGA and Cortex-A9, on the board itself
Specification follows the first on-air measurement
Ground complex
ELINTIR ZR-47 In design
Eight coherent channels of direct sampling — there is no local
oscillator at all. The PLL phase jump on every retune, which breaks
wideband direction finding on the five-channel station, does not exist
here as a phenomenon. The die sees the whole band and computes a
direction on every bin, not on one.
Die
XCZU47DR — eight RF ADCs, 14-bit @ 5.0 GSPS
Front end
TCM2-63WX+ baluns, on-die clock distribution
Self-test
eight RF DACs on the same die — built-in BITE
Synchronisation
MTS — phase across eight channels, tile to tile
Reporting
s.Link; raw IQ over QSFP28
Specification follows the first board
Antenna array
ELINTIR UCA-1
Five elements in a Ø195 mm ring. It is the ring geometry, not the receiver,
that decides where a bearing is unambiguous: the chord between neighbouring
elements is 114.6 mm, and spacing against wavelength is recomputed on every
retune.
Two switched concentric rings of five elements. One ring cannot cover
the whole GR-1 range: spacing against wavelength, unambiguous at the top
of the band, stops yielding a direction at the bottom. Two rings split
the band between them; the receiver stays the same.
Geometry
two concentric rings of five elements
Channels
five, switched between rings
Output
coaxial runs to GR-1
Geometry is fixed by the first drawing
Squint ring
ELINTIR LPA-1 Concept
Five log-periodic antennas placed radially, 72° apart. The ring for
ZR-1: each looks into its own sector, and the direction comes from the
power difference between neighbours — which is why the elements here are
directional, unlike a UCA ring, where they must be identical and omni.
Elements
five printed LPDAs, 72° apart
Method
amplitude comparison of adjacent sectors
Output
SP6T switch into ZR-1
Name provisional — the release session decides
Three rings
ELINTIR UCA-3 In design
Three switched concentric rings of eight elements. Nothing covers
100 MHz – 6 GHz with a single ring, so the rings are made electrically
identical and split the range three ways — each working its own third
with the same geometry.
Geometry
three rings of eight elements
Radii
26.78 · 104.85 · 410.46 mm
Bands
1533–6000 · 391–1533 · 100–391 MHz
Output
eight channels into ZR-47
Collision mechanics are computed by plan 268
Platform
An electromagnetic map, not a list of detections
We are not building an instrument that shows a direction but a
platform that folds an arbitrary number of physical
sensors into one picture. A coherent array, a wideband
survey receiver, someone else's receiver inside a customer's
system — the platform does not care what does the receiving.
What matters is what comes out.
And what comes out is not a list of bursts but a map with
context: which band of the frequency plan this is, which
operator holds it, whether this is a legitimate user, and
whether the same emitter was already here yesterday. Detections
are fused into sources by frequency, harmonics, shared location
and modulation coherence — and only then reach the operator.
War is moving exactly there. Control of the spectrum is
its next technological cycle, and it will be won not by
whoever jams loudest but by whoever sees more and sooner. The
station suppresses nothing — it is a SIGINT sensor, not a jammer —
and that is what carries it through export control where a jammer
stalls for months.
Under the hood: a five-channel coherent array and the MUSIC
algorithm give the direction from the phase differences between
elements. Each station reports to the operator over its own
link; the console crosses bearings from several stations, and a
point on the map falls out.
The path difference between elements is the bearing
The array and the receivers have different limits.
A Ø195 mm ring gives a 114.6 mm chord between adjacent elements,
and everything else follows from it: below 262 MHz
the array is too small and yields energy only; above
1309 MHz the spacing exceeds half a wavelength and
a mirror twin appears. So the receivers tune to 1766 MHz but
an unambiguous bearing ends at 1309, and we mark
such measurements ambiguous rather than passing them off as clean.
Array
Five elements in a Ø195 mm ring; spacing is recomputed on every retune.
Receivers
24-1766 MHz coherent (5 × RTL2832U), plus survey to 6 GHz.
Compute
Processing and cataloguing on the node — a Raspberry Pi 5, running in the field off a power bank.
Link
s.Link — our own PHY and link layer, 872 MHz, ChaCha20-Poly1305 encryption.
Direction finding
A superresolution method
Direction is computed by MUSIC from raw multichannel IQ rather than from signal levels. That keeps the bearing sharp even when several sources share the band.
Phase holds at every frequency
Element spacing against wavelength is recomputed on every retune. This is not a detail: a corrupted value does not raise an error — it quietly fabricates a bearing of 0.0°, and that is a documented field incident here.
Targets wider than the front end
LTE and DVB-T are direction-found despite occupying more bandwidth than the receiver sees at once. Moving sources are tracked, not merely detected.
Two numbers, not one
The raw array angle and the compass bearing are stored separately, together with the heading source and its own accuracy. Confusing the two is the classic cause of mirrored errors, and we separated them at the record level.
Confidence is computed, not assumed
It comes from the eigenvalues of the covariance matrix rather than from amplitude. A weak but clean signal scores high; a strong but smeared one scores low.
The boards we work on
Two boards, one die
The link and the wideband survey live on boards of the same class: XC7Z010, 17 600 logic cells, 80 DSP slices. The stock bitstream already takes 12 456 cells and 72 of 80 DSP — DSP is the pinch that keeps the fast link mode out. The wideband board adds 1 GB DDR3, gigabit networking and a 0.5 ppm temperature-stable oscillator with an external reference input; its driver is unlocked across the full 70 MHz - 6 GHz range.
We read the silicon instead of trusting the label
The vendor describes the wideband board as a 7020. By IDCODE it holds an XC7Z010 — 17 600 LUT and 80 DSP instead of 53 200 and 220. Read three times in a row, through a second independent decoder, and on all three boards of the park including the station one. The difference is not cosmetic: the conclusion that a 4K receiver does not fit this fabric rests on it.
Measured on them, not taken from a datasheet
12 bits give roughly 60 dB of dynamic range. Sustained throughput over the network is about 9 MS/s with typical buffers, so a continuous maximum rate is impossible over any link: capture works in bursts. The nominal 56 MHz belongs to the AD9361; our board negotiates 30.72 MS/s at most and refuses 61.44, 56 and 40 with an error. An early run measured 48-52 MHz flat out of 56 — we kept the smaller of the two numbers in planning, because it comes from the newer run.
What they do not have
No receive LNA in any variant, and above ~2 GHz the front end goes noticeably deaf — the balun is tuned for 2.4 GHz and there is no preselector. Weak targets in the upper bands need an external LNA and a bandpass filter.
What already works as a product
The station
A Raspberry Pi 5 — starts by itself, runs off a power bank, lives in the field.
Real-time direction finding
Five-channel coherent reception and MUSIC over a circular array: an azimuth on the source several times a second, with no demodulation of payload. The d/λ ratio is recomputed on every retune — otherwise the bearing would lie with a zero and never complain.
15 scanners
Each one knows what it is looking for in its own band: communications, radar, satellite channels, navigation jamming. Frequency labels come from a single atlas, not from the scanner's own code.
s.Link
Our own encrypted station-to-operator radio: bearings out, commands back. Its own page →
Signature vector analysis
A feature vector — temporal, spectral, structural — is pulled from raw IQ and the emitter type is determined from it. The catalogue recognises a transmitter when it comes back. No demodulation of payload.
Raw IQ capture
Multichannel coherent samples are written to a standard format with provenance metadata — either short event-scoped snippets or a continuous frame archive. The analysis then happens on the ground, as many times as needed.
Over-the-air updates
Cryptographically signed: new frequency plans reach the stations by themselves; code does not.
What is already measured — in the field, with a date
Measured
Value
When
Bearing on an 868.000 CW beacon, spread
0.2–1.5° over 90-second legs, 107 bearings
22.08 · field
Source proven by frequency selectivity
69.6 dB at 868.0 vs ~16 dB either side — a 53.1 dB drop
22.08 · field
Beacon moved 0° → 30°
the bearing moved +35.9° for a true +30°
22.08 · field
Automated tests passing
18,542 passed / 44 skipped, 0 red
08.09 · test run
Ready in code — waiting for the air
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.
Operator-to-drone range from link timing
Two MUSIC bearings give directions but not distance. A hostile TDD link gives it away for free: the airframe replies after a fixed turnaround, and the excess path length reads off our own clock — no GPS involved. The mathematics is closed by 47 tests. This is the difference between a strike profile and somebody flying over their own treeline.
Where the limit moves next
The station on an airborne carrier
The same receiver, lifted to altitude, works in a different order of
ranges — because what changes is geometry, not sensitivity. For a
ground-level source the radio horizon follows straight from height:
50 m
29.6 km of line of sight.
100 m
40.1 km — and this is the engineering sweet spot.
150 m
48.1 km with moderate demands on the platform.
200 m
54.9 km — going from 100 to 200 m buys only ~15 km while raising the demands on the carrier far more.
The other half of the problem is position. A
direction finder gains from closing on the line of contact exactly
as it gains from altitude: both move the same horizon. Together they
take the station from single kilometres into tens.
What is already known about this path, and what it costs
The figures above are geometric line of sight,
not a promised bearing range: a confident bearing is planned more
conservatively, at roughly half to two thirds of the lesser of the
two limits. An airborne carrier also brings problems of its own,
which we have already worked through rather than leaving to be
discovered in flight: a planar array gives no stable azimuth
directly beneath the carrier, one degree of attitude error costs
one degree of bearing error, the array centre has to be kept clear
of motors and power runs, and baseline runs must be taken
separately with the motors off and on.
Signature analysis
Recognising an emitter without demodulating it
We determine what kind of transmitter this is from
features of the signal — temporal, spectral, structural — rather
than from what it carries. This is a matter of principle: the system
stays receive-only and needs neither keys nor any right to the
payload. That is precisely why it can be placed where a system that
demodulates would not be allowed.
Behaviour gives the family away, not modulation
The task is not "recognise ELRS" but to detect the whole
family — including variants whose channels and parameters
we do not yet know: mLRS forks, MILELRS, Kuznechik, closed
Crossfire. So we catch it by the invariants that physics and the
chipset dictate, not by a list of known signatures.
Bandwidth of a single burst
0.5-1.6 MHz — the LoRa series are fixed, FLRC is about 1.3 MHz.
Hop rate
Equal to the packet rate, 25-1000 Hz: one hop per frame is the family rule.
Periodicity
Strictly regular. This is control, not data — the interval is constant.
Duplex asymmetry
Bursts downlink, short telemetry uplink — by design.
Channel occupancy
Sparse, a few per cent of the time on channel. That is what separates it from Wi-Fi and LTE.
We retracted one edition of this table ourselves
The invariants first read "chirp or FLRC, not OFDM". For ELRS and
mLRS that is true — and as a family trait it is wrong: it
cuts out FrSky ACCST/ACCESS, Flysky AFHDS, Futaba FASST, Spektrum
DSMX and SiK/RFD900 telemetry. All of them are FHSS with the same
burst-level behaviour but on GFSK or DSSS — a detector built on
chirp would have missed half the popular fleet.
The family invariant is behaviour, not modulation. Modulation
distinguishes a branch within the family, not the family itself.
Modern standards — by preamble structure
A separate detector tells modern standard families apart with three
correlators — DVB-T2 P1, 5G NR PSS (three m-sequences per 3GPP TS
38.211) and Wi-Fi. The output is a family, a confidence and a score
per correlator. There is no demodulation here either.
What we measure with
Our board's instantaneous window is 30.72 MHz —
not the nominal 56, because it accepts no more — and a 65 536-point
transform gives a resolution of 469 Hz inside it.
The entire hop set of the sub-GHz families fits inside that window,
so we measure the channel grid step rather than guessing
it: this resolution divides a 525 kHz grid into 1120 cells.
An honest limitation: this works in park mode. In
survey mode the dwell is shorter than the hop period — a sweep
against FHSS is doomed, and we do not rely on it.
We can show the station working in person. The full technical
wiki and the protocol specification are in the data room.