Files
micarrsim/apps/acoustic-camera/README.md
T

7.7 KiB
Raw Blame History

Acoustic Camera

Scene과 마이크 배열로 자유음장 microphone signal을 합성하고, STFT와 conventional DAS를 통해 주파수 대역별 acoustic map과 ground-truth 평가 지표를 만드는 브라우저 앱입니다.

열기와 기본 예제

저장소의 start.cmd를 실행한 뒤 시작 화면에서 Acoustic Camera를 선택하거나 http://127.0.0.1:4173/apps/acoustic-camera/을 엽니다. index.html을 직접 열지 마세요.

가장 빠른 확인 방법은 다음과 같습니다.

  1. 기본 fixture가 준비될 때까지 기다립니다.
  2. 192채널 rectangular 배열, single-tone scene과 50×50 grid를 그대로 둡니다.
  3. 기본 예제 실행을 누릅니다.
  4. 완료 후 overlay, 위치 오차와 timing을 확인하고 Result JSON을 저장합니다.

이동 장면을 바로 보려면 이동 예제 → 라이브 준비 → 재생 순서로 누릅니다. 기본 예제는 24×18 grid와 2 Hz map rate를 사용해 CPU fallback에서도 준비량을 줄였습니다.

사용자 입력 불러오기

문서는 다음 순서로 불러오는 것이 안전합니다.

  1. Scene: .scene.json
  2. Array: 선택 사항인 .array.json; 또는 비교 배열 preset 사용
  3. Experiment: 선택 사항인 .experiment.json
  4. Assets: Scene이 참조하는 원본 이미지와 오디오

Scene을 불러오면 현재 Experiment의 sceneId와 scan plane을 Scene에 맞추고 기존 asset 연결을 해제합니다. Array를 불러오면 현재 Experiment의 arrayId를 맞춥니다. 별도 Experiment는 현재 Scene과 Array를 참조해야 하므로 마지막에 불러오세요.

Scene JSON에는 원본 파일 byte가 없습니다. Assets에서 Builder에 사용한 파일을 다시 선택하면 Camera가 SHA-256을 계산해 manifest에 연결합니다. 같은 이름이라도 내용이 바뀌면 거절됩니다. 브라우저를 다시 열거나 Scene을 바꿀 때도 재선택해야 합니다.

  • asset 한 파일: 최대 128 MiB
  • 연결된 asset 합계: 최대 512 MiB
  • decode되어 메모리에 유지되는 오디오 합계: 최대 192 MiB

파일은 외부로 업로드되지 않고 브라우저 메모리에서만 처리됩니다.

Backend 선택

  • Auto (GPU→CPU): 권장. WebGPU를 먼저 시도하고 adapter/device 부재나 지원되는 장치 한계가 있으면 CPU로 계속합니다.
  • WebGPU 강제: GPU만 사용하며 운용 오류가 나도 CPU로 fallback하지 않습니다.
  • CPU 강제: CPU 수치 기준이나 WebGPU가 없는 환경에서 사용합니다.

WebGPU가 감지돼도 실제 장치는 실행 시 확인합니다. 계산 중 계산 취소를 누르면 Worker를 종료하며, 이미 완료된 이전 결과가 있으면 그대로 남습니다.

Grid, STFT와 대역

50×50은 2,500 points입니다. 이를 1로 보면 100×100은 4배, 200×200은 16배 points를 계산합니다. 처음에는 50×50을 권장합니다. 실행량은 microphone 수, scene 길이, FFT/hop과 선택 band의 bin 수에도 비례하므로 실제 시간 배율은 장치마다 다릅니다.

각 band는 id, 최소/최대 Hz와 overlay 색을 가집니다. Nyquist를 넘거나 겹치는 id 등 계약 오류는 실행 전에 표시됩니다. 현재 후처리는 raw DAS만 지원하며 DAMAS와 CLEAN-SC 항목은 비활성화되어 있습니다.

**Peak 검출 임계값 (%)**은 최강 local peak의 power에 대한 상대 임계값이며 Experiment JSON에 저장됩니다. 기본 25%에서 약한 두 번째 음원이 빠지면 10–20%로 낮추세요. 낮은 값은 더 약한 후보를 살리는 대신 sidelobe를 음원으로 잘못 고를 가능성도 높입니다. 같은 대역의 두 음원이 main lobe 폭보다 가깝다면 grid만 키우거나 threshold를 낮춰도 conventional DAS map에서 하나로 합쳐질 수 있습니다.

