Field Guide · algorithm

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.

wanted signal interferer → null two antennas, one null to spend
With N antennas the combiner has N−1 spatial degrees of freedom to spend: IRC spends one on a null toward the interferer, which MRC would instead amplify along with the branch it is loudest on.

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

  1. Diversity combining — Wikipedia, on combining schemes and the MMSE/optimum combining generalisation of MRC under interference. 

See also