docs: explain full-band activity workflow
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
# micarrsim
|
# micarrsim
|
||||||
|
|
||||||
192채널 MEMS 마이크 배열의 배치와 자유음장·저비용 실내 근사에서 DAS·DAS-PHAT·GCC-PHAT
|
192채널 MEMS 마이크 배열의 배치와 자유음장·저비용 실내 근사에서 DAS·DAS-PHAT·GCC-PHAT·MUSIC
|
||||||
위치 추정을 비교하는 로컬 브라우저
|
위치 추정을 비교하고, 표준 CFAR와 spectral flux로 ADC 대역의 원시 활동 후보를 확인하는 로컬 브라우저
|
||||||
시뮬레이터입니다. Array Builder에서 마이크 배치를 설계하고, Dataset Builder에서 녹음 파일·합성
|
시뮬레이터입니다. Array Builder에서 마이크 배치를 설계하고, Dataset Builder에서 녹음 파일·합성
|
||||||
신호와 이동 경로를 포함한 재현 가능한 음향 장면을 만든 뒤, Acoustic Camera에서 CPU 또는
|
신호와 이동 경로를 포함한 재현 가능한 음향 장면을 만든 뒤, Acoustic Camera에서 CPU 또는
|
||||||
WebGPU로 배열 응답, acoustic map과 위치 검출 지표를 계산하거나 이동 장면을 시간축으로 재생합니다.
|
WebGPU로 배열 응답, acoustic map과 위치 검출 지표를 계산하거나 이동 장면을 시간축으로 재생합니다.
|
||||||
@@ -59,6 +59,27 @@ MUSIC을 바로 확인하려면 현재 장면 제목 옆 **MUSIC 빠른 예제**
|
|||||||
실제 완료 시간은 브라우저와 장치에 따라 다릅니다. CPU fallback에서는 WebGPU보다 오래 걸릴 수
|
실제 완료 시간은 브라우저와 장치에 따라 다릅니다. CPU fallback에서는 WebGPU보다 오래 걸릴 수
|
||||||
있습니다.
|
있습니다.
|
||||||
|
|
||||||
|
### 분석 주파수를 모를 때
|
||||||
|
|
||||||
|
1. Acoustic Camera의 분석 대역 아래에서 **전 대역 활동 검사**를 펼칩니다.
|
||||||
|
2. 물리 마이크 한 채널과 **OS-CFAR**, **CA-CFAR** 또는
|
||||||
|
**Dixon spectral flux**를 고릅니다.
|
||||||
|
3. **전 대역 검사**를 누르고 frame slider에서 원시 ADC-bin 통계 또는 onset novelty를 봅니다.
|
||||||
|
4. CFAR candidate의 **아날로그 center 가설**을 직접 입력합니다. 기본값은 관측 ADC
|
||||||
|
center일 뿐 원 주파수 정답이 아닙니다.
|
||||||
|
5. **이 가설을 대역으로 추가**한 뒤 위치 추정 알고리즘을 골라 Snapshot을 실행합니다.
|
||||||
|
6. 감사 가능한 모든 frame/bin 값은 **Activity JSON**으로 저장합니다.
|
||||||
|
|
||||||
|
예를 들어 48 kHz ADC의 1,125 Hz 관측에는 1,125 Hz뿐 아니라 46,875 Hz,
|
||||||
|
49,125 Hz 같은 서로 다른 아날로그 가설이 대응합니다. Nyquist 초과 값도 막지 않지만,
|
||||||
|
Camera가 Scene truth로 alias order를 고르지는 않습니다. 각 가설을 별도 band로 넣어 배열의
|
||||||
|
spatial alias·grating lobe·실패 양상을 그대로 비교하세요.
|
||||||
|
|
||||||
|
CFAR의 Pfa는 IID exponential 배경 모델의 **tested CUT 하나당 명목값**이며 위치 확률이나
|
||||||
|
실측 confidence가 아닙니다. Spectral flux는 지속 신호 검출이 아니라 onset novelty입니다.
|
||||||
|
세 검출 경로와 위치 map을 자동 합의·평균·maximum fusion하지 않습니다. 수식, 미검사 edge와
|
||||||
|
causal latency는 [전 대역 활동 검출 모델](docs/activity-detection.md)에 설명되어 있습니다.
|
||||||
|
|
||||||
### 화면 폭 조절
|
### 화면 폭 조절
|
||||||
|
|
||||||
데스크톱에서는 Array Builder와 Acoustic Camera의 왼쪽 설정 패널, Dataset Builder의 오른쪽 설정
|
데스크톱에서는 Array Builder와 Acoustic Camera의 왼쪽 설정 패널, Dataset Builder의 오른쪽 설정
|
||||||
@@ -340,6 +361,7 @@ test.cmd
|
|||||||
|
|
||||||
## 저장 형식과 개발 문서
|
## 저장 형식과 개발 문서
|
||||||
|
|
||||||
|
- [전 대역 활동 검출 모델](docs/activity-detection.md): CA/OS-CFAR, spectral flux와 alias 가설 흐름
|
||||||
- [`docs/data-contracts.md`](docs/data-contracts.md): Array·Scene·Experiment·Result 계약
|
- [`docs/data-contracts.md`](docs/data-contracts.md): Array·Scene·Experiment·Result 계약
|
||||||
- [`docs/acoustic-model.md`](docs/acoustic-model.md): 마이크 응답과 자유음장·shoebox 희소 근사
|
- [`docs/acoustic-model.md`](docs/acoustic-model.md): 마이크 응답과 자유음장·shoebox 희소 근사
|
||||||
- [`docs/realtime-porting.md`](docs/realtime-porting.md): 실측 다채널 위치추정 API 포팅
|
- [`docs/realtime-porting.md`](docs/realtime-porting.md): 실측 다채널 위치추정 API 포팅
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
# Acoustic Camera
|
# Acoustic Camera
|
||||||
|
|
||||||
Scene과 마이크 배열로 자유음장 또는 저비용 shoebox microphone signal을 합성하고, STFT와
|
Scene과 마이크 배열로 자유음장 또는 저비용 shoebox microphone signal을 합성하고, 표준
|
||||||
DAS·DAS-PHAT·GCC-PHAT 위치추정으로 주파수 대역별 acoustic map과 ground-truth 평가 지표를
|
CA/OS-CFAR·Dixon spectral flux로 ADC 대역 후보를 보거나 STFT와
|
||||||
만드는 브라우저 앱입니다. 정지 장면은 Snapshot, trajectory 장면은 Moving 흐름으로 분리되어
|
DAS·DAS-PHAT·GCC-PHAT·MUSIC 위치추정으로 주파수 대역별 acoustic map과 ground-truth 평가
|
||||||
있습니다.
|
지표를 만드는 브라우저 앱입니다. 정지 장면은 Snapshot, trajectory 장면은 Moving 흐름으로
|
||||||
|
분리되어 있습니다.
|
||||||
|
|
||||||
## 열기와 Snapshot
|
## 열기와 Snapshot
|
||||||
|
|
||||||
@@ -55,6 +56,50 @@ Camera가 SHA-256을 계산해 manifest에 연결합니다. 같은 이름이라
|
|||||||
|
|
||||||
파일은 외부로 업로드되지 않고 브라우저 메모리에서만 처리됩니다.
|
파일은 외부로 업로드되지 않고 브라우저 메모리에서만 처리됩니다.
|
||||||
|
|
||||||
|
## 전 대역 활동 후보 찾기
|
||||||
|
|
||||||
|
분석 주파수를 미리 모를 때는 분석 대역 아래의 **전 대역 활동 검사**를 펼칩니다.
|
||||||
|
이 흐름은 위치추정 map과 별도이며 다음 순서로 사용합니다.
|
||||||
|
|
||||||
|
1. 실제로 관찰할 물리 마이크 한 채널을 고릅니다.
|
||||||
|
2. 좁은 spectral outlier에는 OS-CFAR 또는 CA-CFAR, 갑작스러운 onset에는
|
||||||
|
Dixon spectral flux를 고릅니다.
|
||||||
|
3. **전 대역 검사**를 누르고 frame별 원시 결과를 확인합니다.
|
||||||
|
4. CFAR가 표시한 ADC bin에 대응한다고 가정할 아날로그 center를 직접 입력합니다.
|
||||||
|
5. **이 가설을 대역으로 추가**한 뒤 DAS·PHAT·GCC-PHAT·MUSIC으로 배열 위치응답을 비교합니다.
|
||||||
|
6. 모든 complete frame과 모든 tested/untested bin은 **Activity JSON**으로 저장합니다.
|
||||||
|
|
||||||
|
Activity worker는 Scene과 선택한 마이크의 위치·응답으로 물리 수신 신호를 합성하지만,
|
||||||
|
음원 위치·주파수·개수 정답은 detector 함수에 전달하지 않습니다. 선택하지 않은 마이크는
|
||||||
|
합성하거나 평균·투표하지 않습니다. 위치추정 band, algorithm, backend 또는 배경 image 연결이
|
||||||
|
잘못돼 Snapshot을 실행할 수 없어도, Scene·선택 마이크·STFT·합성 최소 거리와 필요한 audio
|
||||||
|
asset이 유효하면 Activity는 실행할 수 있습니다.
|
||||||
|
|
||||||
|
CFAR는 Hann STFT의 각 complete frame을 독립 검사합니다. DC, Nyquist와 좌우 full
|
||||||
|
reference window가 없는 edge bin은 reference 수를 줄이거나 wrap하지 않고 untested로 남깁니다.
|
||||||
|
Pfa는 IID exponential square-law 배경을 가정한 tested CUT 하나당 명목 오경보율이며
|
||||||
|
위치 확률, confidence, frame 전체 오경보율 또는 실측 보정값이 아닙니다. 화면에는 CUT,
|
||||||
|
reference, threshold와 ratio를 그대로 표시합니다.
|
||||||
|
|
||||||
|
Dixon spectral flux는 Hamming STFT의 연속 frame 사이에서 증가한 linear magnitude의
|
||||||
|
full-DFT L1 합입니다. 지속 activity가 아니라 onset novelty입니다. Böck–Krebs–Schedl
|
||||||
|
causal peak picker는 기본으로 꺼져 있고, 켤 때도 delta는 확률이 아닌 사용자 보정값입니다.
|
||||||
|
Frame start는 설명용 시각이며 **available** 시각이 실제 causal 판정 가능 시각입니다.
|
||||||
|
|
||||||
|
Scene의 peak normalization을 선택했다면 선택한 한 채널의 전체 render peak가 detector 전에
|
||||||
|
적용됩니다. 이 경우 detector 자체는 입력 이후 causal이어도 spectral-flux 절대값과 delta
|
||||||
|
event를 포함한 end-to-end 전처리는 미래 sample에 의존하며, UI와 JSON에 이를 표시합니다.
|
||||||
|
물리 scale을 그대로 비교하려면 Scene normalization을 none으로 두세요.
|
||||||
|
|
||||||
|
검출기가 관찰하는 주파수는 ADC의 0…Fs/2뿐입니다. 예를 들어 Fs=48 kHz에서 ADC 1,125 Hz로
|
||||||
|
보인 성분은 1,125 Hz, 46,875 Hz, 49,125 Hz 등 여러 아날로그 carrier와 양립합니다.
|
||||||
|
Nyquist 초과 가설도 0–1 MHz 검증 범위에서 허용하지만 alias order와 spectral inversion은
|
||||||
|
자동 선택하지 않습니다. 각 가설을 FFT-grid center의 별도 band로 추가합니다. CFAR와 flux,
|
||||||
|
서로 다른 band 또는 위치 map을 합의·평균·maximum으로 자동 결합하지 않습니다.
|
||||||
|
|
||||||
|
수식, 통계 가정, 문헌과 raw output 계약은
|
||||||
|
[전 대역 활동 검출 모델](../../docs/activity-detection.md)을 참고하세요.
|
||||||
|
|
||||||
## 위치 추정 알고리즘과 Backend
|
## 위치 추정 알고리즘과 Backend
|
||||||
|
|
||||||
**분석 설정 → 위치 추정 알고리즘**에서 다음 네 구현을 선택합니다.
|
**분석 설정 → 위치 추정 알고리즘**에서 다음 네 구현을 선택합니다.
|
||||||
|
|||||||
@@ -4,6 +4,28 @@
|
|||||||
의미와 한계를 정의한다. 검출기는 Scene의 음원 주파수·위치·개수를 입력으로 받지
|
의미와 한계를 정의한다. 검출기는 Scene의 음원 주파수·위치·개수를 입력으로 받지
|
||||||
않으며, 검출 결과를 위치 정답이나 분석 대역으로 자동 변환하지 않는다.
|
않으며, 검출 결과를 위치 정답이나 분석 대역으로 자동 변환하지 않는다.
|
||||||
|
|
||||||
|
## Camera에서 가장 짧은 사용 순서
|
||||||
|
|
||||||
|
1. Acoustic Camera의 분석 대역 아래 **전 대역 활동 검사**를 펼친다.
|
||||||
|
2. 한 물리 마이크와 OS-CFAR, CA-CFAR 또는 Dixon spectral flux를 고른다.
|
||||||
|
3. **전 대역 검사**를 실행하고 frame의 raw 통계와 실제 판정 가능 시각
|
||||||
|
<code>available</code>을 확인한다.
|
||||||
|
4. CFAR candidate가 있으면 관측 ADC center와 같은 bin으로 접히는 아날로그
|
||||||
|
FFT-grid center 가설을 직접 입력한다.
|
||||||
|
5. **이 가설을 대역으로 추가**하고 원하는 위치추정기를 별도로 실행한다.
|
||||||
|
6. 모든 complete frame/bin 감사값은 **Activity JSON**으로 저장한다.
|
||||||
|
|
||||||
|
Activity 실행에는 Scene·선택 마이크·STFT·신호 합성용 최소 거리와 참조하는 audio
|
||||||
|
asset만 필요하다. 위치추정 band, MUSIC source-count, backend, scan 또는 배경 image
|
||||||
|
연결 오류는 이 검출을 막지 않는다. 반대로 Scene, 선택한 마이크 응답이나 audio
|
||||||
|
asset이 잘못되면 물리 입력 자체를 만들 수 없으므로 실행하지 않는다.
|
||||||
|
|
||||||
|
예를 들어 (F_s=48,mathrm{kHz})에서 관측한 ADC 1,125 Hz에는 1,125 Hz,
|
||||||
|
46,875 Hz와 49,125 Hz 등의 아날로그 가설이 대응한다. 기본 입력값 1,125 Hz는
|
||||||
|
가장 낮은 가설을 편의상 보여줄 뿐 정답 판정이 아니다. Nyquist 초과 가설도
|
||||||
|
0–1 MHz 검증 범위 안에서 별도 band로 추가할 수 있으며, 서로 다른 alias order와
|
||||||
|
spectral inversion 가설을 합치지 않는다.
|
||||||
|
|
||||||
## 관측 경계
|
## 관측 경계
|
||||||
|
|
||||||
- 입력은 사용자가 고른 **물리 마이크 채널 하나**의 시간 샘플이다. 여러 채널의
|
- 입력은 사용자가 고른 **물리 마이크 채널 하나**의 시간 샘플이다. 여러 채널의
|
||||||
@@ -18,6 +40,29 @@
|
|||||||
- 정확한 DC와 Nyquist bin은 실수 성분 하나뿐이어서 내부 complex FFT bin과
|
- 정확한 DC와 Nyquist bin은 실수 성분 하나뿐이어서 내부 complex FFT bin과
|
||||||
통계 모델이 다르다. CFAR의 CUT와 reference cell에서 제외한다.
|
통계 모델이 다르다. CFAR의 CUT와 reference cell에서 제외한다.
|
||||||
|
|
||||||
|
## 시뮬레이터와 detector의 경계
|
||||||
|
|
||||||
|
Camera는 Scene의 source와 음향 경로로 선택한 물리 마이크 **하나**의 수신 신호를
|
||||||
|
먼저 합성한다. 이는 시험 입력을 만드는 forward simulator이므로 source 위치·주파수와
|
||||||
|
개수를 사용한다. 그 다음 detector 함수에는 이 한 채널 sample, sample rate, STFT와
|
||||||
|
검출 설정만 전달하며 source identity·위치·주파수·개수 정답은 전달하지 않는다.
|
||||||
|
Activity JSON은 이 경계를
|
||||||
|
<code>sceneSourceTruthUsedByPhysicalSimulator: true</code>와
|
||||||
|
<code>sceneSourceTruthPassedToDetector: false</code>로 구분한다.
|
||||||
|
|
||||||
|
Report는 source ID와 source별 도착 목록을 내보내지 않지만, 적용한 음향 모델,
|
||||||
|
종류별 path 수와 최대 지연 같은 집계 physical audit는 남긴다. 이 값은 source에서
|
||||||
|
파생된 정보이므로
|
||||||
|
<code>sourceDerivedAggregatePhysicalAuditIncluded: true</code>라고 명시한다.
|
||||||
|
Detector 판정 입력과 사후 감사 metadata를 같은 의미로 부르지 않는다.
|
||||||
|
|
||||||
|
Scene mix가 peak normalization이면 선택한 한 채널의 **전체 render peak**로 먼저
|
||||||
|
scale한다. 선택하지 않은 마이크에는 의존하지 않지만 미래 sample에는 의존한다.
|
||||||
|
따라서 detector는 주어진 sample 이후 causal이어도 raw flux와 절대 delta event를
|
||||||
|
포함한 end-to-end 전처리는 causal이 아니다. 이 경우 UI와 JSON의
|
||||||
|
<code>futureDependentNormalization</code>이 true가 된다. 물리 amplitude scale을
|
||||||
|
비교하려면 Scene normalization을 none으로 둔다.
|
||||||
|
|
||||||
## CA-CFAR와 OS-CFAR
|
## CA-CFAR와 OS-CFAR
|
||||||
|
|
||||||
CFAR는 한 STFT frame 안의 좁은 spectral outlier를 찾는다. frame 또는 마이크
|
CFAR는 한 STFT frame 안의 좁은 spectral outlier를 찾는다. frame 또는 마이크
|
||||||
@@ -104,3 +149,9 @@ Spectral flux는 **onset novelty**이지 지속 activity detector가 아니다.
|
|||||||
5. 같은 Scene·Array·가설에서 DAS, PHAT, GCC-PHAT, MUSIC의 raw map과 실패
|
5. 같은 Scene·Array·가설에서 DAS, PHAT, GCC-PHAT, MUSIC의 raw map과 실패
|
||||||
양상을 비교한다. 서로 다른 band의 map은 알려진 별도 wideband 방법을
|
양상을 비교한다. 서로 다른 band의 map은 알려진 별도 wideband 방법을
|
||||||
구현하기 전까지 자동 결합하지 않는다.
|
구현하기 전까지 자동 결합하지 않는다.
|
||||||
|
|
||||||
|
Activity의 독립 preflight는 합성과 detector output 상한을 먼저 계산한다. CFAR는
|
||||||
|
complete frame, frame×bin decision과 FFT butterfly hard cap을, spectral flux는
|
||||||
|
모든 frame×full-DFT-bin 차이를 보존하는 output byte 상한을 실제 함수와 같은
|
||||||
|
estimator로 검사한다. 상한을 넘으면 일부 frame이나 top-K bin만 반환하지 않고
|
||||||
|
신호 합성 전에 실패한다.
|
||||||
|
|||||||
+32
-3
@@ -1,8 +1,9 @@
|
|||||||
# 데이터 계약
|
# 데이터 계약
|
||||||
|
|
||||||
micarrsim의 저장 형식은 JSON Schema Draft 2020-12와 추가 관계 검증으로 정의한다. 모든 길이는 m,
|
micarrsim의 핵심 Array·Scene·Experiment·Result 형식은 JSON Schema Draft 2020-12와 추가 관계
|
||||||
시간은 s, 주파수는 Hz다. 배열 중심이 원점이고 `+x`는 오른쪽, `+y`는 위쪽, `+z`는 배열에서
|
검증으로 정의한다. Activity와 비교 기록 같은 편의 감사 export는 이 문서에서 별도 범위를
|
||||||
장면을 향하는 우수 좌표계를 사용한다.
|
명시한다. 모든 길이는 m, 시간은 s, 주파수는 Hz다. 배열 중심이 원점이고 `+x`는 오른쪽,
|
||||||
|
`+y`는 위쪽, `+z`는 배열에서 장면을 향하는 우수 좌표계를 사용한다.
|
||||||
|
|
||||||
## 파일 종류
|
## 파일 종류
|
||||||
|
|
||||||
@@ -10,6 +11,8 @@ micarrsim의 저장 형식은 JSON Schema Draft 2020-12와 추가 관계 검증
|
|||||||
- `micarrsim.scene`: 음원·ambient recipe, 위치 ground truth와 로컬 asset manifest
|
- `micarrsim.scene`: 음원·ambient recipe, 위치 ground truth와 로컬 asset manifest
|
||||||
- `micarrsim.experiment`: scan plane/grid, 주파수 대역, STFT와 위치 추정 설정
|
- `micarrsim.experiment`: scan plane/grid, 주파수 대역, STFT와 위치 추정 설정
|
||||||
- `micarrsim.result`: raw/display acoustic map, 복수 peak와 source 매칭, 평가·성능 정보
|
- `micarrsim.result`: raw/display acoustic map, 복수 peak와 source 매칭, 평가·성능 정보
|
||||||
|
- `micarrsim.activity-report`: 단일 물리 마이크의 raw CFAR 또는 spectral-flux 감사 export.
|
||||||
|
core schema 검증 대상은 아니며 위치추정 Result를 대신하지 않는다.
|
||||||
- `micarrsim.comparison-history`: 세션의 배열별 Result 요약을 모은 편의 export. core schema
|
- `micarrsim.comparison-history`: 세션의 배열별 Result 요약을 모은 편의 export. core schema
|
||||||
검증 대상은 아니며 각 원본 Result JSON을 대신하지 않는다.
|
검증 대상은 아니며 각 원본 Result JSON을 대신하지 않는다.
|
||||||
|
|
||||||
@@ -202,6 +205,32 @@ Nyquist 위 band의 `aliasOrderResolution`은 `not-attempted`다. MUSIC의
|
|||||||
bin이 선택됐을 때 포함한다. noise와 asset source는 모든 band에 포함한다. 녹음 asset의
|
bin이 선택됐을 때 포함한다. noise와 asset source는 모든 band에 포함한다. 녹음 asset의
|
||||||
spectrum을 임의 threshold로 분류하는 미검증 multiband 알고리즘은 사용하지 않는다.
|
spectrum을 임의 threshold로 분류하는 미검증 multiband 알고리즘은 사용하지 않는다.
|
||||||
|
|
||||||
|
## Activity JSON
|
||||||
|
|
||||||
|
Acoustic Camera의 Activity export는 <code>schemaVersion: "1.0.0"</code>,
|
||||||
|
<code>kind: "micarrsim.activity-report"</code>인 편의 감사 문서다. 최상위에는 실제 실행
|
||||||
|
Array·Scene·Experiment ID, 생성 시각과 64자리 SHA-256 <code>inputHash</code>가 있고,
|
||||||
|
<code>report</code>에는 다음 값이 있다.
|
||||||
|
|
||||||
|
- 사용자가 선택한 원래 microphone index·id·position과 microphone fusion 없음
|
||||||
|
- sample rate/count, FFT/hop, ADC 0…Fs/2와 alias order 미결정 상태
|
||||||
|
- simulator가 Scene truth로 물리 sample을 만들었다는 사실과 detector에는 truth를 전달하지
|
||||||
|
않았다는 분리 표기
|
||||||
|
- 선택 마이크 한 채널의 normalization·clipping·음향 경로 집계와 causal 전처리 여부
|
||||||
|
- CFAR의 모든 complete frame×모든 ADC bin 또는 spectral flux의 raw ODF와 모든
|
||||||
|
frame×full-DFT-bin 양의 차이
|
||||||
|
- 알고리즘 설정·가정·보정 상태, workload와 signal-generation/detector timing
|
||||||
|
|
||||||
|
Source identity와 source별 arrival 목록은 포함하지 않지만 path 수·최대 지연 같은 source-derived
|
||||||
|
집계 physical audit는 포함하며 이를 명시한다. CFAR의 <code>untested</code> bin과 zero-threshold
|
||||||
|
ratio 상태도 삭제하지 않는다. Typed array는 JSON 숫자 배열로 변환하고 비유한 수가 생기면
|
||||||
|
문자열 <code>Infinity</code>, <code>-Infinity</code> 또는 <code>NaN</code>으로 명시한다.
|
||||||
|
|
||||||
|
Activity <code>inputHash</code>는 검출에 실제로 사용한 선택 마이크, Scene의 음향 입력
|
||||||
|
(배경 image와 비audio asset 제외), STFT, 합성 최소 거리와 detector 설정의 canonical
|
||||||
|
UTF-8 SHA-256이다. 분석 band·scan·위치추정 algorithm/backend는 detector 입력이 아니므로
|
||||||
|
hash에 넣지 않는다. Array·Scene·Experiment ID는 provenance label로 별도 보존한다.
|
||||||
|
|
||||||
## 재현성 hash
|
## 재현성 hash
|
||||||
|
|
||||||
`result.inputHash`는 실행에 사용한 `{ array, scene, experiment }`를 객체 key 사전순으로 재귀
|
`result.inputHash`는 실행에 사용한 `{ array, scene, experiment }`를 객체 key 사전순으로 재귀
|
||||||
|
|||||||
@@ -4,7 +4,8 @@
|
|||||||
>
|
>
|
||||||
> 단계 0–4와 단계 5의 저비용 음향 환경·마이크 응답·다중 알고리즘 portable streaming core까지 완료했다.
|
> 단계 0–4와 단계 5의 저비용 음향 환경·마이크 응답·다중 알고리즘 portable streaming core까지 완료했다.
|
||||||
> 설치 없는 브라우저 앱, CPU/WebGPU DAS·DAS-PHAT와 CPU GCC-PHAT, Builder→Camera asset 재연결, 임의 오디오·이동
|
> 설치 없는 브라우저 앱, CPU/WebGPU DAS·DAS-PHAT와 CPU GCC-PHAT, Builder→Camera asset 재연결, 임의 오디오·이동
|
||||||
> trajectory, 빔 분포·복수 peak 감도, 라이브 시간축 재생, 배열 비교와 Result 내보내기를
|
> trajectory, 표준 단일채널 CA/OS-CFAR·Dixon spectral flux, 빔 분포·복수 peak 감도,
|
||||||
|
> 라이브 시간축 재생, 배열 비교와 Result 내보내기를
|
||||||
> 전체 자동 테스트로 검증했다. 실제 장치 adapter와 현장 검증은 장치 계약이 필요한 후속 범위다.
|
> 전체 자동 테스트로 검증했다. 실제 장치 adapter와 현장 검증은 장치 계약이 필요한 후속 범위다.
|
||||||
|
|
||||||
## 1. 목표와 성공 기준
|
## 1. 목표와 성공 기준
|
||||||
@@ -207,6 +208,7 @@ flattening이 모델 타당성을 훼손하는지 청취 및 spectrum 통계로
|
|||||||
- [x] 반복 거리·calibration·steering cache, bounded ring과 메모리 hard cap
|
- [x] 반복 거리·calibration·steering cache, bounded ring과 메모리 hard cap
|
||||||
- [x] DAS·DAS-PHAT·reference-pair GCC-PHAT와 알고리즘별 power/score 계약
|
- [x] DAS·DAS-PHAT·reference-pair GCC-PHAT와 알고리즘별 power/score 계약
|
||||||
- [x] CPU 좁은대역 Schmidt MUSIC, fixed K와 Wax–Kailath AIC/MDL, typed unavailable·연산 상한
|
- [x] CPU 좁은대역 Schmidt MUSIC, fixed K와 Wax–Kailath AIC/MDL, typed unavailable·연산 상한
|
||||||
|
- [x] 단일 물리 마이크 CA/OS-CFAR·Dixon spectral flux와 raw frame/bin export
|
||||||
- [ ] 라이선스 검토를 통과한 DCASE/MIMII adapter와 batch workflow
|
- [ ] 라이선스 검토를 통과한 DCASE/MIMII adapter와 batch workflow
|
||||||
- [ ] 실제 장치의 channel/clock/sample 형식에 맞춘 capture·transport adapter와 현장 검증
|
- [ ] 실제 장치의 channel/clock/sample 형식에 맞춘 capture·transport adapter와 현장 검증
|
||||||
- [ ] 필요 시 센서 self-noise·위치 공차와 DAMAS/CLEAN-SC 후처리
|
- [ ] 필요 시 센서 self-noise·위치 공차와 DAMAS/CLEAN-SC 후처리
|
||||||
@@ -232,6 +234,9 @@ hardware deadline과 정확도는 장치 adapter가 정해진 뒤 별도 측정
|
|||||||
- MUSIC 모호성을 숨김: band당 사용자 지정 analog FFT-grid 가설 하나와 direct-path near-field
|
- MUSIC 모호성을 숨김: band당 사용자 지정 analog FFT-grid 가설 하나와 direct-path near-field
|
||||||
manifold만 쓰며 Scene truth, diagonal loading, smoothing, multibin/wideband fusion 없이
|
manifold만 쓰며 Scene truth, diagonal loading, smoothing, multibin/wideband fusion 없이
|
||||||
grating lobe·동률·coherent rank deficiency를 보존한다.
|
grating lobe·동률·coherent rank deficiency를 보존한다.
|
||||||
|
- 자동 주파수 검출의 과장: detector에는 Scene truth를 전달하지 않고 ADC bin만 반환한다.
|
||||||
|
Nyquist 초과 analog carrier는 사용자가 별도 FFT-grid 가설로 지정하며, CFAR·flux·band·위치
|
||||||
|
map을 임의 consensus나 maximum으로 결합하지 않는다.
|
||||||
|
|
||||||
## 10. 구현 결과와 다음 백로그
|
## 10. 구현 결과와 다음 백로그
|
||||||
|
|
||||||
@@ -242,6 +247,7 @@ hardware deadline과 정확도는 장치 adapter가 정해진 뒤 별도 측정
|
|||||||
- [x] CPU DAS golden implementation
|
- [x] CPU DAS golden implementation
|
||||||
- [x] CPU/WebGPU DAS-PHAT와 CPU reference-pair GCC-PHAT 구현·비교 UI
|
- [x] CPU/WebGPU DAS-PHAT와 CPU reference-pair GCC-PHAT 구현·비교 UI
|
||||||
- [x] CPU 좁은대역 MUSIC과 fixed/Wax–Kailath source count, q 최소 목적함수·typed unavailable
|
- [x] CPU 좁은대역 MUSIC과 fixed/Wax–Kailath source count, q 최소 목적함수·typed unavailable
|
||||||
|
- [x] 표준 CA/OS-CFAR와 Dixon spectral flux의 독립 전 대역 검사·Activity JSON·alias 가설 UI
|
||||||
- [x] WGSL kernel, CPU/GPU 비교와 50²/100²/200² benchmark
|
- [x] WGSL kernel, CPU/GPU 비교와 50²/100²/200² benchmark
|
||||||
- [x] scene canvas, array view, parameter controls와 Result export
|
- [x] scene canvas, array view, parameter controls와 Result export
|
||||||
- [x] Builder→Camera SHA-256 asset 재연결 왕복 테스트
|
- [x] Builder→Camera SHA-256 asset 재연결 왕복 테스트
|
||||||
|
|||||||
+30
-7
@@ -17,6 +17,7 @@
|
|||||||
<nav aria-label="문서 목차">
|
<nav aria-label="문서 목차">
|
||||||
<a href="#quick-start">빠른 시작</a>
|
<a href="#quick-start">빠른 시작</a>
|
||||||
<a href="#moving-live">이동 라이브</a>
|
<a href="#moving-live">이동 라이브</a>
|
||||||
|
<a href="#activity">전 대역 검사</a>
|
||||||
<a href="#array-builder">배열 만들기</a>
|
<a href="#array-builder">배열 만들기</a>
|
||||||
<a href="#full-workflow">내 데이터</a>
|
<a href="#full-workflow">내 데이터</a>
|
||||||
<a href="#acoustic-model">환경·실측</a>
|
<a href="#acoustic-model">환경·실측</a>
|
||||||
@@ -71,8 +72,29 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="guide-section" id="array-builder">
|
<section class="guide-section" id="activity">
|
||||||
<div class="section-number">03</div>
|
<div class="section-number">03</div>
|
||||||
|
<div>
|
||||||
|
<p class="eyebrow">Unknown-frequency activity</p>
|
||||||
|
<h2>분석 주파수를 모를 때</h2>
|
||||||
|
<ol class="guide-steps">
|
||||||
|
<li><a href="/apps/acoustic-camera/">Acoustic Camera</a>의 분석 대역 아래 <strong>전 대역 활동 검사</strong>를 펼칩니다.</li>
|
||||||
|
<li>한 물리 마이크와 OS-CFAR·CA-CFAR 또는 Dixon spectral flux를 고르고 <strong>전 대역 검사</strong>를 누릅니다.</li>
|
||||||
|
<li>CFAR candidate의 ADC bin과 raw CUT/reference/threshold를 확인합니다. Spectral flux는 onset novelty만 봅니다.</li>
|
||||||
|
<li>아날로그 center 가설을 직접 입력해 별도 band로 추가한 뒤 Snapshot 위치추정을 실행합니다.</li>
|
||||||
|
<li>모든 complete frame/bin은 <strong>Activity JSON</strong>으로 저장합니다.</li>
|
||||||
|
</ol>
|
||||||
|
<aside class="callout callout--important">
|
||||||
|
Nyquist 초과 가설도 허용하지만 Scene truth로 원 주파수를 고르지 않습니다.
|
||||||
|
CFAR Pfa는 tested CUT 하나당 명목값이고 spectral flux는 확률이 아닙니다.
|
||||||
|
검출기·band·위치 map의 자동 fusion도 하지 않습니다.
|
||||||
|
<a href="/docs/activity-detection.md">수식과 물리적 한계</a>를 함께 확인하세요.
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="guide-section" id="array-builder">
|
||||||
|
<div class="section-number">04</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="eyebrow">Microphone geometry</p>
|
<p class="eyebrow">Microphone geometry</p>
|
||||||
<h2>내 마이크 배열 만들기</h2>
|
<h2>내 마이크 배열 만들기</h2>
|
||||||
@@ -95,7 +117,7 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="guide-section" id="full-workflow">
|
<section class="guide-section" id="full-workflow">
|
||||||
<div class="section-number">04</div>
|
<div class="section-number">05</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="eyebrow">5분 전체 흐름</p>
|
<p class="eyebrow">5분 전체 흐름</p>
|
||||||
<h2>내 장면을 만들고 Camera에서 실행하기</h2>
|
<h2>내 장면을 만들고 Camera에서 실행하기</h2>
|
||||||
@@ -145,7 +167,7 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="guide-section">
|
<section class="guide-section">
|
||||||
<div class="section-number">05</div>
|
<div class="section-number">06</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="eyebrow">Localization & compute</p>
|
<p class="eyebrow">Localization & compute</p>
|
||||||
<h2>알고리즘, 속도와 격자 선택</h2>
|
<h2>알고리즘, 속도와 격자 선택</h2>
|
||||||
@@ -194,7 +216,7 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="guide-section" id="acoustic-model">
|
<section class="guide-section" id="acoustic-model">
|
||||||
<div class="section-number">06</div>
|
<div class="section-number">07</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="eyebrow">Acoustics & measured input</p>
|
<p class="eyebrow">Acoustics & measured input</p>
|
||||||
<h2>환경과 마이크 응답 선택</h2>
|
<h2>환경과 마이크 응답 선택</h2>
|
||||||
@@ -216,7 +238,7 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="guide-section" id="results">
|
<section class="guide-section" id="results">
|
||||||
<div class="section-number">07</div>
|
<div class="section-number">08</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="eyebrow">Result JSON</p>
|
<p class="eyebrow">Result JSON</p>
|
||||||
<h2>무엇이 저장되나요?</h2>
|
<h2>무엇이 저장되나요?</h2>
|
||||||
@@ -256,7 +278,7 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="guide-section" id="troubleshooting">
|
<section class="guide-section" id="troubleshooting">
|
||||||
<div class="section-number">08</div>
|
<div class="section-number">09</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="eyebrow">Troubleshooting</p>
|
<p class="eyebrow">Troubleshooting</p>
|
||||||
<h2>막혔을 때 확인할 것</h2>
|
<h2>막혔을 때 확인할 것</h2>
|
||||||
@@ -296,7 +318,7 @@
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="guide-section">
|
<section class="guide-section">
|
||||||
<div class="section-number">09</div>
|
<div class="section-number">10</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="eyebrow">Scope & privacy</p>
|
<p class="eyebrow">Scope & privacy</p>
|
||||||
<h2>현재 모델의 범위</h2>
|
<h2>현재 모델의 범위</h2>
|
||||||
@@ -320,6 +342,7 @@
|
|||||||
<a href="/apps/array-builder/README.md"><strong>Array Builder 설명서</strong><span>마이크 배치·프리셋·JSON</span></a>
|
<a href="/apps/array-builder/README.md"><strong>Array Builder 설명서</strong><span>마이크 배치·프리셋·JSON</span></a>
|
||||||
<a href="/apps/dataset-builder/README.md"><strong>Dataset Builder 설명서</strong><span>source·ambient·Preview WAV</span></a>
|
<a href="/apps/dataset-builder/README.md"><strong>Dataset Builder 설명서</strong><span>source·ambient·Preview WAV</span></a>
|
||||||
<a href="/apps/acoustic-camera/README.md"><strong>Camera 설명서</strong><span>backend·결과·비교</span></a>
|
<a href="/apps/acoustic-camera/README.md"><strong>Camera 설명서</strong><span>backend·결과·비교</span></a>
|
||||||
|
<a href="/docs/activity-detection.md"><strong>전 대역 활동 검출</strong><span>CFAR·spectral flux·alias 가설</span></a>
|
||||||
<a href="/docs/acoustic-model.md"><strong>음향 모델</strong><span>마이크 응답·반사·산란·회절</span></a>
|
<a href="/docs/acoustic-model.md"><strong>음향 모델</strong><span>마이크 응답·반사·산란·회절</span></a>
|
||||||
<a href="/docs/realtime-porting.md"><strong>실측 포팅</strong><span>block·streaming 위치추정 API</span></a>
|
<a href="/docs/realtime-porting.md"><strong>실측 포팅</strong><span>block·streaming 위치추정 API</span></a>
|
||||||
<a href="/docs/data-contracts.md"><strong>데이터 계약</strong><span>JSON Schema와 재현성</span></a>
|
<a href="/docs/data-contracts.md"><strong>데이터 계약</strong><span>JSON Schema와 재현성</span></a>
|
||||||
|
|||||||
@@ -6,7 +6,56 @@
|
|||||||
- 자유음장 직접음과 선택적 저비용 shoebox multipath
|
- 자유음장 직접음과 선택적 저비용 shoebox multipath
|
||||||
- zero-padded FFT 전달함수 기반 fractional sample delay와 마이크 주파수 응답
|
- zero-padded FFT 전달함수 기반 fractional sample delay와 마이크 주파수 응답
|
||||||
- radix-2 FFT, Hann STFT와 선택 bin 추출
|
- 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입니다.
|
||||||
|
<code>analyzeCfarActivity()</code>는 한 채널의 모든 complete Hann frame에 CA-CFAR 또는
|
||||||
|
OS-CFAR를 적용하고, <code>computeDixonSpectralFlux()</code>는 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를 <code>untested</code>로 남깁니다. Pfa는 IID
|
||||||
|
exponential 모델의 tested CUT 하나당 명목값입니다. Spectral flux는 모든 frame×full-DFT-bin
|
||||||
|
양의 차이와 raw ODF를 보존하며 peak picker는 별도 명시 호출입니다.
|
||||||
|
|
||||||
|
<code>estimateCfarActivityWorkload()</code>와
|
||||||
|
<code>estimateDixonSpectralFluxWorkload()</code>로 할당 전에 frame/bin/FFT 연산과 raw output
|
||||||
|
byte를 검사할 수 있습니다. 기본 상한을 넘으면 일부 frame, top-K bin 또는 축소 결과를
|
||||||
|
만들지 않고 실패합니다. 상세 수식과 문헌은
|
||||||
|
[전 대역 활동 검출 모델](../../docs/activity-detection.md)에 있습니다.
|
||||||
|
|
||||||
## Nyquist 초과 입력
|
## Nyquist 초과 입력
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,9 @@ Unit과 integration test가 같은 페이지에서 실행됩니다. WebGPU 장
|
|||||||
중복 좌표 차단, 표준 Array JSON 저장·재가져오기와 390px layout
|
중복 좌표 차단, 표준 Array JSON 저장·재가져오기와 390px layout
|
||||||
- `camera-ui.test.js`: Dedicated Worker CPU/WebGPU 실행, 취소, Result schema, rectangular/Fermat와
|
- `camera-ui.test.js`: Dedicated Worker CPU/WebGPU 실행, 취소, Result schema, rectangular/Fermat와
|
||||||
DAS/DAS-PHAT 비교, GCC-PHAT CPU·협대역 제약, Builder 새 탭과 Experiment 선로드·Scene
|
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, 재생 시간 증가와 일시정지
|
Auto→CPU fallback 뒤 공통 analysis plan 재사용, 복수 frame, scrub, 재생 시간 증가와 일시정지
|
||||||
- `workflow-ui.test.js`: Dataset Builder의 Scene JSON과 원본 assets를 Acoustic Camera에 넘겨
|
- `workflow-ui.test.js`: Dataset Builder의 Scene JSON과 원본 assets를 Acoustic Camera에 넘겨
|
||||||
Result JSON을 저장하는 end-to-end 흐름
|
Result JSON을 저장하는 end-to-end 흐름
|
||||||
|
|||||||
@@ -25,6 +25,12 @@ Unit과 integration module은 같은 browser runner에서 순서대로 실행됩
|
|||||||
선할당 제한, 0–1 score bound·scan 범위 불변성과 geometry/STFT/IFFT workspace 재사용
|
선할당 제한, 0–1 score bound·scan 범위 불변성과 geometry/STFT/IFFT workspace 재사용
|
||||||
- `localization.test.js`: 알고리즘 registry와 generic CPU/backend dispatcher, power/score
|
- `localization.test.js`: 알고리즘 registry와 generic CPU/backend dispatcher, power/score
|
||||||
의미, portable GCC-PHAT block·streaming 경로
|
의미, 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 경계 독립성,
|
- `realtime-localizer.test.js`: 기존 CPU DAS와 bit-exact map 동등성, chunk 경계 독립성,
|
||||||
bounded ring/result batch, 취소와 geometry·steering cache 연산 절감
|
bounded ring/result batch, 취소와 geometry·steering cache 연산 절감
|
||||||
- `builder.test.js`: Builder scene model, source/asset·trajectory 조작, 오디오 크기와 WAV 사전 검증
|
- `builder.test.js`: Builder scene model, source/asset·trajectory 조작, 오디오 크기와 WAV 사전 검증
|
||||||
|
|||||||
Reference in New Issue
Block a user