Replace empirical PCHIP detector with live-calibrated mask chain from FUN_180529fe0: level = am*res*scale; track += w*(level-track) (per-bin attack/release weights extracted from RT snapshot, rt_weights.hpp); acc = (level-track)+level; mask = (1/(1+K*acc))^n (K=9.8026 n=0.25966 fitted to live mask band0). min-combine. Results (N=2048 hop=512): t1kq single-band err +0.51 dB (-14.47 vs -14.98 dB ref); comb 4-band per-tone -3.4..+5.8 dB (old PCHIP over-cut comb ~6 dB). Adds framed_test harness for C++ FramedDetector eval on tone1kq/comb.
41 lines
1.5 KiB
C++
41 lines
1.5 KiB
C++
#pragma once
|
|
#include <cstddef>
|
|
#include <complex>
|
|
#include <vector>
|
|
|
|
struct DetectorBand {
|
|
float fc; // band center freq (Hz)
|
|
float q; // resonance Q
|
|
float sens; // XML sens (dB); internal sens_stored = sens * 2.054
|
|
float level_scale = 1.0f; // calibration: level = am * res * level_scale
|
|
};
|
|
|
|
// FramedDetector — C++ port of the real soothe mask chain (FUN_180529fe0).
|
|
// Per band, per bin:
|
|
// level_k = am_k * res_k (twin resonance x smoothed amplitude)
|
|
// track += w_k * (level - track) (per-bin level tracker, attack/release
|
|
// weights w from live capture rt_weights)
|
|
// acc_k = 2*level_k - track_k (accumulator, live peak ~10.08 at tone)
|
|
// mask_k = LUT(acc_k) (fitted mask curve from live capture)
|
|
// final mask = min over bands (max suppression), like soothe's band combine.
|
|
class FramedDetector {
|
|
public:
|
|
FramedDetector(size_t nfft, float sample_rate);
|
|
~FramedDetector();
|
|
|
|
void setParams(const std::vector<DetectorBand>& bands);
|
|
|
|
void processFrame(const std::complex<double>* spectrum, float* mask);
|
|
|
|
private:
|
|
size_t nfft_;
|
|
float sample_rate_;
|
|
double wsum_;
|
|
|
|
std::vector<DetectorBand> bands_;
|
|
std::vector<std::vector<float>> res_; // per band, per bin |2B/A|
|
|
std::vector<float> warp_; // per-bin warp tilt
|
|
std::vector<float> am_; // smoothed per-bin amplitude
|
|
std::vector<std::vector<float>> track_; // per band, per bin level tracker
|
|
};
|