7.4 KiB
마이크 어레이 수신 빔 패턴
Array Builder의 수신 빔 패턴은 현재 마이크 좌표에 conventional delay-and-sum을 적용했을 때의 narrowband far-field array factor를 360° polar 단면으로 보여줍니다. 마이크는 송신원이 아니므로 엄밀히는 방사 패턴이 아니라 수신 응답입니다.
가장 짧은 사용법
- Array Builder에서 마이크 배치를 만들거나 Array JSON을 엽니다.
- 배열 canvas 아래의 수신 빔 패턴을 펼칩니다.
- 실제 음향파의 아날로그 주파수와 음속을 입력합니다.
- XZ, YZ 또는 XY 360° 절단면과 조향각을 고릅니다.
- 기본 자동 · 위상 간격 기준을 사용하고, 계산량 비교가 필요할 때만 고정 표본 수를 고릅니다.
- polar 선, 조향 응답, 조건부 −3.0103 dB 폭과 sampled local maxima를 함께 읽습니다.
마이크를 드래그하는 동안에는 최대 720개 각도의 가벼운 preview를 표시합니다. 마우스나 pointer를 놓으면 선택한 표본 설정으로 다시 계산합니다. 빔 패턴 설정은 배열 좌표가 아니므로 undo history, 저장되지 않은 변경 상태와 Array JSON에는 들어가지 않습니다.
물리식과 좌표
마이크 위치 r_m, 배열 중심 r_c, array→source 방향 단위벡터
u, 조향 방향 u0, 아날로그 주파수 f, 음속
c에 대해 표시하는 complex receive array factor는 다음입니다.
B(u) = (1/M) Σ_m exp[j (2πf/c) (u-u0)·(r_m-r_c)]
1/M은 sampled maximum에 맞춘 사후 정규화가 아니라 고정 conventional
delay-and-sum weight입니다. 따라서 조향 방향은 이상적 모델에서 1이고, 같은 0 dB 응답이 여러
방향에 있으면 모두 그대로 남습니다. Array Builder는 |B|²와
10 log10(|B|²)를 계산하며, 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의 sensitivityDb,
phaseOffsetDeg와 frequencyResponse도 이 geometry-only plot에는
섞지 않습니다. 이 보정들은 합성 및 위치추정 pipeline에서 별도로 적용됩니다. 주파수 응답은
주파수별 channel transfer이고, 그 자체가 각도별 element pattern은 아닙니다.
Nyquist와 공간 alias
이 계산에는 ADC sample rate 입력이 없습니다. 파수는 항상 원래 아날로그 주파수로
k=2πf/c를 계산하며, 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 D, 각도 간격
Δ=2π/N에 대한 인접 방향 pair phase 변화 상한
2 k D sin(Δ/2)를 계산합니다. 현재 metric 해석 기준은 이 상한이
π/8 이하인 경우입니다.
이 기준은 공개된 수치 해상도 정책이지, 모든 연속 lobe와 half-power excursion을 검출한다는
수학적 증명이 아닙니다. 기준을 넘으면 raw polar 표본은 그대로 표시하되 HPBW와 peak 해석을
resolution-unresolved로 보류합니다. 기준을 만족해도 half-power crossing을 표본에서
찾지 못한 비상수 패턴은 360° HPBW라고 만들지 않고
no-sampled-half-power-crossing으로 남깁니다. 단일 또는 절단면 투영 좌표가 모두 같은
배열만 analytic constant로 판정하고 폭을 null로 반환합니다.
자동 표본은 최소 720개에서 시작해 이 phase-step 기준에 맞게 늘어나며 최대 14,400개와 전체 phasor 평가 상한을 지킵니다. 상한에서도 기준을 만족하지 못하면 계산을 예쁘게 보이도록 평활화하거나 peak를 제거하지 않고 미확정 상태를 표시합니다.
portable API
beam-pattern.js는 DOM, Scene, ADC와 외부 package에 의존하지 않는 ES module입니다.
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 responseReal, responseImaginary,
responsePower, responseLinear, unclamped responseDb와
표시용 displayDb를 각각 보존합니다. workload에는 baseline pair 비교, sampled phasor,
HPBW용 최대·실제 평가 수가 따로 기록됩니다. 1,024채널, 0–1 MHz, 각도·phasor·baseline 상한은
할당과 큰 반복 전에 검사합니다.
far-field steering vector와 beamformer response를 구현한 독립 참고 구현은 Pyroomacoustics 공식 beamforming source에서 확인할 수 있습니다. array factor와 element pattern의 구분은 MathWorks 공식 설명을 함께 참고하세요.