Field Guide · term

Also known as: normalized cross-correlation, complex correlation coefficient

Coherence — the magnitude of the normalized cross-correlation between two complex signals — measures how much of them is the same underlying signal, on a scale from 0 (statistically unrelated) to 1 (identical up to a complex gain), independent of how loud either one is.1 For two diversity branches it is computed as

|ρ| = |Σ x₁·conj(x₀)| / √(Σ|x₀|² · Σ|x₁|²)

— the cross-power between the branches, normalised by each branch’s own power. That normalisation is the point: gain, attenuation, and front-end scaling all cancel, so ρ answers “do these two streams carry one signal?” where an absolute level in dBFS can only answer “is this stream loud?”.

0.5 0 dB 1.0 noise floor √(π/4N) per-branch SNR γ → |ρ|
|ρ| = γ/(1+γ): coherence 0.5 means each branch sits at 0 dB SNR, and the noise-only floor √(π/4N) is where N samples of pure independent noise land by chance.

Reading the number

Three anchor facts turn ρ from an abstract statistic into an instrument:

  • It is an SNR meter. For two branches carrying one signal at equal per-branch SNR γ, |ρ| = γ/(1+γ): coherence 0.50 means 0 dB per branch, 0.35 means about −2.7 dB. A threshold on ρ is therefore a threshold on signal-to-noise ratio, stated in a form no gain knob can game.
  • It has a chance floor. N samples of independent noise produce |ρ| ≈ √(π/4N) just from finite averaging — about 0.014 for N = 4096. A measured ρ is meaningful only well above that floor, and the floor falls as 1/√N, so longer windows buy resolution.
  • It carries an error bar. The phase of ρ estimates the inter-branch phase, with a standard error of roughly √((1−ρ²)/(2Nρ²)) — small-looking coherence over a long window can still pin phase to a few degrees, which is why gates on the projected error behave where fixed ρ thresholds do not.

Two traps

DC offsets fake coherence. Both receivers of one front end share LO leakage, and a common DC term correlates perfectly with itself: an uncentred correlator fed two branches of independent noise plus common DC reports |ρ| → 1 and returns the ratio of the DC offsets as a “channel estimate” — in exactly the weak-signal regime where the number matters most. Subtract each branch’s mean before correlating; in a correlator this is load-bearing, not hygiene.

Bandwidth dilutes wideband coherence. Only the hertz actually carrying the common signal contribute cross-power, so for in-channel power fractions f₀, f₁ of each branch, ρ_wb ≈ ρ_ch·√(f₀·f₁). A perfectly coherent narrowband carrier inside a wide noisy capture can legitimately measure ρ ≈ 0.16 wideband — and a fixed 0.5 threshold then silently makes “coherent enough” depend on the configured capture bandwidth and each branch’s noise floor. Compare coherence measured before and after the DDC to separate “the branches disagree” from “the bandwidth is diluting”.

Relevance to SDR

GopherTrunk’s diversity combiner is built on this statistic (internal/dsp/diversity/crossstats.go): MRC calibration is gated on the phase error projected from ρ rather than on any absolute level, after an absolute −40 dBFS gate proved to be a gain-staging trap — an operator once raised front-end gain 65 → 82 dB purely to push a number past a software constant. The same statistic diagnoses hardware: per-frequency coherence near 1 with diluted broadband ρ is the signature of a pure inter-branch delay (fixed by a fractional-delay filter, not a gain), and a coherence that no tracking improves marks the wideband-scalar limit of single-gain combining. The operator-facing symptoms are catalogued in MRC diversity gotchas.

Sources

  1. Pearson correlation coefficient — Wikipedia, on the normalised correlation statistic, its scale invariance, and its sampling behaviour. 

See also