docs: explain receive beam pattern workflow
This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
# 마이크 어레이 수신 빔 패턴
|
||||
|
||||
Array Builder의 **수신 빔 패턴**은 현재 마이크 좌표에 conventional delay-and-sum을 적용했을 때의
|
||||
narrowband far-field array factor를 360° polar 단면으로 보여줍니다. 마이크는 송신원이 아니므로
|
||||
엄밀히는 방사 패턴이 아니라 **수신 응답**입니다.
|
||||
|
||||
## 가장 짧은 사용법
|
||||
|
||||
1. Array Builder에서 마이크 배치를 만들거나 Array JSON을 엽니다.
|
||||
2. 배열 canvas 아래의 **수신 빔 패턴**을 펼칩니다.
|
||||
3. 실제 음향파의 **아날로그 주파수**와 음속을 입력합니다.
|
||||
4. XZ, YZ 또는 XY 360° 절단면과 조향각을 고릅니다.
|
||||
5. 기본 **자동 · 위상 간격 기준**을 사용하고, 계산량 비교가 필요할 때만 고정 표본 수를 고릅니다.
|
||||
6. polar 선, 조향 응답, 조건부 −3.0103 dB 폭과 sampled local maxima를 함께 읽습니다.
|
||||
|
||||
마이크를 드래그하는 동안에는 최대 720개 각도의 가벼운 preview를 표시합니다. 마우스나 pointer를
|
||||
놓으면 선택한 표본 설정으로 다시 계산합니다. 빔 패턴 설정은 배열 좌표가 아니므로 undo history,
|
||||
저장되지 않은 변경 상태와 Array JSON에는 들어가지 않습니다.
|
||||
|
||||
## 물리식과 좌표
|
||||
|
||||
마이크 위치 <code>r_m</code>, 배열 중심 <code>r_c</code>, array→source 방향 단위벡터
|
||||
<code>u</code>, 조향 방향 <code>u0</code>, 아날로그 주파수 <code>f</code>, 음속
|
||||
<code>c</code>에 대해 표시하는 complex receive array factor는 다음입니다.
|
||||
|
||||
<code>B(u) = (1/M) Σ_m exp[j (2πf/c) (u-u0)·(r_m-r_c)]</code>
|
||||
|
||||
<code>1/M</code>은 sampled maximum에 맞춘 사후 정규화가 아니라 고정 conventional
|
||||
delay-and-sum weight입니다. 따라서 조향 방향은 이상적 모델에서 1이고, 같은 0 dB 응답이 여러
|
||||
방향에 있으면 모두 그대로 남습니다. Array Builder는 <code>|B|²</code>와
|
||||
<code>10 log10(|B|²)</code>를 계산하며, polar 표시 하한만 별도 clamp합니다. 표시 하한을 바꿔도
|
||||
raw complex, power, peak 또는 HPBW 계산은 바뀌지 않습니다.
|
||||
|
||||
절단면 각도는 오른손 Array 좌표계에서 다음과 같습니다.
|
||||
|
||||
| 절단면 | 0° | +90° | 의미 |
|
||||
| --- | --- | --- | --- |
|
||||
| XZ | +Z | +X | 기본. XY 평면 배열의 broadside와 x축 단면 |
|
||||
| YZ | +Z | +Y | XY 평면 배열의 broadside와 y축 단면 |
|
||||
| XY | +X | +Y | 배열 평면 안의 edge 방향 단면 |
|
||||
|
||||
polar plot은 0°를 오른쪽, +90°를 위쪽에 그립니다. 각 plot은 구면 전체가 아니라 하나의
|
||||
great-circle 단면입니다. 임의 3D 배열을 세 단면만으로 완전히 평가할 수는 없습니다.
|
||||
|
||||
## 모델에 들어가는 것과 빠지는 것
|
||||
|
||||
현재 array factor는 다음 조건을 명시적으로 고정합니다.
|
||||
|
||||
- analog monochromatic narrowband 가설
|
||||
- 자유장의 far-field plane wave
|
||||
- 위치만 가진, 이상적으로 보정된 무지향성 point microphone
|
||||
- uniform conventional delay-and-sum weight
|
||||
- meter 좌표와 사용자가 입력한 음속
|
||||
|
||||
따라서 방 반사·회절·산란, near-field 거리와 구면 감쇠, baffle·housing·상호결합, 마이크의 각도별
|
||||
element directivity는 포함하지 않습니다. Array JSON의 <code>sensitivityDb</code>,
|
||||
<code>phaseOffsetDeg</code>와 <code>frequencyResponse</code>도 이 geometry-only plot에는
|
||||
섞지 않습니다. 이 보정들은 합성 및 위치추정 pipeline에서 별도로 적용됩니다. 주파수 응답은
|
||||
주파수별 channel transfer이고, 그 자체가 각도별 element pattern은 아닙니다.
|
||||
|
||||
## Nyquist와 공간 alias
|
||||
|
||||
이 계산에는 ADC sample rate 입력이 없습니다. 파수는 항상 원래 아날로그 주파수로
|
||||
<code>k=2πf/c</code>를 계산하며, 48 kHz ADC를 가정했을 때 Nyquist를 넘는 49,125 Hz 같은 값도
|
||||
1,125 Hz로 접지 않습니다. 이는 배열 설계에서 실제 파장과 grating/ambiguity를 관찰하기 위한
|
||||
의도된 동작입니다.
|
||||
|
||||
ADC의 temporal alias, anti-alias filter와 signed alias orientation은 sampling 단계의 문제입니다.
|
||||
마이크 간격·파장·조향이 만드는 spatial alias와는 별개입니다. 이 plot은 sampled local maximum을
|
||||
보여줄 수 있지만, 그것을 자동으로 grating lobe나 sidelobe로 분류하지 않습니다. planar 배열의
|
||||
앞·뒤 0 dB 동률처럼 서로 다른 원인도 같은 단면 응답으로 나타날 수 있기 때문입니다.
|
||||
|
||||
## HPBW와 각도 해상도
|
||||
|
||||
HPBW는 조향 방향을 포함하는 연결 lobe에서 raw power가 정확히 0.5, 즉 −3.010299956… dB가 되는
|
||||
양쪽 crossing을 찾았을 때만 표시합니다. 표본 두 점이 crossing을 bracket하면 raw analytic
|
||||
evaluator로 각 경계를 48회 이분합니다.
|
||||
|
||||
고주파·큰 aperture에서는 고정 각도 grid가 매우 좁은 lobe나 dip을 건너뛸 수 있습니다. 이를 숨기지
|
||||
않기 위해 투영된 최대 microphone baseline <code>D</code>, 각도 간격
|
||||
<code>Δ=2π/N</code>에 대한 인접 방향 pair phase 변화 상한
|
||||
<code>2 k D sin(Δ/2)</code>를 계산합니다. 현재 metric 해석 기준은 이 상한이
|
||||
<code>π/8</code> 이하인 경우입니다.
|
||||
|
||||
이 기준은 공개된 수치 해상도 정책이지, 모든 연속 lobe와 half-power excursion을 검출한다는
|
||||
수학적 증명이 아닙니다. 기준을 넘으면 raw polar 표본은 그대로 표시하되 HPBW와 peak 해석을
|
||||
<code>resolution-unresolved</code>로 보류합니다. 기준을 만족해도 half-power crossing을 표본에서
|
||||
찾지 못한 비상수 패턴은 360° HPBW라고 만들지 않고
|
||||
<code>no-sampled-half-power-crossing</code>으로 남깁니다. 단일 또는 절단면 투영 좌표가 모두 같은
|
||||
배열만 analytic constant로 판정하고 폭을 <code>null</code>로 반환합니다.
|
||||
|
||||
자동 표본은 최소 720개에서 시작해 이 phase-step 기준에 맞게 늘어나며 최대 14,400개와 전체 phasor
|
||||
평가 상한을 지킵니다. 상한에서도 기준을 만족하지 못하면 계산을 예쁘게 보이도록 평활화하거나
|
||||
peak를 제거하지 않고 미확정 상태를 표시합니다.
|
||||
|
||||
## portable API
|
||||
|
||||
<code>beam-pattern.js</code>는 DOM, Scene, ADC와 외부 package에 의존하지 않는 ES module입니다.
|
||||
|
||||
~~~js
|
||||
import { computeReceiveBeamPattern } from "./packages/acoustics-core/beam-pattern.js";
|
||||
|
||||
const pattern = computeReceiveBeamPattern({
|
||||
array,
|
||||
frequencyHz: 49_125,
|
||||
speedOfSound: 343,
|
||||
cut: "xz",
|
||||
steeringAngleDeg: 0,
|
||||
sampleCount: "auto",
|
||||
dbFloor: -60,
|
||||
});
|
||||
|
||||
drawPolar(pattern.anglesDeg, pattern.displayDb);
|
||||
|
||||
if (!pattern.angularSampling.metricResolutionSatisfied) {
|
||||
showUnresolved(pattern.angularSampling.maximumAdjacentPhaseStepRadBound);
|
||||
}
|
||||
~~~
|
||||
|
||||
결과는 normalized raw <code>responseReal</code>, <code>responseImaginary</code>,
|
||||
<code>responsePower</code>, <code>responseLinear</code>, unclamped <code>responseDb</code>와
|
||||
표시용 <code>displayDb</code>를 각각 보존합니다. workload에는 baseline pair 비교, sampled phasor,
|
||||
HPBW용 최대·실제 평가 수가 따로 기록됩니다. 1,024채널, 0–1 MHz, 각도·phasor·baseline 상한은
|
||||
할당과 큰 반복 전에 검사합니다.
|
||||
|
||||
far-field steering vector와 beamformer response를 구현한 독립 참고 구현은
|
||||
[Pyroomacoustics 공식 beamforming source](https://github.com/LCAV/pyroomacoustics/blob/master/pyroomacoustics/beamforming.py)에서
|
||||
확인할 수 있습니다. array factor와 element pattern의 구분은
|
||||
[MathWorks 공식 설명](https://www.mathworks.com/help/phased/ug/element-and-array-radiation-patterns-and-responses.html)을
|
||||
함께 참고하세요.
|
||||
Reference in New Issue
Block a user