Files
micarrsim/packages/acoustics-core/localization.js
T

54 lines
1.8 KiB
JavaScript

import {
computeDasMap,
createDasAnalysisPlan,
estimateDasWorkload,
} from "./das.js";
import {
computeGccPhatMap,
createGccPhatAnalysisPlan,
estimateGccPhatWorkload,
} from "./gcc-phat.js";
import {
isDasAlgorithm,
requireLocalizationAlgorithmDefinition,
} from "./localization-algorithms.js";
function requestedAlgorithm(options) {
return requireLocalizationAlgorithmDefinition(
options?.experiment?.beamforming?.algorithm,
);
}
/**
* Estimate implementation-level work for whichever localization algorithm the
* experiment requests.
*/
export function estimateLocalizationWorkload(options) {
const algorithm = requestedAlgorithm(options);
if (isDasAlgorithm(algorithm.id)) return estimateDasWorkload(options);
if (algorithm.id === "gcc-phat") return estimateGccPhatWorkload(options);
throw new RangeError("No workload estimator is registered for " + algorithm.id + ".");
}
/**
* Compile immutable geometry/workspace state for repeated CPU analyses.
*/
export function createLocalizationAnalysisPlan(options) {
const algorithm = requestedAlgorithm(options);
if (isDasAlgorithm(algorithm.id)) return createDasAnalysisPlan(options);
if (algorithm.id === "gcc-phat") return createGccPhatAnalysisPlan(options);
throw new RangeError("No analysis-plan factory is registered for " + algorithm.id + ".");
}
/**
* Compute a CPU localization map using the algorithm selected by the
* experiment. The returned `algorithm` and each band's `rawScale` make the
* result semantics explicit.
*/
export async function computeLocalizationMap(options) {
const algorithm = requestedAlgorithm(options);
if (isDasAlgorithm(algorithm.id)) return computeDasMap(options);
if (algorithm.id === "gcc-phat") return computeGccPhatMap(options);
throw new RangeError("No CPU localization implementation is registered for " + algorithm.id + ".");
}