chain_9_19: add IIR4 generator (FUN_180533340) + integrate in audio path

- Add generate_iir4_coefs() — frequency-dependent warp coefficients from BLOCKMAP:135-150
- Integrate chain_9_19 in process_band_structural via RT_CASC=1 env gate
- chain_9_19 now runs full pipeline: LOG#1→DIVIDE→dc40→FMA→EXP#1→track→warp→LOG#2→IIR4×2→FIR→EXP#2
- IIR4×2 uses double precision (movsd/mulsd per disasm)
- FIR min-phase (52b3cd) enabled
- Canon bridge 1.594 unchanged when RT_CASC=0
- Requires live-dump or ph*.npz capture for input format calibration
This commit is contained in:
2026-09-02 18:25:14 +03:00
parent 2a295af6f3
commit 96816f9921
3 changed files with 34 additions and 29 deletions
+19
View File
@@ -208,6 +208,25 @@ static inline void iir4_bidir_340510(float* x, size_t nbin) {
acc = 0.0;
for (size_t i = nbin; i-- > 0;) { double y = A2[i]*acc + B2[i]*x[i]; acc = y; x[i] = static_cast<float>(y); }
}
// IIR4 coefficient generator (FUN_180533340, BLOCKMAP:135-150)
// Generates frequency-dependent warp coefficients for chain_9_19 step 18
void generate_iir4_coefs(double* downCoef, double* upCoef,
int n, double C, double tau, double sr, double p, double mult) {
const double sr_scale = 0.9994880557060242; // DAT_1824c3d8c (live)
const double exp_scale = 0.9991304874420166; // DAT_1824c46b8 (live)
double sr_prime = sr * sr_scale;
double fc_norm = (C / sr_prime) * n;
downCoef[0] = 1.0;
upCoef[0] = 0.0;
for (int i = 1; i < n; i++) {
double g = (i <= fc_norm) ? (fc_norm / i) : std::pow(fc_norm / i, p);
double c = 1.0 / (g * tau / mult + 1.0);
upCoef[i] = std::exp(c * g * tau * exp_scale);
downCoef[i] = 1.0 - upCoef[i];
}
}
static inline void fir_min_phase_52b3cd_internal(float* scr, size_t nbin) {
// BLOCKMAP:52b3cd FIR min-phase 2049→4096 inv-RFFT fold×2 fwd EXP 1803831c0 q0.80
// Real RFFT pipeline validated cascade_sim.py fir_kernel 0.0065dB. Gate RT_FIR=1