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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user