feat: add physically explicit narrowband MUSIC
This commit is contained in:
@@ -29,7 +29,7 @@ Tone과 band의 검증 범위는 0–1 MHz다. 이는 Nyquist cutoff가 아니
|
||||
|
||||
## 위치 추정 알고리즘
|
||||
|
||||
`localization-algorithms.js`의 registry와 `localization.js`의 generic API가 다음 세 경로를
|
||||
`localization-algorithms.js`의 registry와 `localization.js`의 generic API가 다음 네 경로를
|
||||
공통 interface로 제공합니다.
|
||||
|
||||
| `algorithm` | 계산 | raw scale | backend |
|
||||
@@ -37,6 +37,7 @@ Tone과 band의 검증 범위는 0–1 MHz다. 이는 Nyquist cutoff가 아니
|
||||
| `das` | conventional frequency-domain delay-and-sum | `power` | CPU, WebGPU |
|
||||
| `das-phat` | 채널 spectrum을 phase-only로 만든 DAS | `score` | CPU, WebGPU |
|
||||
| `gcc-phat` | 하나의 reference mic와 나머지 mic의 GCC-PHAT 지연 scan | `score` | CPU only |
|
||||
| `music` | Schmidt narrowband MUSIC의 근거리 spherical noise-subspace projection | `noise-projection` | CPU only |
|
||||
|
||||
Portable API에서는 top-level `algorithm`으로 선택합니다. 생략하면 기존과 같은 `das`이며, 낮은
|
||||
수준의 generic API는 `experiment.beamforming.algorithm`을 사용합니다.
|
||||
@@ -49,7 +50,7 @@ import {
|
||||
|
||||
const plan = createLocalizationPlan({
|
||||
...commonConfig, // sampleRate, array, scan, bands, stft
|
||||
algorithm: "gcc-phat", // "das" | "das-phat" | "gcc-phat"
|
||||
algorithm: "gcc-phat", // "das" | "das-phat" | "gcc-phat" | "music"
|
||||
phatFloorRatio: 1e-6,
|
||||
});
|
||||
|
||||
@@ -75,6 +76,61 @@ band에 선택된 bin이 8개 미만이면 코어는 계산을 허용하지만
|
||||
GCC-PHAT score는 pair 수, band coefficient 수와 IFFT 크기로 정규화한 0–1 양의 상관 응답이라
|
||||
scan 범위와 마이크 수에 의한 단순 재척도화는 피하지만, 여전히 확률로 보정된 confidence는 아닙니다.
|
||||
|
||||
### Narrowband MUSIC
|
||||
|
||||
`music`은 [Schmidt MUSIC](https://doi.org/10.1109/TAP.1986.1143830)을 sample covariance와
|
||||
근거리 구면파 direct-path manifold에 적용합니다. 근거리 배열 처리의 문헌 배경은
|
||||
[Huang–Barkat](https://doi.org/10.1109/8.86917)을 참고하세요. raw map은 reciprocal을 취하지
|
||||
않은 Float64 noise projection
|
||||
|
||||
`q(r)=Σ_(j=K)^(M-1)|v_jᴴa(r)|²/(a(r)ᴴa(r))`
|
||||
|
||||
이고 objective는 minimum입니다. 표준 pseudospectrum `P=1/q`와 표시용 `P/Pmax`는 위치
|
||||
확률·likelihood·confidence·신뢰구간이 아닙니다. raw `q`는 peak normalization이나 epsilon
|
||||
floor로 바꾸지 않습니다.
|
||||
|
||||
각 Experiment band는 FFT spacing에 놓인 **아날로그 carrier 가설 하나**만 포함해야 합니다.
|
||||
관측 ADC bin이 같아도 alias order가 다른 아날로그 가설은 별도 band입니다. Nyquist 위 값은
|
||||
허용하며 signed alias가 음수이면 positive-bin STFT, mic calibration과 전체 complex manifold를
|
||||
켤레 방향으로 사용합니다. 공간 위상은 `exp[-j sign(f_signed) 2π f_a Δr/c]`로 analog carrier
|
||||
크기를 유지하고 signed ADC alias는 orientation만 정합니다. 이 carrier는 Experiment에서 온 가설이고 Scene source truth는
|
||||
localizer에 전달되지 않습니다. 정확한 DC/Nyquist bin은 quadrature-degenerate라 거부합니다.
|
||||
|
||||
source 수는 `musicSourceCountMethod: "fixed"`와 `musicSourceCount: K` 또는
|
||||
[Wax–Kailath](https://doi.org/10.1109/TASSP.1985.1164557) `"aic"`/`"mdl"`로 정합니다.
|
||||
AIC/MDL은 `hopSize === fftSize`, 완전한 frame만 사용, `T>M`, roundoff보다 큰 양의 noise
|
||||
eigenvalue가 필요합니다. IID complex Gaussian snapshot, spatially white noise와 일정한 source
|
||||
수를 가정하지만 실제 데이터에서 이를 검증하지 않으며 score는 posterior가 아닙니다. 조건이
|
||||
깨지거나 signal/noise eigengap이 수치 오차보다 작으면 `MusicUnavailableError`
|
||||
(`code: "MUSIC_UNAVAILABLE"`)를 반환합니다.
|
||||
|
||||
동일 주파수의 coherent source는 covariance rank를 잃을 수 있습니다. grating lobe, 동률과 flat
|
||||
objective를 고르기 좋게 깨지 않으며, diagonal loading, eigenvalue floor, spatial smoothing,
|
||||
band 간 association/fusion을 적용하지 않습니다. [Wax–Shan–Kailath broadband 방법](https://doi.org/10.1109/TASSP.1984.1164400)은
|
||||
문헌상 별도 알고리즘이며 현재 구현하지 않았습니다.
|
||||
|
||||
빠른 portable 예:
|
||||
|
||||
```js
|
||||
const plan = createLocalizationPlan({
|
||||
sampleRate: 48_000,
|
||||
array,
|
||||
scan,
|
||||
bands: [{ id: "1k", minHz: 950, maxHz: 1_050, color: "#65f2bf" }],
|
||||
stft: { fftSize: 512, hopSize: 256 },
|
||||
algorithm: "music",
|
||||
normalization: "none",
|
||||
musicSourceCountMethod: "fixed",
|
||||
musicSourceCount: 1,
|
||||
});
|
||||
const result = await localizeMultichannel({ plan, channels });
|
||||
```
|
||||
|
||||
band는 정확히 한 FFT-grid center를 포함해야 하므로 `minHz/maxHz`는 사용 중인 `Fs/N`에서
|
||||
하나의 center만 감싸야 합니다. CPU plan/working-set, covariance accumulation, projection MAC,
|
||||
Jacobi pair-update와 FFT butterfly 상한은 할당·계산 전에 검사합니다. 기본 상한을 넘으면 부분
|
||||
eigensystem이나 축소 map을 반환하지 않습니다.
|
||||
|
||||
## 실측 다채널 스트림 위치 추정
|
||||
|
||||
`realtime-localizer.js`는 Scene·음원 합성 없이 이미 sampling된 동기식 마이크 채널을 직접
|
||||
@@ -83,8 +139,8 @@ scan 범위와 마이크 수에 의한 단순 재척도화는 피하지만, 여
|
||||
각 chunk는 동일 길이의 `Float32Array` 목록이어야 합니다.
|
||||
|
||||
`StreamingLocalizer`는 알고리즘 중립 class 이름입니다. 기존 `StreamingDasLocalizer`와 같은 class의
|
||||
export alias이므로 오래된 import도 그대로 동작하며, `createStreamingLocalizer()` factory도 세
|
||||
알고리즘을 모두 지원합니다.
|
||||
export alias이므로 오래된 import도 그대로 동작하며, `createStreamingLocalizer()` factory도 네
|
||||
알고리즘을 모두 지원합니다. MUSIC plan은 `plan.musicPlan` alias로도 접근할 수 있습니다.
|
||||
|
||||
```js
|
||||
import { createStreamingLocalizer } from "./packages/acoustics-core/realtime-localizer.js";
|
||||
|
||||
Reference in New Issue
Block a user