22j: white-noise probe — real TF is flat (warp not output multiplier), reduction is contrast-driven; adaptive-twin lead
This commit is contained in:
+37
-8
@@ -118,10 +118,33 @@ static void process_band_structural(
|
||||
band_level[k] = static_cast<float>(lvl);
|
||||
}
|
||||
|
||||
fn529fe0::iir1(band_level.data(), kIIR_A1, kIIR_B1, nbin, 0.0);
|
||||
std::copy(band_level.begin(), band_level.begin() + nbin, f6f8.begin());
|
||||
|
||||
fn529fe0::iir1(band_level.data(), kIIR_A2, kIIR_B2, nbin, 0.0);
|
||||
// RT_IIR12 mode (NOTES 22j, EXPERIMENTAL): how IIR1/IIR2 run.
|
||||
// fwd (default/canon): ascending-bin cascade within frame.
|
||||
// bidir: forward+backward passes like IIR3.
|
||||
// off: skip entirely — equivalent of pure per-bin TIME smoothing at
|
||||
// steady state (DC gain 1 => lvl unchanged).
|
||||
static const int iir_mode = getenv("RT_IIR12") ? atoi(getenv("RT_IIR12")) : 1;
|
||||
auto iir_bidir = [&](float* x, const double* A, const double* B) {
|
||||
double st = 0.0;
|
||||
for (size_t i = 0; i < nbin; i++) {
|
||||
st = static_cast<double>(x[i]) * B[i] + st * A[i];
|
||||
x[i] = static_cast<float>(st);
|
||||
}
|
||||
st = x[nbin - 1];
|
||||
for (size_t i = nbin - 2; i >= 1; i--) {
|
||||
st = static_cast<double>(x[i]) * B[i] + st * A[i];
|
||||
x[i] = static_cast<float>(st);
|
||||
}
|
||||
};
|
||||
if (iir_mode == 2) {
|
||||
iir_bidir(band_level.data(), kIIR_A1, kIIR_B1);
|
||||
std::copy(band_level.begin(), band_level.begin() + nbin, f6f8.begin());
|
||||
iir_bidir(band_level.data(), kIIR_A2, kIIR_B2);
|
||||
} else if (iir_mode == 1) {
|
||||
fn529fe0::iir1(band_level.data(), kIIR_A1, kIIR_B1, nbin, 0.0);
|
||||
std::copy(band_level.begin(), band_level.begin() + nbin, f6f8.begin());
|
||||
fn529fe0::iir1(band_level.data(), kIIR_A2, kIIR_B2, nbin, 0.0);
|
||||
}
|
||||
|
||||
// RT_LVL_CAP: EXPERIMENTAL detector-level cap (NOTES 22f/22g/22h) — the real
|
||||
// plugin's reduction floors at blend*ln10/20 (sens12/mix100), implying a cap
|
||||
@@ -153,10 +176,16 @@ static void process_band_structural(
|
||||
fn529fe0::combine_acc(acc.data(), band_level.data(), f6f8.data(),
|
||||
kRTAtt, kRTRel, nfft);
|
||||
|
||||
for (size_t k = 0; k < nfft; k++) {
|
||||
size_t idx = (k < nbin) ? k : (nfft - 1 - k);
|
||||
double res_k = std::max(static_cast<double>(res[idx]), 1e-12);
|
||||
mask_out[k] *= kBand768[idx] * kWarp[idx] * std::pow(res_k, rp);
|
||||
// RT_NOWARP=1 (NOTES 22j, EXPERIMENTAL): skip warp/W attenuation — white-noise
|
||||
// probe shows the real plugin passes broadband content at unity, so the warp
|
||||
// term cannot be a blanket output multiplier.
|
||||
static const int nowarp = getenv("RT_NOWARP") ? atoi(getenv("RT_NOWARP")) : 0;
|
||||
if (!nowarp) {
|
||||
for (size_t k = 0; k < nfft; k++) {
|
||||
size_t idx = (k < nbin) ? k : (nfft - 1 - k);
|
||||
double res_k = std::max(static_cast<double>(res[idx]), 1e-12);
|
||||
mask_out[k] *= kBand768[idx] * kWarp[idx] * std::pow(res_k, rp);
|
||||
}
|
||||
}
|
||||
|
||||
// Step 9 (NOTES_LEVEL:830 + consumers_out.txt:955-1075): IIR3 inline,
|
||||
|
||||
Reference in New Issue
Block a user