Also known as: FSE, T/2 equalizer, fractionally spaced equalizer
A fractionally-spaced equalizer (FSE) is an adaptive equalizer whose taps are spaced closer than one symbol apart — most commonly half a symbol, “T/2” — so it operates on two or more samples per symbol instead of one.1 The extra resolution is not a luxury: a symbol-spaced equalizer can only correct the channel as seen at the symbol instants, which makes it blind to anything happening between them — the shape of the pulse itself, and the exact sampling phase. An FSE sees the waveform between symbols too, and that lets it do jobs a symbol-spaced filter structurally cannot.
How it works
The FSE is an FIR filter running at 2× the symbol rate whose output is read once per symbol; adaptation (LMS against training, or blind CMA) updates the T/2-spaced taps exactly as it would symbol-spaced ones. The structural wins:
- It synthesizes the receive matched filter implicitly. The optimal receiver front end is matched filter + symbol-rate sampler; a T/2 FSE spans both roles, so if the receiver’s fixed filter is matched to the wrong pulse, the FSE quietly learns the correction. A symbol-spaced equalizer cannot — the mismatch lives between its taps.
- It is insensitive to sampling phase. Symbol-spaced equalization degrades with timing offset because aliasing of the (excess-bandwidth) pulse folds differently at each phase; T/2 sampling keeps the excess band un-aliased, so residual timing error becomes just another linear distortion the taps absorb.
- It equalizes before decimation, so channel nulls that land between symbol-rate alias points remain correctable.
The costs are 2× the taps and one genuine trap: fractional spacing enlarges the blind cost
function’s null space — tap combinations that leave the output modulus unchanged — so on a
clean channel the taps can random-walk. A small leakage term (w ← (1−leak)·w each
update) shrinks unexcited taps toward zero: real ISI sustains taps, noise alone does not.
Relevance to SDR
GopherTrunk’s FSE (internal/dsp/equalizer/fse.go) exists because of a pulse-mismatch bug
class no symbol-spaced filter could fix: the P25 CQPSK/LSM receiver
matched-filters with a root-raised-cosine, but a
real P25 C4FM transmitter shapes a different (CPM) pulse — the outer
±1800 Hz rails arrive under-shot and the constellation closes, and a symbol-spaced CMA
cannot open it (issue #492). The T/2 blind FSE consumes the timing loop’s on-time sample
and the half-symbol-earlier midpoint interpolant, corrects the pulse mismatch and any
multipath ISI, and runs ahead of the carrier loop (the CMA cost is rotation-invariant, with
the centre tap phase-pinned so tap drift is not read as a frequency offset). It is always-on
for P25 CQPSK/LSM. Note the contrast with the TETRA paths, where the differential decoder
imposes its own constraint and the equalizers are applied as frozen snapshots — see
snapshot equalization.
Sources
-
Equalization (communications) — Wikipedia, on adaptive equalizer structures including fractionally-spaced designs and their timing-phase insensitivity. ↩