Also known as: band plan, LCN resolver, channel plan
A DMR band plan is the mapping a Tier III decoder uses to turn a Logical Channel Number (LCN) into an actual RF downlink frequency.1 A channel grant CSBK never names a frequency directly — it carries a compact 12-bit LCN (the LPCN, Logical Physical Channel Number) — so before a receiver can retune to follow a call it must resolve that number against the system’s band plan.2 Two forms cover real deployments: a linear formula for sites laid out on a regular grid, and an explicit table for the irregular ones.
The linear plan
Most sites number their channels on a regular grid, so a single formula suffices:
frequency = Base + (LCN − Offset) × Spacing
Base is the downlink frequency of the first channel, Spacing is the constant step between
adjacent channels, and Offset accommodates the common convention of numbering channels from 1
rather than 0 — with Offset = 1, LCN 1 maps to exactly Base. This is compact to configure and
covers the majority of Tier III systems: an operator supplies three numbers and every LCN the
system can grant resolves without an entry-by-entry table. The resolver rejects a zero spacing,
guards against an LCN below the offset (which would compute a negative index), and refuses a
result that overflows a 32-bit frequency, returning an “LCN outside band plan” error in each case
rather than retuning to a bogus frequency.
The table plan
Some systems do not lay channels out linearly — frequencies may be scattered across bands, reused from an earlier license, or coordinated around incumbents. For these, the band plan is an explicit LCN → Hz map the operator hand-codes from the license or coordination database. A lookup is a direct map read: a present key returns its frequency, and a missing key returns the same “unknown LCN” error the linear plan uses for an out-of-range channel. Configuration validation guarantees exactly one of the two forms is set per system.
When resolution fails
Because a grant is useless without a frequency, an unresolvable LCN is treated as a configuration
gap, not a silent no-op. The control channel maps ErrUnknownLCN to a decode.error event tagged
stage="no-bandplan", so an operator watching metrics can see that grants are arriving for
channels the plan does not cover — the signal to extend the linear range or add table entries. A
system with no band plan at all drops every grant with that same stage, which is how a monitor that
locks the control channel but never follows a call announces that it simply has not been told where
the traffic channels are.
Relevance to SDR
internal/radio/dmr/tier3/bandplan.go defines a Resolver interface with two implementations:
LinearBandPlan (the base/spacing/offset formula, with the overflow and range guards) and
TableBandPlan (the map lookup). ResolverFromPlan builds the right one from the operator-supplied
band plan on the trunking system, returning nil when none is configured so the “no band plan ⇒
drop grant” behaviour is preserved. The resolved frequency is what the engine hands to a Voice
device when it follows a grant, so the band plan sits directly between the
control channel decode and the physical retune — the last step
that turns an abstract channel number into a place on the dial.
Sources
-
Digital mobile radio — Wikipedia, on DMR trunking and logical channel numbering. ↩
-
ETSI TS 102 361-4 (DMR Tier III) — ETSI, defining the logical-channel / frequency relationship signalled on a Tier III system. ↩