Also known as: spectral-amplitude enhancement, amplitude enhancement, 6.2 enhancement
MBE spectral-amplitude enhancement is the IMBE decoder stage — TIA-102.BABA §6.2 — that reshapes the recovered per-harmonic amplitudes just before synthesis, boosting the harmonics the model under-represents so the spectral envelope tilts more naturally on playback.1 After the quantizer round-trip, mid-band harmonics tend to have some of their energy averaged into neighbouring bands; §6.2 restores the peaks by multiplying each harmonic amplitude by a weight derived from the frame’s spectral moments, then renormalizing so total frame energy is unchanged.
Spectral moments
The whole stage is driven by two scalar summaries of the frame’s amplitude spectrum, the spectral moments:
R_M0 = Σ Ml²— the integrated power across all L harmonics (the frame energy).R_M1 = Σ Ml² · cos(ω₀·l)— the same power weighted by the cosine of each harmonic’s angular frequency, so it captures the spectral tilt.
GopherTrunk computes these once per frame (FrameEnergy and SpectralCosineSum) and reuses them
for every harmonic’s weight, which is what keeps the stage cheap.
The per-harmonic weight
EnhanceAmplitudes in internal/voice/mbe/enhance.go walks harmonics l = 1..L and multiplies
each amplitude M[l] by a weight W_l:
- Low band (
8·l ≤ L) and the top of the band are left atW_l = 1— the model already represents them well, so they are untouched. -
Mid band, with
c = cos(ω₀·l):num = R_M0² + R_M1² − 2·R_M0·R_M1·c den = R_M0 · (R_M0² − R_M1²) ξ = 0.96 · num / den W_l = ξ^0.25, clamped to [0.5, 1.2]
The exponent of ¼ makes the weight a gentle contour rather than a hard boost, and the clamp
EnhanceWMin = 0.5, EnhanceWMax = 1.2 bounds it so a near-pure-tone frame — where
R_M0² − R_M1² approaches zero and the ratio would blow up — cannot produce a runaway multiplier.
A degenerate frame (den ≤ 0, which by Cauchy-Schwarz means a single dominant harmonic) simply
gets W_l = 1 and is skipped.
Energy preservation
Reshaping the envelope redistributes energy between harmonics, which would otherwise change the
frame’s loudness and make enhanced frames jump in level against un-enhanced ones. §6.2 closes with
a renormalization: after the per-harmonic multiply, the stage recomputes the enhanced energy and
scales every amplitude by sqrt(R_M0_orig / R_M0_enhanced), so the integrated power R_M0 is
exactly restored. The formants are sharper but the frame is neither louder nor quieter — the
enhancement changes the shape of the spectrum, not its total energy. Silent frames, zero-L
frames, and all-zero-amplitude frames are no-ops, so the synthesis path can call
EnhanceAmplitudes unconditionally.
Where it sits
Enhancement runs after §6.1 cross-frame log-amplitude recovery and the log-to-linear amplitude conversion, and before synthesis: the enhanced amplitudes feed both the voiced sinusoidal synthesis and the unvoiced noise synthesis. It is a perceptual polish on the decoded MBE model parameters, distinct from the error-driven adaptive smoothing that cleans up corrupted parameters on a weak channel.
Relevance to SDR
For a scanner the payoff is speech that sounds like the reference P25 Phase 1 decoder rather than a flat, muffled approximation — the formant contrast §6.2 restores is a large part of what makes decoded voice intelligible and natural. Because it is a specified part of the IMBE standard, GopherTrunk implements the exact closed form rather than an ad-hoc equalizer, with the constants cross-checked against public reference decoders.
Sources
-
Multi-Band Excitation — Wikipedia, on the MBE/IMBE vocoder whose decoder includes the §6.2 enhancement. ↩