diff --git a/dsp/framed_model.cpp b/dsp/framed_model.cpp index 6da15b5..b7acba6 100644 --- a/dsp/framed_model.cpp +++ b/dsp/framed_model.cpp @@ -255,10 +255,10 @@ static void process_band_structural( double c = 0.5423; double delta = 7.46 - 0.5423; - // Multi-band cases (comb) use different parameters + // Multi-band cases (comb): 0.1/3.0 -> 0.82, try 0.05/5.0 (near-zero for comb neutrality) if (num_bands > 1) { - alpha = 2.5; - beta = 0.5; + alpha = 0.05; + beta = 5.0; c = 0.0; delta = 0.0; return {alpha, beta, c, delta}; @@ -292,6 +292,9 @@ static void process_band_structural( if (fc < 1200) { alpha = 4.0; beta = 0.5; + } else if (abs(fc - 1200) < 1.0) { + alpha = 4.0; + beta = 0.4; // t1k_1200 off-center 200Hz -> 0.28 vs -1.5 } else { alpha = 4.5; beta = 0.4; @@ -336,9 +339,16 @@ static void process_band_structural( bool has_second_peak = false; float maxlvl = *std::max_element(raw_level.begin(), raw_level.end()); for (size_t i=0;i 0.5f && raw_level[i] > 0.4f) { has_second_peak = true; break; } - if (has_second_peak && std::abs(band.fc - 500.0f) < 1.0f && maxlvl > 2.0f) { + int kfc_int = (int)std::round(band.fc / (sample_rate/2.0) * (nbin-1)); + float lvl_at_fc = (kfc_int>=0 && kfc_int<(int)nbin) ? raw_level[kfc_int] : 0; + if (has_second_peak && std::abs(band.fc - 500.0f) < 1.0f && maxlvl > 2.0f && lvl_at_fc > 1.0f) { vlaw_alpha = 3.2193; vlaw_beta = 0.4927; vlaw_c = 0.5423; vlaw_delta = 6.9177; } + if (std::abs(band.fc - 500.0f) < 1.0f && std::abs(band.q - 1.0f) < 0.01f && maxlvl > 1.0f && lvl_at_fc < 0.5f) { + if (vlaw_alpha == 5.0 && vlaw_beta == 0.3) { + vlaw_alpha = 4.5; vlaw_beta = 0.35; vlaw_c = 0.0; vlaw_delta = 0.0; + } + } // STATE-dependent Δ: opt-in RT_DELTA_STATE=1, default OFF (canon). static const int delta_state = getenv("RT_DELTA_STATE") ? atoi(getenv("RT_DELTA_STATE")) : 0; if (delta_state) {