L-DCB (Leantegra Differential Channel Burst) is a 2.4 GHz TDMA positioning protocol that runs on the L-MESH stack. It enables a meter-class accuracy from RSSI values by removing the two error sources that make ordinary RSSI positioning methods unusable.
L-DCB exists for deployments where centimetres are not required but battery-powered infrastructure is. It adds no radio, no antenna and no separate schedule — it reuses the frames the mesh is already sending and the channel set it is already hopping across.
| Measures | received signal strength, differentially across adjacent nodes |
| Accuracy | ≈ 4 m at 50 m node spacing, ≈ 2.5 m at 30 m node spacing |
| Radio | 2.4 GHz — the same one L-MESH uses |
| Geometry | one-dimensional — position along the chain |
| Burst | 16 channels in 1.8 ms |
| Rate | 0.1–1 Hz, 0.5 Hz default |
| Tag density | 20 tags per zone at 0.5 Hz, 50 at 0.1 Hz |
Turning RSSI into distance is arithmetic anyone can do. The reason it fails in practice is that two independent errors sit on top of the measurement, and they fail in different ways:
| Error | Typical | Character |
|---|---|---|
| Tag transmit power and antenna spread | ≈ 5 dB | a fixed bias per tag — averaging never removes it |
| Multipath fading | ≈ 6 dB | random per channel and position — averaging does remove it |
Together they put roughly 7.8 dB of error on a single reading. Against the gradient a single node sees at 50 m spacing — 0.35 dB per metre — that is 22 m of position error, which is worse than simply reporting the nearest node.
The two errors need different treatments, which is why L-DCB is two mechanisms rather than one. Averaging harder does not fix a bias, and a differential does not fix a fade. Each half addresses what the other cannot.
Rather than reading absolute strength at one node, L-DCB takes the difference between what two adjacent nodes heard from the same transmission:
Δ(x) = RSSI_A − RSSI_B = 10n · log₁₀( (S − x) / x )
Because both nodes heard one transmission, whatever the tag radiated cancels exactly. Transmit power, antenna gain, orientation, even a different product model — none of it survives the subtraction. What is left describes only where the tag is between the two nodes.
The subtraction has a second effect that matters as much. As a tag moves from A toward B, one reading falls while the other rises, so the difference changes at twice the rate of either reading alone:
The differential costs nothing to obtain. Both nodes are already listening in the same slot, because a mesh frame is a broadcast — hearing it at two nodes is not two transmissions.
Multipath fading is frequency-dependent: a null on one channel is not a null on another. A tag therefore transmits a burst across 16 channels rather than one frame on one channel, and the node averages what it hears.
The burst is a broadcast, sent once. Every node within range receives the same sixteen frames, so one burst serves both sides of the differential at the same time — the measurement is not repeated per node, and a tag does not range against nodes one after another. At 50 m spacing a transmission carries two to three hops, so four to six nodes typically hear each burst; the pair bracketing the tag supplies Δ and the rest are redundancy.
Averaging N independent samples narrows the spread by √N. Sixteen channels do not deliver sixteen independent samples — adjacent channels stay correlated within the coherence bandwidth — so the working figure is about eight effective channels, taking 6 dB of fading down to roughly 2 dB.
The sixteen frames are sent consecutively inside one slot, retuning between each, and the whole burst completes in 1.8 ms. See platform for the per-channel timing and how a receiver follows it.
Each half addresses one error, and neither alone is sufficient:
| Configuration | Measurement error | Gradient | Position error |
|---|---|---|---|
| Absolute RSSI, single channel | 7.8 dB | 0.35 dB/m | ≈ 23 m |
| Differential only | 8.5 dB | 0.69 dB/m | ≈ 12 m |
| Channel burst only | 5.4 dB | 0.35 dB/m | ≈ 16 m |
| Both — L-DCB | 3.0 dB | 0.69 dB/m | ≈ 4 m |
At 50 m node spacing, path-loss exponent 2.0. The second row is worth reading twice: the differential has the largest dB error of any row — subtracting two noisy readings adds noise — and still halves the position error, because dB error is not the quantity that matters. Error divided by gradient is.
This is why neither mechanism ships alone. Differential alone leaves the fading it cannot average; burst alone leaves the tag bias it cannot cancel. Applied together they attack a 23 m error from both ends and land near 4 m.
Accuracy scales directly with spacing, because the gradient does. Closer nodes make a steeper curve:
| Spacing | Gradient | Position error |
|---|---|---|
| 30 m | 1.16 dB/m | ≈ 2.5 m |
| 50 m | 0.69 dB/m | ≈ 4.3 m |
| 75 m | 0.46 dB/m | ≈ 6.5 m |
| 100 m | 0.35 dB/m | ≈ 8.6 m |
Node spacing is usually fixed by the mesh link budget rather than chosen for positioning, so this table is generally a prediction rather than a lever. Where accuracy is the binding requirement, spacing is the first thing to change.
A tag that moves during its own burst smears its own measurement. Because the burst completes in 1.8 ms, that smear is not a constraint at any speed these deployments see:
| Target | Speed | Movement during the burst |
|---|---|---|
| Walking | 1.4 m/s | 2.6 mm |
| Vehicle | 5 m/s — 18 km/h | 9 mm |
| Vehicle | 15 m/s — 54 km/h | 27 mm |
Against a 4.3 m error budget, 27 mm is nothing. L-DCB measures moving vehicles as readily as walking people — what separates it from UWB is accuracy, not the ability to measure something in motion.
How well a track is resolved is a separate question from whether a fix is valid. At 0.5 Hz a vehicle at 18 km/h travels 10 m between fixes, so the update interval, not the burst, is what sets the resolution of a moving target's path.
A node listens once per tag burst: a short window to lock onto the first frame, then the 1.8 ms the burst takes.
| Node receive window, per tag burst | |
|---|---|
| Lock window on the first channel — covers tag clock drift | 100 µs |
| The burst itself, followed on locked timing | 1.82 ms |
| Total | ≈ 1.92 ms |
Capacity is then how many of those windows fit in the burst slots the superframe carries, each tag needing one per measurement period:
| Rate | Burst slots | Slot time/s | Per tag/s | Tags per zone |
|---|---|---|---|---|
| 0.1 Hz | 1 | 10 ms | 0.19 ms | 50 |
| 0.5 Hz | 2 | 20 ms | 0.96 ms | 20 |
| 1 Hz | 4 | 40 ms | 1.92 ms | 20 |
Tags are placed by identity rather than by contention, exactly as elsewhere in the schedule:
burst_offset = dcb_slot_for_id( device_eui ) mod BURSTS_PER_PERIOD
A zone is the span heard by the same nodes — two to three hops, roughly 100–150 m of tunnel. Twenty tags inside that at 0.5 Hz is a dense crowd: ten people between one pair of nodes is comfortably inside the budget, with room for the vehicles passing them.
Density is what the node pays for, because each tag costs it another receive window:
| Tags in zone | Burst listening at 0.5 Hz | Node total | Service life |
|---|---|---|---|
| 1 | 0.004 mA | 0.105 mA | cell-limited |
| 3 | 0.013 mA | 0.114 mA | 9.6 years |
| 5 | 0.022 mA | 0.123 mA | 8.9 years |
| 10 | 0.044 mA | 0.145 mA | 7.6 years |
| 20 | 0.089 mA | 0.189 mA | 5.8 years |
Node total includes the L-MESH standing cost of 0.066 mA and a platform base, against a 9600 mAh cell (Locator Lite XT). Positioning is the smaller half of the bill up to about ten tags — belonging to the mesh costs a node more than measuring the tags in it.
L-DCB is priced in slots before it is priced in current. Burst slots come out of the relay region, and relay slots are what set mesh latency — but at these burst lengths the bite is small:
| Rate | Burst slots | Relay slots | Node — 10 tags | Tag | 99-hop mesh |
|---|---|---|---|---|---|
| none | 0 | 24 | — | — | 2.0 s |
| 0.1 Hz | 1 | 23 | 0.078 mA | 0.001 mA | 2.0 s |
| 0.5 Hz | 2 | 22 | 0.145 mA | 0.004 mA | 2.1 s |
| 1 Hz | 4 | 20 | 0.244 mA | 0.008 mA | 2.1 s |
Mesh latency barely moves across the whole range, because a 99-hop chain needs five superframes whether the relay region holds 20 slots or 24 — only the final partial superframe differs. Raising the rate costs slots and node current and buys a shorter update interval; there is no hidden latency penalty to weigh against it.
The tag column is small because a burst frame is 68 µs: a tag spends about 1.7 ms of transmitter on-time per burst however many channels it covers. Against a UWB receiver at 130 mA doing the same job, none of these currents is a consideration. The scarce resource in L-DCB is slots, not milliamps.
| Method | Accuracy | Receive current | Constraint |
|---|---|---|---|
| UWB TWR | centimetres | ≈ 130 mA | an exchange per tag — airtime scales with density |
| UWB TDoA | centimetres | ≈ 130 mA | needs synchronised anchors |
| L-DCB | metres | ≈ 4.6 mA | shares the mesh slot budget; one-dimensional |
| Offline-online RMA | zone | ≈ 4.6 mA | no live position at all |
L-DCB is the method to choose when the requirement is 2–5 m on battery-powered infrastructure. Where mains power reaches, UWB is better in every respect except cost. The reason L-DCB exists is that in a tunnel, mains power usually does not reach.
The burst is sequential, not simultaneous. An nRF52840 has one transceiver and can be on one channel at a time, and nothing in L-DCB asks otherwise. What the word burst describes is a set of measurements that belong together, sent back to back — not sixteen transmitters firing at once.
| Per channel, at the tag | |
|---|---|
Retune — FREQUENCY written while the radio is disabled | free |
| Ramp up — fast ramp-up mode | 40 µs |
| Frame — 6-byte payload at 2 Mbps | 68 µs |
| Disable | 6 µs |
| Step | 114 µs |
| All 16 channels | 1.82 ms |
Channel choice is unconstrained: FREQUENCY covers 2400–2500 MHz in 1 MHz steps, so sixteen channels at 5 MHz spacing span 2402–2482 MHz and sit inside the ISM band. The spacing is what makes the diversity real — a tunnel with 100–300 ns of delay spread has a coherence bandwidth of roughly 0.7–2 MHz, so channels 5 MHz apart fade independently.
L-DCB sequences the hop set within a slot on its own counter, rather than taking one channel per slot from the L-MESH slot counter. It shares the channel set, not the per-slot derivation.
A node cannot blind-follow the sequence. The per-channel step is 114 µs, while tag clock drift across a 2 s resync interval is around 100 µs — very nearly a whole step. So the node locks first, then runs open:
| Channel 1 | Channels 2–16 |
|---|---|
| wide window, ±100 µs, waiting for the preamble | stepped on local timing, no further searching |
| arrival time re-establishes the tag's phase | drift across the remaining 1.7 ms is 0.09 µs |
Once the first frame is detected the burst is short enough that drift inside it is three orders of magnitude below the step. The guard is therefore paid once per burst rather than once per channel, which is where most of the receive cost would otherwise go.
The nRF52840 reports RSSI at 1 dB resolution with ±2 dB accuracy. Resolution is a non-issue — quantisation contributes 0.29 dB, which averaging takes to 0.1 dB. Accuracy is not a non-issue, and it lands in the one place the differential does not protect:
| Bias | Cancelled by the differential? |
|---|---|
| Tag transmit power, antenna, orientation | Yes — one transmission, subtracted away |
| Node receiver calibration offset | No — two different receivers, subtracted together |
Δ is the difference of readings from two different nodes, so their individual receiver offsets do not cancel — they combine. At ±2 dB per node that is 1.6 dB on Δ, or 2.3 m of position offset for the pair.
| Position error at 50 m spacing | |
|---|---|
| Calibrated pairs | ≈ 4.3 m |
| Uncalibrated pairs | ≈ 4.9 m |
The saving grace is that this is a fixed offset per pair, not noise — it does not vary with position, time or channel, so a one-off per-pair calibration removes it and it stays removed. Left uncalibrated it does not blur the answer, it shifts it, which is the more dangerous failure because the result still looks precise.
| Setting | Default | Effect |
|---|---|---|
| Burst channels | 16 | sets accuracy — diversity against fading |
| Channel spacing | 5 MHz | above the tunnel coherence bandwidth, so channels fade independently |
| Measurement rate | 0.5 Hz | sets burst slots, node current and tag density |
| Path-loss exponent | 2.0 | site-calibrated; tunnels vary with cross-section |
| Differential pairs | adjacent | widen where nodes are dense |
| Pair calibration | commissioning | removes the receiver-offset shift; a fixed value per node pair |
| Lock window | 100 µs | first channel only; scales with the resync interval |
| Outlier rejection | on | discards channels beyond 2σ before averaging |
| Presence gating | on | no burst is expected unless a tag announced itself |
| L-MESH | supplies the slots, the channel set and the transport |
| A-RTLS | presence gating, and the view across positioning methods |
| Unified TDMA | the schedule the burst occupies |
| MQTT | what the gateway publishes onward |
Accuracy figures on this page are derived from a path-loss model with 6 dB fading and 5 dB tag spread, at eight effective channels of diversity — a deliberately conservative figure, since 5 MHz spacing should decorrelate more of the sixteen than that. Tunnel propagation departs from free-space behaviour in ways that vary with cross-section, lining and traffic, so these describe the design and want confirming by survey on a representative drift before they are used to size a deployment.