HeadMania-UpSampler-v1.15.0
HeadMania UpSampler v1.15.0 — Transient-Adaptive Filters
Support the ongoing development of this project on Patreon: https://www.patreon.com/c/HeadMania
Need help, want to share feedback, or chat with other listeners? Join the Telegram group: https://t.me/+lIFYDf6ZmMk4N2E0
Found a bug or have a feature request? Report it on the issue tracker: https://github.com/danghe/HeadManiaReleases/issues
Headline — three new transient-adaptive filters
This release introduces a new family of upsampling filters that adapt their time-domain behavior in real time, based on what the music is doing. Three new presets are surfaced (all marked 🔬 R&D while blind ABX validation continues):
- Adaptive Apex Hybrid — 300K-tap main FIR + transient-gated apodizer
- Kinetic Apex Hybrid — 300K-tap, Kinetic 2.0 cepstral phase morph
- Mega Kinetic — 1,000,001-tap, Kinetic 2.0 cepstral phase morph at full Mega depth
All three target the same fundamental trade-off — linear-phase clarity on sustained content, min-phase snap on transients — but they get there via different mechanisms.
The problem they all solve
Every upsampling filter forces a choice between two philosophies:
- Linear-phase filters give perfect group-delay flatness, deep soundstage, and rock-solid stereo imaging — but they ring before each transient arrives ("pre-ring"), which can soften attacks on percussion and plucked strings.
- Min-phase filters eliminate pre-ring entirely (sharper attacks) — but they sacrifice some spatial precision and add non-flat group delay.
The classic audiophile debate (Linn Organik vs Chord WTA, Selekt vs M-Scaler) is essentially about which side of this trade-off you prefer. All three new HeadMania presets sidestep the choice by adapting per-transient.
Preset 1 — Adaptive Apex Hybrid
Mechanism: the apodizer cascade gets gated by a transient detector.
The existing Apex Hybrid preset is built from a 300K-tap linear-phase main FIR (the tightest the r8brain engine can synthesize) followed by a fixed 1023-tap minimum-phase apodizer cascade that always runs. The apodizer cleans up the long FIR's pre-ringing but contributes a tiny truncation-noise floor of its own.
Adaptive Apex Hybrid keeps the same 300K-tap main FIR but only engages the apodizer when a transient is detected. During sustained content the apodizer disengages entirely — output is pure linear-phase reconstruction with zero apodizer contribution. When a transient arrives, the apodizer gates back in over a brief Hanning window, then releases.
Measured properties:
- Steady-state stopband: 316 dB (1.2 dB cleaner than static Apex Hybrid — because the apodizer truncation tail is absent when no transient is detected)
- Steady-state image rejection: 297 dB
- Steady-state THD+N: at the floating-point precision floor
The audible idea: all the spatial precision and stopband cleanliness of pure linear-phase MegaLinear-grade reconstruction, plus the transient snap of Hybrid-grade apodization when the music actually has transients to suppress.
Presets 2 & 3 — Kinetic Apex Hybrid + Mega Kinetic (Kinetic 2.0)
Mechanism: instead of cascading a separate apodizer, the filter morphs its own phase response.
Both presets store three pre-computed FIR kernels at α ∈ {0, 0.5, 1.0}:
- α = 0 — pure linear-phase (symmetric IR, perfect group-delay flatness)
- α = 1 — min-phase (asymmetric IR, no pre-ring)
- α = 0.5 — cepstral intermediate
A transient detector with asymmetric 3 ms attack / 30 ms release ramps α continuously between 0 and 0.5 in real time:
- Sustained passages → α = 0 → behaves exactly as a static linear-phase brick-wall
- Transient → α rises briefly → pre-ring suppressed (the IR briefly shifts toward min-phase character)
- ~30 ms later → α decays back to 0
What makes this approach different from Adaptive Apex's apodizer-gating:
The cepstral phase morph is mathematically magnitude-preserving by construction. Cepstrum operates on log|H(ω)|, which is symmetric for real-valued signals. Scaling the causal vs anti-causal halves of the cepstrum complementarily redistributes the impulse-response time-domain energy without touching the frequency-domain magnitude. We measured this: 0.08 dB max delta across the audible band, essentially zero below 10 kHz.
Apodizer-gating (Adaptive Apex) and parallel-convolver crossfade (the older Kinetic Dual Engine) both have to be careful about avoiding amplitude modulation during the transition. Cepstral phase morphing avoids that entirely — magnitude is provably continuous at every point during the morph.
Two sizes:
- Kinetic Apex Hybrid (300K-tap) — same kernel depth as Apex Hybrid. Drop-in alternative.
- Mega Kinetic (1,000,001-tap) — same kernel depth as MegaLinear 1M. At α=0 it's bit-identical to MegaLinear 1M (verified L2 = 0.000 over 909K output samples). At any non-zero α the magnitude response is preserved within the cepstral precision limit.
Measured properties:
| Kinetic Apex Hybrid | Mega Kinetic | |
|---|---|---|
| Tap count | 300K | 1,000,001 |
| Steady-state stopband | 316 dB | 326 dB |
| Steady-state image rejection | 295 dB | 302 dB |
| Steady-state THD+N | ≤ −150 dB | ≤ −150 dB |
| Transient-time stopband | 115 dB | 130 dB |
| Pre-ring duration (linear-phase reference) | 7.2 ms | 7.2 ms |
| Pre-ring duration (during transient) | 0.07 ms | 0.07 ms |
| H(ω) | invariance across morph |
The 115–130 dB transient-time stopband is well above audibility (24-bit dynamic range is 144 dB; humans don't perceive below ~−120 dB on the cleanest DACs).
How they compare — which one for what
| Preset | Mechanism | Best for | Notes |
|---|---|---|---|
| Adaptive Apex Hybrid | Apodizer cascade gated on/off | Listeners who already liked Apex Hybrid and want the apodizer character only when transients call for it | Same 300K main FIR as Apex Hybrid. Steady-state is cleaner than static Apex Hybrid because the apodizer truncation tail is absent. |
| Kinetic Apex Hybrid | Cepstral phase morph (single convolver, FFT-domain kernel blend) | Listeners who want phase-morph with provably-zero magnitude impact | 300K-tap. No apodizer cascade. The cleanest of the 300K-class transient-adaptive filters from a magnitude-purity standpoint. |
| Mega Kinetic | Cepstral phase morph at 1M-tap depth | Audiophile reference listening on systems with the CPU/memory headroom | Bit-identical to MegaLinear 1M at α=0. Transients receive the cepstral morph treatment without any change in steady-state behavior. |
Why this is technically unusual
Surveying the commercial audiophile-upsampler landscape:
- Linn Selekt / Klimax DSM "Organik" — FPGA-based min-phase. Static. Doesn't morph.
- Chord DAVE / M-Scaler — WTA filter, linear-phase, ~1M+ taps. Static. Doesn't morph.
- HQPlayer (Jussi Laako) — extensive filter menu including "intermediate phase" modes. Static — the user picks one filter and it stays.
- AKM / ESS DAC chips with "auto-filter" modes — switch between filters at coarse boundaries (per track), not per-transient with continuous morphing.
We're not aware of any other commercial audiophile upsampler that adapts phase character per-transient while preserving the magnitude response.
About page updates
- New cards for Adaptive Apex Hybrid, Kinetic Apex Hybrid, and Mega Kinetic with measured numbers and current R&D status.
- Kinetic Dual Engine gained an honest engineering note explaining its parallel-convolver trade-off and pointing readers toward the Kinetic 2.0 presets if they want phase-morph with absolute magnitude purity.
- Measurement table now includes the three new presets with full Goertzel-sweep numbers (stopband, image rejection, THD+N, true worst-case, pre/post-ring).
- About-tab container widened to fit the now 10-column measurement table without horizontal scroll on typical desktop viewports. On narrower windows the table's own scroll wrapper kicks in.
- Removed an incorrect recommendation that suggested MegaOrganik 2M for live-capture use.
Engineering hardening (under-the-hood)
- Preset-switch UB fix — the engine's
reconfigure()is now strong-exception-safe: it builds the candidate convolver and configures it BEFORE replacing the live resampler. Astd::bad_allocduring a huge MegaFIR FFT allocation (or similar failure) can no longer leave the engine pointing at unconfigured state. - Type-safe Kinetic-engine downcast via a new virtual method — prevents UB during the transient window where
m_presetand the live resampler's actual type could disagree across rapid preset switches. - Release packaging now mirrors worktree builds to the main checkout's
Releases/so canonical history stays consistent regardless of which worktree the build ran from. - v1.14.2 (the build-hygiene patch between v1.14.1 and this release) disabled
HM_RT_TRACEin the release build — it had been inadvertently left on in v1.14.1, adding per-block instrumentation overhead. v1.15.0 inherits the fix.
Test infrastructure (engineering audience)
- New
hm_phase_morph_runtimebinary with 21 synthetic-signal tests covering steady-state behavior, transient detection, static-α IR shape progression, magnitude preservation across α anchors, stereo coherence, and PM-sideband measurement with a static-linear control baseline.
How to try the new presets
Open the app and look in the filter-preset list for the 🔥 Kinetic — Transient-Adaptive group:
- Adaptive Apex Hybrid 🔬 R&D — apodizer-gated variant
- Kinetic Apex Hybrid 🔬 R&D — cepstral phase morph (300K)
For the Mega-class variant, scroll to the top of the Mega family for Mega Kinetic 🔬 R&D (1M).
Recommended A/B method:
- Pick a track with both sustained content (vocals, strings) and percussive transients (drum hits, plucked guitar, brass attacks)
- Compare against the static counterpart: Apex Hybrid for both Apex variants; MegaLinear 1M for Mega Kinetic
- Sustained passages should sound indistinguishable from the static counterpart (this is the design intent — both Adaptive Apex and Kinetic 2.0 are pure linear-phase in steady state)
- Transients should feel slightly tighter / more present — without any change in tonal balance or apparent loudness
Honest caveats
- All three new presets are 🔬 R&D. Blind ABX hasn't been completed yet; informal listening is positive but not authoritative.
- All three are technically deviations from time-invariant LTI behavior during transients. Magnitude is preserved by construction for the Kinetic 2.0 variants (provably) and very nearly for Adaptive Apex (the apodizer's contribution is tiny and only present during transients). Purists who want strict LTI behavior should continue using MegaLinear 1M or Apex Hybrid, which remain in the lineup unchanged.
- The Kinetic 2.0 morph caps at α_max = 0.5 (50% of the way from linear-phase to full min-phase) — a deliberate choice that keeps the transient-time stopband well above audibility and limits any phase-modulation effects.
In V1.15.5 I added some fixes for the Kinetic Dual Engine(noise/clicks pops that appeared in quiet passages were removed) and settings persistence.
Need help, want to share feedback, or chat with other listeners? Join the Telegram group: https://t.me/+lIFYDf6ZmMk4N2E0
Found a bug or have a feature request? Report it on the issue tracker: https://github.com/danghe/HeadManiaReleases/issues