440 lines
26 KiB
Markdown
440 lines
26 KiB
Markdown
# 음향 환경과 마이크 응답 모델
|
||
|
||
micarrsim의 음향 합성은 마이크 어레이 배치와 위치추정 알고리즘의 상대 성능을 빠르게 비교하기
|
||
위한 모델이다. ADC나 마이크 전자회로까지 재현하는 하드웨어 시뮬레이터가 아니며, 자유음장과
|
||
계산량이 제한된 실내 희소 경로 근사 중 하나를 선택한다.
|
||
|
||
## 신호 처리 범위
|
||
|
||
Snapshot 한 번의 처리 순서는 다음과 같다.
|
||
|
||
1. tone, noise 또는 audio asset으로 음원 신호를 만든다.
|
||
2. 음원과 각 마이크 사이의 직접음 또는 희소 multipath 전달함수를 만든다.
|
||
3. 마이크별 `sensitivityDb`, `phaseOffsetDeg`와 `frequencyResponse`를 수신 신호에 적용한다.
|
||
4. 합성된 동기식 다채널 신호를 STFT하고 `beamforming.algorithm`으로 선택한 위치 추정
|
||
알고리즘의 scan map을 계산한다.
|
||
5. 알고리즘에 맞게 알려진 마이크 응답을 보정하고 map의 peak와 평가 지표를 구한다.
|
||
|
||
Scene의 `acoustics`를 생략하거나 `model: "free-field"`로 지정하면 기존 직접음 결과를
|
||
유지한다. `model: "shoebox"`는 직육면체 방 안에서 경로 수가 제한된 근사를 추가한다.
|
||
|
||
## 자유음장
|
||
|
||
음원과 마이크 사이 거리 `r`, 음속 `c`에 대해 직접음의 지연은 `r / c`, 진폭은
|
||
최소 거리 clamp를 적용한 `1 / r`이다. 분수 sample 지연은 zero-padded FFT의 주파수 영역
|
||
위상 이동으로 계산한다.
|
||
|
||
이 모델은 반사가 거의 없는 조건의 기준선과 배열 자체의 aperture·형상·대역 효과를 비교할 때
|
||
적합하다.
|
||
|
||
## Shoebox 희소 경로 근사
|
||
|
||
`shoebox` 모델은 source–microphone 쌍마다 다음 경로만 만든다.
|
||
|
||
- 직접음 1개. 축 정렬 occluder와 교차하면 `transmissionDb`만큼 감쇠한다.
|
||
- 방의 여섯 면마다 최대 1개의 1차 image-source 반사.
|
||
- 반사 에너지의 일부를 0.2–2 ms의 결정적 지연으로 나누는 scattering 경로.
|
||
- 직접음을 막는 occluder마다 여덟 corner 중 최단 우회 거리로 만든 회절 경로 1개.
|
||
- `tapCount`로 수를 제한하고 RT60에 걸쳐 -60 dB로 감쇠하는 결정적 diffuse tail.
|
||
|
||
같은 Scene seed와 source/microphone id에서는 scattering과 tail이 재현된다. 모든 희소 경로는
|
||
source–microphone 쌍의 주파수 전달함수 하나로 먼저 합쳐지고 IFFT는 한 번만 수행된다. 경로 위상은
|
||
recurrence로 갱신하고 1,024 bin마다 다시 고정해 bin마다 삼각함수를 반복하지 않는다.
|
||
|
||
Scene JSON의 사용자 설정 예는 다음과 같다.
|
||
|
||
```json
|
||
{
|
||
"acoustics": {
|
||
"model": "shoebox",
|
||
"room": {
|
||
"min": [-3.0, -2.5, -0.5],
|
||
"max": [3.0, 2.5, 4.0]
|
||
},
|
||
"reflections": {
|
||
"order": 1,
|
||
"wallGainDb": -8,
|
||
"perWallDb": {
|
||
"zMin": -14
|
||
},
|
||
"scattering": 0.25
|
||
},
|
||
"diffuseReverb": {
|
||
"enabled": true,
|
||
"rt60Seconds": 0.4,
|
||
"gainDb": -20,
|
||
"tapCount": 6
|
||
},
|
||
"occluders": [
|
||
{
|
||
"id": "screen",
|
||
"min": [-0.4, -0.1, 0.6],
|
||
"max": [0.4, 0.1, 1.8],
|
||
"transmissionDb": -18,
|
||
"diffractionGainDb": -12
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
`room`은 shoebox에서 필수다. 정적 source, trajectory keyframe과 occluder는 room 안에 있어야
|
||
하며 occluder id는 중복될 수 없다. 사용자 설정에서도 마이크 좌표가 room 안에 놓이도록 구성해야
|
||
1차 반사가 생성된다.
|
||
|
||
## 라이브 창의 전파 지연과 이동 근사
|
||
|
||
라이브 frame의 출력 sample 구간을 `[S, E)`, 현재 quasi-static geometry에서 sampled
|
||
source–microphone 희소 경로의 최대 지연을 `Dsampled`라 하자. 전체 경로 최대 `Dall`은
|
||
tone tail의 도착 가능성 판정과 metadata에 별도로 보존한다. 합성기는 다음 순서로 frame을 만든다.
|
||
|
||
1. source trajectory를 출력 창 중앙 시각에서 한 번 샘플링한다.
|
||
2. `R = max(0, S - ceil(Dsampled × sampleRate))`를 sampled 방사 입력의 시작으로 정한다.
|
||
3. analytic tone은 `[S, E)` 크기의 마이크 channel에 원래 Scene의 절대 sample 위상으로 직접
|
||
경로를 더한다. tone에는 과거 sample buffer가 필요 없다.
|
||
4. noise와 asset은 `[R, E)` 방사 buffer와 source별 최대 지연의 zero-padded FFT를 만들고,
|
||
direct·reflection·scattering·diffraction·diffuse 전달함수를 적용한 IFFT의 `[S, E)` 부분만
|
||
crop 크기 마이크 channel에 더한다.
|
||
|
||
따라서 source가 `S` 전에 멈췄더라도 그 직접음·반사음·diffuse tail이 창 안에 도착하면 보존된다.
|
||
analytic tone뿐 아니라 deterministic noise index와 asset 재생 위치도 원래 절대 시간축을 유지한다.
|
||
`synthesis.windowing`과 live frame의 `signalStats.windowing`은 render/output sample, pre-roll,
|
||
전체/실제 render 최대 지연, geometry와 Doppler 정책을 기록한다.
|
||
source별 `sourceArrivals`는 각 midpoint path의 half-open 도착 sample 구간이 출력과 겹치는지와
|
||
겹친 path kind를 기록한다. live ground-truth 평가는 emission midpoint가 아니라
|
||
`arrivingSourceIds`를 사용하므로, 이미 멈춘 source의 tail을 false positive로 잘못 세지 않는다.
|
||
이 ID 집합은 위치 추정이 끝난 뒤 평가에만 쓰며 raw channel, STFT, steering이나 peak 검출에는
|
||
입력하지 않는다.
|
||
loop하지 않는 asset의 emission end는 선언 duration과 decoded channel duration 중 작은 값이다.
|
||
leading/trailing zero sample 내용은 검사하지 않는다.
|
||
|
||
다만 이는 moving wave equation 해법이 아니다. pre-roll 방사 시각의 retarded source 위치를 다시
|
||
구하지 않고 전체 render buffer에서 창 중앙 위치와 그 위치의 경로를 고정한다. 창 안의 연속 이동,
|
||
Doppler, 시간에 따라 변하는 reflection geometry도 모델링하지 않는다. 움직임이 경로 지연에 비해
|
||
크다면 frame 길이를 줄여 quasi-static 오차를 드러내고 수렴성을 확인해야 한다.
|
||
|
||
sampled asset/noise의 fractional delay와 microphone response는 zero-padded block FFT 전달함수다.
|
||
pre-roll은 현재 희소 **전파 경로**의 최대 지연을 보존하지만, 측정된 주파수 응답에서 무한하거나
|
||
임의 길이의 causal analog impulse response state를 복원하지 않는다. 또한 Scene이
|
||
`mix.normalization: peak`이면 live 합성은 각 출력 crop의 peak로 scale을 계산하므로 frame 간
|
||
절대 진폭 비교에는 `normalization: none`을 사용해야 한다.
|
||
|
||
마이크 출력은 처음부터 `[S,E)` 크기로만 할당하고 sampled source buffer·spectrum은 source
|
||
하나씩 처리한다. source별 경로 최대 지연을 `D_i`라 하면 unrelated far tone의 global
|
||
`Dmax`가 noise·asset FFT를 키우지 않는다. Experiment 검증과 runtime은 같은 estimator를 사용해
|
||
shoebox의 모든 실제 sparse path 지연을 포함한다. 현재 sampled source는 source–microphone
|
||
조합마다 IFFT 한 번을 수행하므로, source batching으로 IFFT 수를 줄이는 작업은 남아 있다.
|
||
|
||
## Camera 환경 preset과 비용
|
||
|
||
Camera의 **고급 설정 → 음향 환경**은 현재 geometry 전체가 들어가도록 room을 자동 추론하고 다음
|
||
preset을 적용한다.
|
||
|
||
| 선택 | 벽 gain | scattering | RT60 / tail gain / taps | 수신점당 최대 경로 |
|
||
| --- | ---: | ---: | ---: | ---: |
|
||
| 자유음장 | — | — | — | 1 |
|
||
| 흡음된 실내 | -14 dB | 0.15 | 0.2 s / -26 dB / 4 | 17 |
|
||
| 일반 실내 | -8 dB | 0.25 | 0.4 s / -20 dB / 6 | 19 |
|
||
| 반사 강한 실내 | -4 dB | 0.40 | 0.8 s / -14 dB / 10 | 23 |
|
||
|
||
표의 상한은 직접음 1개, 반사 6개, scattering 6개와 tail tap 수를 합한 값이다. 사용자 occluder는
|
||
각 source–microphone 직접 경로를 실제로 막을 때 하나씩 추가된다. 대략적인 합성 경로 예산은
|
||
`음원 수 × 마이크 수 × 수신점당 최대 경로`다. Camera는 실행 전에 이 예산을 표시한다.
|
||
|
||
반사·tail을 늘리면 신호 합성의 전달함수 누산도 늘어난다. DAS 계열의 scan 누산은 대략
|
||
`O(scan points × microphones × selected bins × STFT frames)`이고, GCC-PHAT는 pair별 상호
|
||
상관을 만든 뒤 `O(scan points × (microphones - 1) × bands)` lookup을 수행한다. 어느 방식이든
|
||
STFT와 거리 cache 비용은 별도로 필요하다. 처음에는 50×50 grid와 자유음장으로 기준선을 만들고,
|
||
같은 입력에서 환경과 알고리즘을 하나씩 바꾸어 비교하는 것이 좋다.
|
||
|
||
## 위치 추정 알고리즘
|
||
|
||
마이크 `m`, STFT frame `t`, 주파수 `f`의 복소 spectrum을 `X_m(t, f)`, scan point `p`와
|
||
마이크 사이 거리를 `r_m(p)`, 파수를 `k = 2πf/c`라고 하자. `φ_m(f)`는 알려진 마이크의 정적
|
||
phase offset과, 주파수 응답 보정을 켠 경우 response phase를 합한 값이다. 모든 map은 scan point
|
||
마다 하나의 비음수 상대값을 만들지만, 그 값은 위치의 확률이나 posterior가 아니다.
|
||
|
||
### DAS (`das`)
|
||
|
||
Conventional frequency-domain delay-and-sum은 각 후보점에서 구면파 전파 위상을 되돌려 채널을
|
||
coherent sum한다.
|
||
|
||
```text
|
||
B_DAS(p,t,f) = (1/M) Σ_m A_m⁻¹(f) X_m(t,f) exp(j[k r_m(p) - φ_m(f)])
|
||
P_DAS(p) = mean_(t,f) |B_DAS(p,t,f)|²
|
||
```
|
||
|
||
`A_m⁻¹(f)`에는 sensitivity의 역 gain과, 설정한 경우 frequency-response gain의 제한된 역보정이
|
||
들어간다. 구현은 frame별 제곱 크기를 먼저 평균하고 선택 band의 bin들을 다시 평균한다. 따라서
|
||
Result의 `rawMap.scale`은 `power`지만, 절대 SPL로 calibration한 power가 아니라 같은 입력·설정
|
||
안에서 비교하는 선형 상대 power다. CPU와 WebGPU를 지원한다.
|
||
|
||
### DAS-PHAT (`das-phat`)
|
||
|
||
DAS-PHAT는 steering 전에 각 frame·bin·마이크 spectrum을 위상만 남기도록 정규화한다.
|
||
|
||
```text
|
||
U_m(t,f) = X_m(t,f) / |X_m(t,f)|
|
||
S_DAS-PHAT(p) = mean_(t,f) |(1/M) Σ_m U_m(t,f) exp(j[k r_m(p) - φ_m(f)])|²
|
||
```
|
||
|
||
한 frame·bin에서 최강 마이크 크기의 기본 `10⁻⁶`배인 상대 floor 이하의 값은 `0`으로 두어
|
||
무음이나 극소값의 불안정한 위상을 제외한다. 입력과 calibration의 amplitude gain은 coherent sum에 사용하지 않고,
|
||
알려진 phase만 보정한다. 그 결과 source spectrum이나 채널 gain 차이에 덜 끌릴 수 있지만 유용한
|
||
amplitude 정보도 버리며, 약한 bin의 위상과 multipath에 민감할 수 있다. `rawMap.scale`은 무차원
|
||
`score`이고 CPU와 WebGPU를 지원한다.
|
||
|
||
### GCC-PHAT (`gcc-phat`)
|
||
|
||
현재 GCC-PHAT는 배열 중심에서 가장 먼 마이크 하나를 결정적인 reference로 고르고, reference와
|
||
나머지 `M - 1`개 마이크의 pair만 사용한다. 각 band와 pair에 대해 다음 PHAT cross spectrum을
|
||
STFT frame에 걸쳐 평균한다.
|
||
|
||
```text
|
||
C_mr(t,f) = X_m(t,f) conj(X_r(t,f))
|
||
G_mr(f) = mean_t [C_mr(t,f) / max(|C_mr(t,f)|, floor)]
|
||
× exp(j[φ_r(f) - φ_m(f)])
|
||
```
|
||
|
||
기본 `floor`는 해당 band·pair의 모든 선택 bin과 frame에서 얻은 최대 cross-spectrum 크기의
|
||
`10⁻⁶`배다. 이 floor는 amplitude를 score 가중치로 쓰기 위한 것이 아니라 극소 cross spectrum의
|
||
불안정한 위상 정규화를 제한한다.
|
||
|
||
선택 band 밖의 bin은 `0`으로 두고 켤레 대칭 spectrum을 IFFT하여 원형 상호상관
|
||
`R_mr,b(ℓ)`을 만든다. scan point마다 far-field 각도 근사가 아니라 정확한 거리 차이로 near-field
|
||
예측 lag를 계산한다.
|
||
|
||
```text
|
||
ℓ_mr(p) = [r_m(p) - r_r(p)] sampleRate / c
|
||
Q_b(p) = Σ_(m≠r) R_mr,b(ℓ_mr(p))
|
||
K_b = I(0 ∈ b) + I(N/2 ∈ b) + 2 × #(나머지 positive bins)
|
||
S_b(p) = clamp[N Q_b(p) / ((M-1) K_b), 0, 1]
|
||
```
|
||
|
||
분수 sample lag는 IFFT 원형 상호상관의 이웃 두 sample을 선형 보간한다. Hermitian coefficient
|
||
수 `K_b`, IFFT의 `1/N`, reference pair 수로 나눈 뒤 음의 상관은 0으로 두어 score를 0–1로
|
||
제한한다. 따라서 같은 위치 가설의 raw GCC score는 scan 범위나 마이크 수 자체에 의해 재척도화되지
|
||
않는다. 이 값도 확률이나 calibration된 confidence는 아니다. `rawMap.scale`은 `score`다.
|
||
PHAT가 amplitude를 제거하므로 sensitivity와 frequency-response gain은 역보정하지 않고 알려진
|
||
phase만 보정한다. 현재 CPU만 지원하고 두 개 이상의 마이크가 필요하다.
|
||
|
||
GCC-PHAT는 broadband 신호에서 상호상관 peak가 뚜렷할수록 유리하다. 단일 tone이나 지나치게 좁은
|
||
band는 주기적으로 같은 phase를 만드는 lag가 많아 여러 위치가 비슷한 score를 얻을 수 있고,
|
||
반사음이나 여러 동시 음원은 pair 상관 peak를 섞는다. IFFT 길이가 `N = fftSize`이면 표현 가능한
|
||
비중첩 원형 lag는 절대값 `N/2` sample까지다. 현재 구현은 scan 전체의 최대 기하학적 lag가 이를
|
||
넘으면 실행을 거절하므로 FFT를 키우거나 array aperture 또는 scan 범위를 줄여야 한다. 이 검사는
|
||
원형 lag alias를 막지만 좁은 대역의 주기적 모호성, 제한된 bandwidth, scan grid 양자화까지
|
||
해결하지는 않는다. 단일 reference 방식은 모든 마이크 쌍을 쓰는 GCC보다 계산량이 작지만 pair
|
||
중복성과 고장 마이크에 대한 강건성도 작다.
|
||
|
||
### Narrowband MUSIC (`music`)
|
||
|
||
현재 CPU MUSIC은 [Schmidt의 noise-subspace 방법](https://doi.org/10.1109/TAP.1986.1143830)을
|
||
근거리 구면파 direct-path manifold에 적용한다. 근거리 source localization의 관련 문헌은
|
||
[Huang–Barkat](https://doi.org/10.1109/8.86917)이다. 보정된 snapshot
|
||
`x(t)`로 mean subtraction 없는 sample covariance를 만든다.
|
||
|
||
```text
|
||
R = (1/T) Σ_t x(t) x(t)ᴴ
|
||
R v_j = λ_j v_j, λ_0 ≥ ... ≥ λ_(M-1)
|
||
q(p) = Σ_(j=K)^(M-1) |v_jᴴ a(p)|² / (a(p)ᴴ a(p))
|
||
```
|
||
|
||
`q`는 noise projection fraction이고 optimum은 minimum이다. UI/evaluation은 표준
|
||
pseudospectrum `P=1/q`를 scan 안에서 `P/Pmax`로 표시한다. `q_min>0`이면 이는
|
||
`q_min/q(p)`이고, `q_min=0`이면 정확한 zero 위치만 1로 표시한다. flat `q`는 모두 1로
|
||
표시하되 위치 peak는 만들지 않는다. `q`, `P`와 `P/Pmax`는 확률·posterior·confidence 또는
|
||
신뢰구간이 아니다.
|
||
|
||
Experiment band는 `Fs/N` grid에 놓인 아날로그 carrier 가설을 정확히 하나만 포함한다.
|
||
`f_a`를 그 center, signed ADC alias의 orientation을 `η = sign(f_s)`라 하면 공간 위상의
|
||
크기는 analog carrier `f_a`를 유지하고 `η`만 alias inversion 방향으로 사용한다.
|
||
|
||
```text
|
||
a_m(p) = H_m,residual(f_a) / max(r_m(p), d_min)
|
||
× exp[-j η 2π f_a (r_m(p)-r_0(p))/c + j φ_m,residual(f_a)]
|
||
```
|
||
|
||
`f_s<0`인 alias inversion에서는 positive-bin STFT coefficient, sensitivity/response 보정과
|
||
전체 complex manifold가 baseband 가설의 켤레 방향이 된다. microphone frequency response는
|
||
관측 bin이 아니라 사용자가 지정한 `f_a`에서 평가한다. 이 가설은 Experiment에서 오며 Scene
|
||
source frequency·position truth는 covariance, K 선택이나 scan에 사용하지 않는다. 같은 ADC
|
||
bin의 다른 alias order는 별도 band로 명시해야 하고 자동 선택하지 않는다. 정확한 DC와 Nyquist는
|
||
실수 sequence에 독립 quadrature가 없어 거부한다.
|
||
|
||
K는 사용자가 고정하거나 [Wax–Kailath AIC/MDL](https://doi.org/10.1109/TASSP.1985.1164557)로
|
||
선택한다. AIC/MDL은 비중첩 complete snapshot, `T>M`, roundoff보다 엄격히 큰 noise eigenvalue가
|
||
필요하고 IID complex Gaussian snapshot, spatially white noise, 창 동안 일정한 source 수를
|
||
가정한다. 비중첩 자체는 통계적 독립성의 증명이 아니며 criterion은 확률이나 confidence가 아니다.
|
||
가정/수치 조건이 깨지면 typed `MUSIC_UNAVAILABLE` 오류를 내고 fixed K로 fallback하지 않는다.
|
||
|
||
같은 주파수의 coherent source는 signal covariance rank를 잃을 수 있다. eigengap이 수치 audit
|
||
bound보다 작으면 subspace를 임의 분할하지 않는다. diagonal loading, eigenvalue floor, spatial
|
||
smoothing, band 간 association·평균·maximum fusion은 없다. 배열의 spatial alias/grating lobe,
|
||
동률과 flat objective도 결과를 좋게 보이도록 제거하지 않는다.
|
||
[Wax–Shan–Kailath broadband eigenstructure 방법](https://doi.org/10.1109/TASSP.1984.1164400)은
|
||
알려진 별도 알고리즘이지만 현재 구현하지 않았다.
|
||
|
||
## 샘플링, Nyquist와 alias
|
||
|
||
Scene의 `sampleRate`는 모든 마이크가 동시에 동작하는 이상적 real-valued ADC의 sampling rate다.
|
||
현재 모델에는 analog anti-alias filter가 없다. 따라서 tone 주파수는 Nyquist를 넘어도 허용되며,
|
||
관측 주파수는 다음 signed baseband 주파수로 접힌다. 정확한 Nyquist tie는 `+Fs/2`로
|
||
표준화하지만 `+Fs/2`와 `-Fs/2`는 같은 real sample sequence다.
|
||
|
||
```text
|
||
f_wrapped = f_analog mod Fs, 0 <= f_wrapped < Fs
|
||
f_signed = f_wrapped if f_wrapped <= Fs/2
|
||
f_wrapped - Fs otherwise
|
||
f_adc = |f_signed|
|
||
```
|
||
|
||
`f_signed < 0`이면 one-sided positive spectrum이 반전된다. 정확히 DC나 Nyquist에 접힌 tone은
|
||
quadrature 정보가 소실되는 퇴화점이다. Camera는 이를 오류로 숨기지 않고 source 요약, band legend와
|
||
Result `signalStats.sampling`에 원 주파수·signed ADC 주파수·반전 여부와 DC/Nyquist
|
||
위상 퇴화 여부를 기록한다.
|
||
|
||
공간 전파는 alias 주파수로 바꾸지 않는다. 합성기는 각 path의 원래 analog 주파수
|
||
`2π f_analog τ`로 지연 위상과 해당 주파수의 microphone response를 적용한 뒤 ADC 시각에서
|
||
sampling한다. 이 순서를 뒤집으면 fractional path delay의 센서 간 위상이 틀리므로, tone은
|
||
mic/path별 analytic phasor와 시작·종료 event로 합성한다.
|
||
|
||
Experiment band도 Nyquist 위 값을 허용한다. 요청 주파수 구간의 모든 등가 one-sided real-FFT
|
||
bin **center**를 접어 선택하며, 일부 alias 후보를 골라 버리지 않는다. 이 선택은 brick-wall
|
||
대역 필터가 아니다. 유한 Hann window의 off-grid leakage는 인접 bin에도 남는다. 현재
|
||
DAS·DAS-PHAT는 양의 ADC bin 주파수로 구면 steering하고, GCC-PHAT는 선택 bin으로 제한한
|
||
기하 lag correlation을 수행한다. 어느 쪽도 원래 alias order를 이용해 결과가 좋아지도록
|
||
보정하지 않는다.
|
||
따라서 초과 주파수에서 peak가 틀어지거나 grating lobe·동률 peak가 나타나는 것이 정상적인 설계
|
||
결과일 수 있다. Result의 band별 `frequencyObservation`은 1-based Nyquist zone별 연속 fold
|
||
segment, 반전·alias order, 실제 ADC bin center, 연속/FFT-grid many-to-one 여부와
|
||
alias-equivalent band ID를 보존한다. 같은 `adcBinSetKey`를 가진 band는 독립 관측이 아니다.
|
||
|
||
정확한 Nyquist 경계에서 `+Fs/2`와 `-Fs/2`는 실수 sampling sequence가 동일하다.
|
||
단일 주파수 provenance는 이를 `+Fs/2`로 canonicalize하지만, `foldSegments`의
|
||
`signedAdcStartHz`/`signedAdcEndHz`는 각 zone을 따라가는 방향을 보존하므로 반전 zone
|
||
시작점이 `-Fs/2`로 나타날 수 있다. 경계를 가로지르는 두 segment의 `+Fs/2`와
|
||
`-Fs/2` endpoint는 두 관측이나 두 FFT bin이 아니라 같은 phase-degenerate Nyquist
|
||
sample을 양쪽 zone에서 표현한 것이다.
|
||
|
||
같은 이유로 DAS·DAS-PHAT·GCC-PHAT의 선택적 microphone-response 역보정은 관측 ADC bin에서
|
||
평가한다. Forward tone 합성은 원 analog 주파수의 응답을 사용하므로 이 세 알고리즘은 Nyquist 위
|
||
carrier를 아는 alias-aware 알고리즘처럼 동작하지 않는다. MUSIC만 예외로, 사용자가 band에
|
||
명시한 단일 아날로그 FFT-grid 가설에서 response와 signed complex manifold를 계산한다. 이는
|
||
Scene truth를 읽거나 가능한 alias order를 자동 탐색하는 것이 아니다.
|
||
|
||
서로 다른 analog tone이 같은 ADC bin으로 접히면 **단일 channel의 시간 sample만으로는**
|
||
원 주파수를 구별할 수 없다. 그러나 이 합성기는 원 analog 파장의 센서 간 위상을 보존하므로,
|
||
충분히 촘촘하고 보정된 다채널 array에는 carrier order를 판별할 공간 위상 증거가 남을 수 있다.
|
||
현재 DAS·DAS-PHAT·GCC-PHAT는 carrier hypothesis를 열거하는 알고리즘이 아니므로 이를 복원하지
|
||
않고 Result에 `aliasOrderResolution: not-attempted`로 기록한다. MUSIC은 band 하나에 사용자가
|
||
고른 가설 하나만 계산해 `configured-single-hypothesis`로 기록하며, 후보 중 승자를 고르지 않는다.
|
||
여러 order를 비교하려면 각각 독립 band로 명시해야 한다.
|
||
audio asset과 noise는 이미 sampling된 baseband 신호로 취급하므로 파일에 없는 Nyquist 위 analog
|
||
spectrum을 만들어 내지 않는다.
|
||
|
||
Tone과 band의 현재 검증 범위는 0–1 MHz다. 이는 Nyquist 제한이 아니라 JavaScript
|
||
IEEE-754 위상 정밀도, 마이크 응답 계약과 현재 희소 경로 모델을 함께 검증한 수치 범위다.
|
||
더 높은 carrier가 필요하면 단순히 상한을 제거하지 말고 phase reduction과 microphone model을
|
||
그 범위에서 다시 검증해야 한다.
|
||
|
||
## 마이크 주파수 응답
|
||
|
||
각 마이크에는 2–64개의 측정점을 지정할 수 있다. `frequencyHz`는 0–1,000,000 Hz에서
|
||
중복 없이 오름차순이어야 하며 `gainDb` 범위는 -120–120 dB, 선택적 `phaseDeg` 범위는
|
||
-180–180°다.
|
||
|
||
```json
|
||
{
|
||
"id": "mic-001",
|
||
"position": [-0.225, 0.225, 0],
|
||
"sensitivityDb": 0.6,
|
||
"phaseOffsetDeg": -1.5,
|
||
"frequencyResponse": [
|
||
{ "frequencyHz": 100, "gainDb": -8.0, "phaseDeg": -12 },
|
||
{ "frequencyHz": 1000, "gainDb": -0.7, "phaseDeg": -2 },
|
||
{ "frequencyHz": 8000, "gainDb": 2.1, "phaseDeg": 7 },
|
||
{ "frequencyHz": 20000, "gainDb": -5.0, "phaseDeg": 20 }
|
||
]
|
||
}
|
||
```
|
||
|
||
측정점 사이 gain dB와 phase는 선형 보간한다. phase는 ±180° 경계에서 가장 짧은 방향으로
|
||
보간하고 측정 범위 밖에서는 가장 가까운 끝점 값을 유지한다. 합성기는 이 curve를 실제 마이크
|
||
채널에 적용한다.
|
||
|
||
합성기는 알고리즘과 무관하게 sensitivity, 정적 phase offset과 frequency-response curve를 수신
|
||
channel에 적용한다. 위치 추정에서의 역보정은 알고리즘별로 다르다.
|
||
|
||
Tone에는 원 analog carrier에서 보간한 하나의 complex response를 정상상태 phasor로 적용한다.
|
||
따라서 지속 sinusoid의 gain/phase 비교에는 맞지만, hard-gated 시작·종료에서 실제 analog
|
||
마이크 필터가 만드는 ringing이나 frequency-dependent transient까지 계산하는 full LTI filter
|
||
모델은 아니다. 이 근사를 ADC를 포함한 완전한 하드웨어 시뮬레이션으로 해석하지 않는다.
|
||
|
||
- DAS는 sensitivity 역 gain과 정적 phase를 항상 보정한다. `compensateFrequencyResponse`를
|
||
생략하거나 `true`로 두면 response의 역 gain과 phase도 보정한다. 응답 notch의 무제한 gain
|
||
boost는 noise까지 키울 수 있으므로 `maxCompensationDb`로 제한하며 기본값은 24 dB, 허용 범위는
|
||
0–120 dB다. 응답 peak를 줄이는 attenuation과 phase 보상에는 이 boost 상한을 적용하지 않는다.
|
||
- DAS-PHAT와 GCC-PHAT는 amplitude를 정규화하므로 sensitivity와 response gain의 역보정을
|
||
사용하지 않는다. 정적 phase는 항상 보정하고, `compensateFrequencyResponse`가 `true`이면 알려진
|
||
response phase도 보정한다. 따라서 `maxCompensationDb`는 두 PHAT 알고리즘의 score에는 영향을
|
||
주지 않는다.
|
||
|
||
```json
|
||
{
|
||
"beamforming": {
|
||
"algorithm": "das",
|
||
"backend": "auto",
|
||
"minimumDistance": 0.01,
|
||
"normalization": "peak",
|
||
"dynamicRangeDb": 45,
|
||
"compensateFrequencyResponse": true,
|
||
"maxCompensationDb": 24
|
||
}
|
||
}
|
||
```
|
||
|
||
Camera의 **마이크 주파수 응답 처리**에서 **측정 curve 적용 + 보정하지 않음**을 고르면 합성에는
|
||
curve가 남고 위치 추정의 response gain/phase 역보정만 꺼진다. DAS-PHAT와 GCC-PHAT는 여전히
|
||
amplitude를 버리지만, curve가 신호 대 잡음과 relative floor 통과 여부에 준 영향까지 되돌리지는
|
||
못한다. 같은 배열에서 알려진 response 보정 유무의 robustness를 비교할 때 사용한다. curve가 없는
|
||
마이크는 0 dB, 0°로 취급한다.
|
||
|
||
## 결과에서 확인할 값
|
||
|
||
Result `signalStats`에는 다음 선택 필드가 들어간다.
|
||
|
||
- `acousticModel`: `free-field` 또는 `shoebox`
|
||
- `acousticPathCount`: 실제 합성에 사용한 전체 경로 수
|
||
- `acousticPathCounts`: `direct`, `reflection`, `scattering`,
|
||
`diffraction`, `diffuse` 종류별 수
|
||
|
||
같은 입력과 seed에서 환경 preset만 바꿨다면 이 값과 위치 오차·precision/recall·PSR을 함께
|
||
비교할 수 있다.
|
||
|
||
Result 최상위 `algorithm`은 실제 실행한 `das`, `das-phat`, `gcc-phat` 또는 `music`을 기록한다.
|
||
band의 `rawMap.scale`은 DAS에서 `power`, 두 PHAT 방식에서 `score`, MUSIC에서
|
||
`noise-projection`이다. MUSIC Result는 `musicModel`과 band별 `musicDiagnostics`에 아날로그
|
||
가설, alias inversion, covariance/EVD audit와 K 선택 가정을 기록한다. 표시 변환은 어느 scale도
|
||
확률분포나 신뢰구간으로 바꾸지 않는다.
|
||
|
||
## 정확도 범위와 제외 사항
|
||
|
||
이 구현은 FDTD/FEM/BEM이나 room impulse response 측정치를 대신하지 않는다. 다음 항목은
|
||
계산하지 않는다.
|
||
|
||
- 파동 방정식과 고차 반사
|
||
- 재질별 주파수 의존 흡음과 복잡한 mesh 산란
|
||
- edge 형상·파장에 따른 물리 회절
|
||
- 음원과 마이크 지향성, 바람, Doppler
|
||
- 절대 음압/SPL, 마이크 self-noise와 비선형 왜곡
|
||
- preamp, anti-alias filter, ADC quantization, channel clock jitter·drift
|
||
- 실제 장착 구조와 마이크 위치 공차
|
||
|
||
따라서 preset의 RT60이나 wall gain은 특정 방을 인증하는 값이 아니라 배열과 위치 추정 알고리즘이
|
||
multipath에 얼마나 민감한지 비교하는 조건이다. 실제 장치 성능을 평가할 때는 같은
|
||
Array/scan/band 설정으로
|
||
동기식 실측 채널을 [실시간 위치추정 코어](realtime-porting.md)에 입력하고 합성 결과와 나란히
|
||
비교해야 한다. 주파수 응답 curve만으로 noise floor, distortion, ADC와 clock 오차까지 모사되지는
|
||
않는다.
|