fix: expose physical aliasing and delayed arrivals

This commit is contained in:
2026-08-29 10:21:33 +09:00
parent e048ccbadc
commit de0053eae3
38 changed files with 3086 additions and 214 deletions
+41
View File
@@ -0,0 +1,41 @@
import {
describeFrequencyAliasing,
observeFrequencyBand,
} from "/packages/acoustics-core/sampling.js";
/**
* Select evaluation truth sources for one observed band.
*
* Arrival ids come from synthesis path timing and take precedence over the
* legacy emission-time fallback. This helper is evaluation-only; localization
* never receives truth positions or ids.
*/
export function sourcesForObservedBand(
scene,
band,
fftSize,
options = {},
) {
const observation = observeFrequencyBand(band, scene.sampleRate, fftSize);
const observedBins = new Set(observation.bins);
const arrivingSourceIdSet = Array.isArray(options.arrivingSourceIds)
? new Set(options.arrivingSourceIds)
: null;
const time = options.time ?? null;
return scene.sources.filter((source) => {
if (arrivingSourceIdSet) {
if (!arrivingSourceIdSet.has(source.id)) return false;
} else if (time !== null) {
const startTime = source.startTime ?? 0;
const endTime = startTime + (source.duration ?? scene.duration);
if (time < startTime || time >= endTime) return false;
}
if (source.signal.type !== "tone") return true;
const analogInside =
source.signal.frequency >= band.minHz && source.signal.frequency <= band.maxHz;
if (analogInside) return true;
const alias = describeFrequencyAliasing(source.signal.frequency, scene.sampleRate);
const nearestAdcBin = Math.round(alias.adcFrequencyHz / observation.binWidthHz);
return observedBins.has(nearestAdcBin);
});
}