Fix RTA peak hold and FFT band energy
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import { buildBandBinMapping, computeBandLevels } from '../www/core/utils.js';
|
||||
|
||||
const band = [{ center: 1000, fLo: 875, fHi: 1125 }];
|
||||
|
||||
for (const binCount of [2048, 4096, 8192, 16384]) {
|
||||
const nyquist = 24000;
|
||||
const binWidth = nyquist / binCount;
|
||||
const mapping = buildBandBinMapping(band, nyquist, binCount);
|
||||
const totalWeight = mapping[0].bins.reduce((sum, bin) => sum + bin.weight, 0);
|
||||
assert.ok(
|
||||
Math.abs(totalWeight * binWidth - 250) < 1e-6,
|
||||
`bin overlaps must cover the complete band at FFT size ${binCount * 2}`,
|
||||
);
|
||||
|
||||
// Constant power density: every bin contains density × bin width. The
|
||||
// integrated band level must therefore be independent of FFT resolution.
|
||||
const binPower = binWidth * 1e-6;
|
||||
const binsDb = new Float32Array(binCount);
|
||||
binsDb.fill(10 * Math.log10(binPower));
|
||||
const level = computeBandLevels(mapping, binsDb)[0];
|
||||
const expected = 10 * Math.log10(250e-6);
|
||||
assert.ok(Math.abs(level - expected) < 1e-5, `FFT size ${binCount * 2}: ${level} vs ${expected}`);
|
||||
}
|
||||
|
||||
console.log('FFT band-energy regression tests passed');
|
||||
@@ -22,6 +22,9 @@ const forced = context.buildRtaRuntimeConfig({
|
||||
RTA_FREQ_RANGE: 'lf',
|
||||
RTA_IIR_ORDER: 2,
|
||||
RTA_DETECTOR: 'peak',
|
||||
RTA_PEAK_HOLD_MODE: 'manual',
|
||||
RTA_PEAK_HOLD_SEC: 4,
|
||||
RTA_PEAK_RESET_TOKEN: 9,
|
||||
CORR_RESPONSE_S: 2.5,
|
||||
CORR_RESET_TOKEN: 7,
|
||||
XY_POINTS: 256,
|
||||
@@ -31,6 +34,9 @@ assert.equal(forced.bpo, '1_12');
|
||||
assert.equal(forced.freqRange, 'norm');
|
||||
assert.equal(forced.order, 6);
|
||||
assert.equal(forced.detector, 'peak');
|
||||
assert.equal(forced.rtaPeakHoldMode, 'manual');
|
||||
assert.equal(forced.rtaPeakHoldSeconds, 4);
|
||||
assert.equal(forced.rtaPeakResetToken, 9);
|
||||
assert.equal(forced.tauFast, 0.125);
|
||||
assert.equal(forced.rtwCenters.length, 121);
|
||||
assert.equal(forced.correlationResponseS, 2.5);
|
||||
|
||||
Reference in New Issue
Block a user