Scope & privacy
현재 모델의 범위
@@ -320,6 +342,7 @@
Array Builder 설명서마이크 배치·프리셋·JSON
Dataset Builder 설명서source·ambient·Preview WAV
Camera 설명서backend·결과·비교
+
전 대역 활동 검출CFAR·spectral flux·alias 가설
음향 모델마이크 응답·반사·산란·회절
실측 포팅block·streaming 위치추정 API
데이터 계약JSON Schema와 재현성
diff --git a/packages/acoustics-core/README.md b/packages/acoustics-core/README.md
index 5e2a3a3..45ff8b3 100644
--- a/packages/acoustics-core/README.md
+++ b/packages/acoustics-core/README.md
@@ -6,7 +6,56 @@
- 자유음장 직접음과 선택적 저비용 shoebox multipath
- zero-padded FFT 전달함수 기반 fractional sample delay와 마이크 주파수 응답
- radix-2 FFT, Hann STFT와 선택 bin 추출
-- scan grid 거리 cache 및 DAS·DAS-PHAT·GCC-PHAT 위치 추정
+- scan grid 거리 cache 및 DAS·DAS-PHAT·GCC-PHAT·MUSIC 위치 추정
+
+## 단일 채널 활동 검출 API
+
+전 대역 후보 검출은 위치추정기와 분리된 무의존성 ES module입니다.
+
analyzeCfarActivity()는 한 채널의 모든 complete Hann frame에 CA-CFAR 또는
+OS-CFAR를 적용하고,
computeDixonSpectralFlux()는 Dixon 2006의 Hamming,
+linear-magnitude, half-wave, full-DFT L1 onset novelty를 계산합니다.
+
+~~~js
+import {
+ analyzeCfarActivity,
+ computeDixonSpectralFlux,
+ pickCausalSpectralFluxPeaks,
+} from "./packages/acoustics-core/index.js";
+
+const cfar = await analyzeCfarActivity({
+ samples: onePhysicalAdcChannel,
+ sampleRate: 48_000,
+ fftSize: 512,
+ hopSize: 256,
+ window: "hann",
+ channelId: "mic-001",
+ detector: "os-cfar",
+ trainingCellsPerSide: 8,
+ guardCellsPerSide: 2,
+ rank: 12,
+ nominalFalseAlarmProbability: 0.001,
+});
+
+const flux = computeDixonSpectralFlux({
+ samples: onePhysicalAdcChannel,
+ sampleRate: 48_000,
+ fftSize: 512,
+ hopSize: 256,
+ channelId: "mic-001",
+});
+~~~
+
+두 함수는 여러 마이크, frame 또는 detector를 합치지 않으며 위치·음원 수·아날로그 alias order를
+추론하지 않습니다. CFAR 결과는 DC와 Nyquist를 포함한 모든 ADC bin record를 보존하고,
+full symmetric reference가 없는 edge를
untested로 남깁니다. Pfa는 IID
+exponential 모델의 tested CUT 하나당 명목값입니다. Spectral flux는 모든 frame×full-DFT-bin
+양의 차이와 raw ODF를 보존하며 peak picker는 별도 명시 호출입니다.
+
+
estimateCfarActivityWorkload()와
+
estimateDixonSpectralFluxWorkload()로 할당 전에 frame/bin/FFT 연산과 raw output
+byte를 검사할 수 있습니다. 기본 상한을 넘으면 일부 frame, top-K bin 또는 축소 결과를
+만들지 않고 실패합니다. 상세 수식과 문헌은
+[전 대역 활동 검출 모델](../../docs/activity-detection.md)에 있습니다.
## Nyquist 초과 입력
diff --git a/tests/integration/README.md b/tests/integration/README.md
index 2673d60..e74c9e6 100644
--- a/tests/integration/README.md
+++ b/tests/integration/README.md
@@ -26,7 +26,9 @@ Unit과 integration test가 같은 페이지에서 실행됩니다. WebGPU 장
중복 좌표 차단, 표준 Array JSON 저장·재가져오기와 390px layout
- `camera-ui.test.js`: Dedicated Worker CPU/WebGPU 실행, 취소, Result schema, rectangular/Fermat와
DAS/DAS-PHAT 비교, GCC-PHAT CPU·협대역 제약, Builder 새 탭과 Experiment 선로드·Scene
- 재import의 다중 band 보존; 이동 예제 전체 교체 확인, 8×8 CPU·2 Hz live map의
+ 재import의 다중 band 보존; 독립 OS-CFAR·raw spectral-flux Activity, 모든 frame/bin JSON,
+ 단일 마이크·truth 경계·미연결 배경 image 독립성, 49.125 kHz 명시 alias 가설;
+ 이동 예제 전체 교체 확인, 8×8 CPU·2 Hz live map의
Auto→CPU fallback 뒤 공통 analysis plan 재사용, 복수 frame, scrub, 재생 시간 증가와 일시정지
- `workflow-ui.test.js`: Dataset Builder의 Scene JSON과 원본 assets를 Acoustic Camera에 넘겨
Result JSON을 저장하는 end-to-end 흐름
diff --git a/tests/unit/README.md b/tests/unit/README.md
index ae64be2..1652415 100644
--- a/tests/unit/README.md
+++ b/tests/unit/README.md
@@ -25,6 +25,12 @@ Unit과 integration module은 같은 browser runner에서 순서대로 실행됩
선할당 제한, 0–1 score bound·scan 범위 불변성과 geometry/STFT/IFFT workspace 재사용
- `localization.test.js`: 알고리즘 registry와 generic CPU/backend dispatcher, power/score
의미, portable GCC-PHAT block·streaming 경로
+- `cfar.test.js`: CA/OS multiplier, nominal per-CUT Pfa, full symmetric reference,
+ 모든 tested/untested bin과 zero-threshold JSON 상태
+- `activity-monitor.test.js`: 단일 채널 complete-frame CFAR, raw frame×bin 보존,
+ deterministic workload·hard cap과 취소
+- `spectral-flux.test.js`: Dixon Hamming/full-DFT raw novelty, causal peak picker,
+ latency, exact output preflight와 memory cap
- `realtime-localizer.test.js`: 기존 CPU DAS와 bit-exact map 동등성, chunk 경계 독립성,
bounded ring/result batch, 취소와 geometry·steering cache 연산 절감
- `builder.test.js`: Builder scene model, source/asset·trajectory 조작, 오디오 크기와 WAV 사전 검증