화면과 배열 비교

  • acoustic overlay의 투명도와 표시할 band를 선택할 수 있습니다.
  • Ground truth를 켜면 source 위치와 검출 peak를 비교할 수 있습니다.
  • 빔 분포는 peak 주변 half-power lobe의 power 가중 공분산을 1× RMS 점선과 2× RMS 영역으로 표시합니다. 위치 확률, Gaussian 신뢰구간 또는 측정 불확실성 보정값은 아닙니다.
  • rectangular와 Fermat spiral preset을 같은 Scene/Experiment에서 연속 실행하면 배열 비교 기록에 backend, timing과 평가 요약이 남습니다.
  • 입력을 바꾼 뒤 화면에 남은 결과는 이전 실행 snapshot이며 UI가 이전 설정 결과임을 표시합니다.
  • Camera에서 거리·음속·seed를 바꾼 Scene과 scan·STFT·band를 바꾼 Experiment는 우측의 각 JSON 저장 버튼으로 보존할 수 있습니다.
  • 전체 기록 JSON은 세션에 남은 모든 배열 비교 요약을 micarrsim.comparison-history 문서로 저장합니다.

미저장 Scene·Experiment·Result·비교 기록은 우측 저장 상태에 표시됩니다. 직전 Result를 저장하지 않고 새 실행을 시작하면 교체 여부를 확인하며, 미저장 항목이나 실행 중 계산이 있는 상태에서 페이지를 닫으면 브라우저가 한 번 더 확인합니다.

이동 음원 라이브

Scene source에 두 개 이상의 trajectory keyframe이 있으면 라이브 준비가 활성화됩니다. Builder에서는 시간에 따라 음원 이동과 경로 미리보기 slider로 이 데이터를 만들 수 있습니다.

  1. Map rate와 backend를 선택합니다. 처음에는 2 Hz와 Auto를 권장합니다.
  2. 라이브 준비를 누릅니다. 현재 입력 snapshot을 최대 48개, map당 최대 2,500 points의 짧은 분석창으로 계산합니다.
  3. 재생 또는 시간 slider로 이동합니다. Heatmap은 이웃한 acoustic map 사이를 보간하고 source 위치는 keyframe 사이를 연속 보간합니다.

각 시간창은 sample 경계에 맞추며 tone 위상, 결정적 noise index와 audio asset의 재생 위치를 원래 Scene 시간에 이어 붙입니다. 한 창 안에서는 중앙 시각의 위치를 고정하는 준정적 근사이므로 Doppler, 창 내부 연속 경로 변화와 실제 마이크 스트림은 지원하지 않습니다. 실제 192채널 장치를 연결하려면 장치의 channel 순서, sample 형식, clock와 전송 API에 맞춘 capture adapter가 별도로 필요합니다.

Result JSON

Result JSON은 검증을 통과한 micarrsim.result 문서만 저장합니다.

  • experimentId, arrayId, sceneId, createdAt, 실제 backend
  • 실행 입력 전체의 canonical SHA-256인 inputHash
  • signalStats: 정규화 전 peak, 적용 scale, clipped sample 수
  • timingMs: 전체, signal generation과 beamforming 시간
  • band별 rawMap 선형 power, displayMap, 검출 peaks
  • 각 peak의 비보정 half-power 공분산과 RMS ellipse인 beamSpread
  • 평가 설정과 peakToSidelobeDb, energyInsideTruthRatio, precision, recall, mainLobeWidthM

Tone source는 그 주파수가 band 범위 안에 있을 때만 해당 band의 ground truth입니다. Audio asset과 noise source는 스펙트럼을 사전에 판별하지 않으므로 모든 band의 ground truth로 평가합니다. Source z가 scan z와 다르면 평면에 투영한 x/y를 사용하므로 UI 경고와 위치 오차를 함께 해석하세요.

해석 한계

신호 모델은 직접 경로와 거리 감쇠를 사용하는 자유음장입니다. 반사, 잔향, 회절, 차폐, 바람, 센서 비선형과 장착 구조는 포함하지 않습니다. 배열 JSON의 sensitivity/phase calibration은 적용하지만 결과는 상대 배열 비교와 알고리즘 검증용이며 실측 인증을 대신하지 않습니다.

WebGPU 성능을 별도로 측정하려면 서버 실행 후 http://127.0.0.1:4173/benchmarks/webgpu-scaling.html을 여세요.