perf: harden realtime localization pipeline

This commit is contained in:
Codex
2026-08-28 18:58:48 +09:00
parent 35c33e360e
commit 256558e601
13 changed files with 765 additions and 84 deletions
+10 -2
View File
@@ -3,7 +3,11 @@ import {
estimateDasWorkload,
finalizeDasBands,
} from "../acoustics-core/das.js";
import { interpolateFrequencyResponse } from "../acoustics-core/frequency-response.js";
import {
interpolateFrequencyResponse,
inverseResponseGainDb,
requireMaxCompensationDb,
} from "../acoustics-core/frequency-response.js";
import { dbToLinear } from "../acoustics-core/math.js";
import { extractStftBins } from "../acoustics-core/stft.js";
import {
@@ -77,6 +81,7 @@ export function packStftBatch(stft, bins, options = {}) {
const packed = new Float32Array(bins.length * valuesPerBin * 2);
const microphones = options.microphones;
const compensateFrequencyResponse = options.compensateFrequencyResponse !== false;
const maxCompensationDb = requireMaxCompensationDb(options.maxCompensationDb);
const hasFrequencyResponse =
compensateFrequencyResponse &&
Array.isArray(microphones) &&
@@ -100,7 +105,9 @@ export function packStftBatch(stft, bins, options = {}) {
microphones.forEach((microphone, microphoneIndex) => {
if (!Array.isArray(microphone.frequencyResponse)) return;
interpolateFrequencyResponse(microphone.frequencyResponse, frequencyHz, response);
const inverseGain = dbToLinear(-response.gainDb);
const inverseGain = dbToLinear(
inverseResponseGainDb(response.gainDb, maxCompensationDb),
);
const responseOffset = (binIndex * stft.microphoneCount + microphoneIndex) * 2;
inverseResponses[responseOffset] = inverseGain * Math.cos(response.phaseRadians);
inverseResponses[responseOffset + 1] = -inverseGain * Math.sin(response.phaseRadians);
@@ -541,6 +548,7 @@ export async function computeDasWebGpu(options) {
fftSize: experiment.stft.fftSize,
compensateFrequencyResponse:
experiment.beamforming.compensateFrequencyResponse !== false,
maxCompensationDb: experiment.beamforming.maxCompensationDb,
});
stftMs += now() - stftStartedAt;
const binIndices = Uint32Array.from(batchBins);