Also known as: IRC, MMSE-IRC, interference rejection combiner
Interference rejection combining (IRC) is the diversity combiner to reach for when the enemy is not noise but another transmitter: instead of weighting branches by signal strength like maximal-ratio combining, it measures the spatial covariance of everything that is not the wanted signal and inverts it, which steers a null toward a directional interferer while keeping gain on the wanted direction.1 It is the standard uplink combiner in LTE and 5G base stations, where co-channel interference from neighbouring cells, not thermal noise, sets the floor.
How it works
Model branch k as x_k = h_k·s + n_k, where n_k now contains both noise and the
interference. Collect the interference-plus-noise covariance matrix R_nn across branches
(the interferer makes its off-diagonal terms large and structured, unlike white noise) and
form the MMSE weights
w = R_nn⁻¹ h, scaled so wᴴh = 1.
When R_nn is diagonal — pure independent noise — this collapses to exactly MRC, so IRC is
a strict generalisation, not a rival. When one interferer dominates, R_nn⁻¹ de-emphasises
the spatial direction the interferer arrives from: the weights place a null there, the same
mathematics as adaptive beamforming with N−1 degrees of freedom
for N antennas. A small diagonal loading term keeps the inversion stable when the estimate
window is short.
Why blind IRC fails
The formula hides a dependency that decides whether IRC works at all: R_nn is the
covariance of the residual after the wanted signal is removed, and removing the wanted
signal requires knowing h — a clean
channel estimate. With a co-channel interferer present, a
blind least-squares estimate of h is contaminated: the cross-correlation between branches
contains h_wanted·P_signal + h_interf·P_interf, so the estimator returns a power-weighted
blend of the two directions, and the null gets steered at a mixture that is neither.
GopherTrunk measured this directly on a synthetic two-branch co-channel scene
(internal/dsp/diversity/irc_test.go): a true branch gain of 0.95∠40° read back as
0.32∠1°, blind IRC gained 0.0 dB over MRC, and the identical code handed a training
sequence gained +23.6 dB. Cellular IRC works because every uplink burst carries known
reference symbols; a blind wideband combiner has none. There is also a subtle degeneracy to
avoid: estimating the residual against the reference branch rather than the combined
output forces that branch’s residual to zero by construction, zeroing a row and column of
R_nn so no null can form.
Relevance to SDR
For an SDR listener, IRC is the answer to a specific and recognisable failure: a strong
directional interferer (a paging transmitter, an adjacent site) that gets worse when MRC
diversity is enabled, because MRC faithfully weights the branch the interferer is loudest
on. The catch is the training requirement — in a trunking receiver, known symbols (a
training sequence or
frame sync) exist only per narrowband channel, after
the DDC, which is also where per-channel combining has
to live anyway. GopherTrunk therefore ships IRCCalibrator
(internal/dsp/diversity/irc.go) as an offline replay-harness arm for capture analysis, not
as a live driver mode: the measured blind-vs-trained gap above is the documented reason.
Sources
-
Diversity combining — Wikipedia, on combining schemes and the MMSE/optimum combining generalisation of MRC under interference. ↩