Correct RTA detector timing and peak integration

This commit is contained in:
Mikei386
2026-07-21 21:29:41 +02:00
parent 3478bfb495
commit 9b5250d42b
10 changed files with 312 additions and 112 deletions
+8 -5
View File
@@ -31,10 +31,9 @@ const PEAK_HOLD_MAP = new Map(Object.entries({
}));
const INTEGRATION_TAU = {
impulse: 0.035,
fast: 0.125,
medium: 0.5,
slow: 1.0,
peak: 0.01,
};
@@ -283,6 +282,7 @@ function buildConfigSignature(CONFIG, nyq, binCount) {
CONFIG.RTA_BPO_MODE,
CONFIG.RTA_WEIGHTING,
CONFIG.RTA_BAR_LAYOUT,
CONFIG.RTA_DETECTOR,
CONFIG.RTA_INTEGRATION,
CONFIG.RTA_PEAK_HOLD_MODE,
CONFIG.RTA_PEAK_HOLD_SEC,
@@ -383,15 +383,14 @@ function computeBandLevels(state, utils, buf, CONFIG, range) {
}
function applyIntegration(state, levels, CONFIG, range) {
const mode = (CONFIG.RTA_INTEGRATION && INTEGRATION_TAU[CONFIG.RTA_INTEGRATION])
const mode = (CONFIG.RTA_INTEGRATION === 'impulse' || INTEGRATION_TAU[CONFIG.RTA_INTEGRATION])
? CONFIG.RTA_INTEGRATION
: 'fast';
const tau = INTEGRATION_TAU[mode] || 0.125;
const peakDetector = CONFIG.RTA_DETECTOR === 'peak';
const now = performance.now();
const last = state.lastIntegrationTs || now;
const dt = Math.max(1 / 240, (now - last) / 1000);
state.lastIntegrationTs = now;
const alpha = (tau > 0 && dt > 0) ? 1 - Math.exp(-dt / tau) : 1;
if (!state.ewma || state.ewma.length !== levels.length) {
state.ewma = new Float32Array(levels.length);
@@ -400,6 +399,10 @@ function applyIntegration(state, levels, CONFIG, range) {
const buffer = state.ewma;
for (let i = 0; i < levels.length; i++) {
const prev = buffer[i];
const tau = peakDetector
? 0.010
: (mode === 'impulse' ? (levels[i] >= prev ? 0.035 : 1.5) : (INTEGRATION_TAU[mode] || 0.125));
const alpha = (tau > 0 && dt > 0) ? 1 - Math.exp(-dt / tau) : 1;
buffer[i] = prev + (levels[i] - prev) * alpha;
}
return buffer;