- 192채널 위상 배열 마이크로폰은 녹음 후에도 방향성을 바꾸거나 수십만 지점에 동시에 초점을 맞출 수 있어, 일반 지향성 마이크로는 어려운 음원 위치 추정과 시각화를 가능하게 함
- 하드웨어는 방사형 마이크 암과 중앙 허브로 구성되며, 약 $700 비용으로 192개 MEMS 마이크, Colorlight i5 FPGA 카드, Gigabit Ethernet 전송 구조를 사용함
- FPGA는 복잡한 전처리보다 원시 PDM 데이터 전송에 집중해 3.125MHz 입력을 처리하고, 약 715Mbps로 Gigabit Ethernet 대역의 약 70%를 사용함
- 소프트웨어는 CIC 필터, FFT 기반 보정, GPU 최적화, Triton 빔포밍을 조합해 3D 근거리와 2D 원거리 음원 위치를 실시간 시각화함
- UDP 패킷은
tcpdump로 캡처해 재생할 수 있지만, 원시 저장은 87.5MB/s에 달해 1시간 녹음에 315GB가 필요함
192채널 위상 배열 마이크로폰 구성
- 192채널 위상 배열 마이크로폰에 FPGA 데이터 수집과 GPU 기반 빔포밍·시각화를 결합함
- 일반 지향성 마이크와 달리, 위상 배열은 녹음 이후에도 방향성을 바꿀 수 있고 실시간으로 수십만 개 지점에 동시에 초점을 맞출 수 있음
- 모든 설계는 오픈소스로 공개됨
하드웨어 설계
-
배열 구조와 비용
- 다수의 마이크를 넓은 간격 분포로 배치해 위상 배열을 구성함
- 선형 배열에서는 광대역 신호에 대해 마이크 간 지수 간격이 최적으로 알려져 있음
- 2D 배열은 대칭 선형 배열 암을 방사형으로 배치해 중앙 허브 보드를 작게 유지함
- 전체 배열 비용은 약 $700임
-
암 보드
- 각 암의 길이는 PCB 제조·조립 한계에 맞췄고, JLCPCB의 4층 PCB 제조·조립 최대 길이는 570mm였음
- 마이크는 개당 약 $0.5의 저가 디지털 출력 MEMS 마이크를 사용함
- 이 가격대에서는 마이크 간 성능 차이가 크지 않음
- 대부분 10kHz까지는 괜찮은 성능을 보이지만, 위상 지연과 음량 매칭은 명시되지 않음
- 마이크는 PDM(pulse density modulation) 방식으로 데이터를 출력함
- 가청 범위보다 훨씬 높은 최대 4MHz 주파수에서 1비트 출력을 냄
- 높은 샘플링 속도로 양자화 잡음을 보완함
- 클록 상승·하강 에지에서 데이터를 래치하는 DDR을 지원해 두 마이크를 한 선에 다중화할 수 있음
- 각 암은 8개 마이크와 4개 출력 라인을 가지며, 클록 입력 라인에는 출력 버퍼를 둠
- 수백 개 마이크가 같은 클록 신호를 공유해도 상승 시간이 합리적인 수준을 유지하도록 설계함
- 암 PCB 수율은 좋지 않았고, 초기 상태에서 동작한 보드는 약 50% 였음
- 가장 흔한 고장은 클록 라인이 3V3 또는 GND에 단락되는 문제였음
- 단락을 해결하려면 마이크를 하나씩 제거하는 시행착오가 필요했음
- 일부 마이크는 재작업 후에도 잘못된 데이터를 냈고, 코드는 해당 마이크를 마스킹해 제외함
- 다음 설계에서는 클록 라인 직렬 저항, 패널화 개선, 솔더 페이스트 스텐실 개선으로 재작업을 줄일 수 있음
-
허브 보드
- 데이터 수집에는 많은 수의 저지연 I/O와 Gigabit Ethernet 같은 고속 인터페이스가 필요한 FPGA를 사용함
- 구체적으로 Colorlight i5 카드를 선택함
- 충분한 I/O, 낮은 가격, 구하기 쉬운 점, 통합 Ethernet PHY 2개가 이유임
- 이 프로젝트에서는 Ethernet PHY 하나만 사용함
- 이 카드는 원래 LED 패널용 Ethernet 인터페이스지만 완전히 리버스 엔지니어링되어 있음
- 약 100개 GPIO가 DDR2 커넥터로 노출되어 있어 원래 FPGA의 BGA보다 팬아웃이 쉬움
- 허브에는 FPGA 외에도 간단한 전원 관리 회로, 암 보드용 커넥터, 통합 마그네틱이 있는 Ethernet 커넥터가 들어감
-
기구 설계
- 암은 PCB 장착 스탠드오프·너트와 M3 나사로 허브에 부착함
- 암과 허브 간 연결은 8핀 2mm 피치 커넥터로 이뤄짐
- 초기 설계는 암 PCB의 슬롯과 원주 방향 구조 PCB를 맞물리게 했지만, 암의 비틀림 강성이 낮아 전체 구조가 쉽게 변형됨
- 최종 설계는 배열 외곽에 레이저 커팅한 1/4인치 MDF 조각을 두고 각 암을 케이블 타이로 MDF에 고정함
- 마이크 배열은 벽에 장착되어 반사에 취약하므로, 보정을 쉽게 하기 위해 흡음 폼으로 반사를 줄임
FPGA 게이트웨어
-
설계 목표
- 게이트웨어의 핵심 목표는 수집한 원시 데이터를 손실 없이 컴퓨터로 안정적으로 전송하는 것임
- FPGA에서 디시메이션과 필터링을 하면 데이터율을 줄일 수 있지만, 원시 PDM 데이터도 Gigabit Ethernet으로 전송 가능함
- 원시 데이터를 보내면 FPGA 코드 복잡도가 줄고 반복 개발이 빨라짐
- 코드 컴파일은 배치·라우팅보다 빠르고, 일반 코드에서 디버거를 쓰는 편이 게이트웨어 디버깅보다 쉬움
-
PDM 인터페이스
- PDM 입력 모듈은 50MHz 시스템 클록을 16으로 나눠 3.125MHz PDM 클록을 출력함
- 각 클록 에지 뒤에 96개 입력 핀을 래치하고, 각 클록 사이클마다 32비트 데이터를 시프트함
- 192비트 데이터 청크마다 32비트 증가 정수 헤더를 붙임
- PDM 인터페이스 입력 데이터율은 3.125MHz × 96개 입력 핀 × DDR 2 = 600Mbps임
- 헤더 포함 출력 데이터율은 700Mbps이며, 32비트 출력 데이터 경로 사용률은 약 40%임
-
패킷화와 UDP 전송
- 패킷화 모듈은 특수 입력 인터페이스를 가진 FIFO 버퍼에 가까움
- Ethernet 인터페이스가 PDM 출력보다 빠르기 때문에, 표준 FIFO처럼 항목 하나만 있어도 출력하면 요청보다 작은 패킷이 생길 수 있음
- 패킷화 모듈은 한 패킷 분량의 데이터가 큐에 쌓일 때까지 기다렸다가 전송을 시작해 고정 크기 패킷을 보장함
- 각 패킷에는 224비트 PDM 출력 블록 48개가 들어감
- 블록 하나는 192비트 데이터와 32비트 헤더로 구성됨
- 패킷당 데이터는 1344바이트임
- IPv4 헤더 20바이트와 UDP 헤더 8바이트가 추가됨
- 패킷률은 약 65kpps이고, 결과적으로 선속도는 715Mbps이며 Gigabit Ethernet 사용률은 약 70%임
- UDP 스트리밍에는 LiteEth를 사용함
- UDP/IP 캡슐화, ARP 테이블 같은 하위 복잡도를 추상화함
- FIFO를 UDP 스트림에 연결하기 쉬운 인터페이스를 제공함
- 간헐적 지연은 패킷화 FIFO의 버퍼 여유로 흡수됨
-
FPGA 자원 사용
- Colorlight i5의 FPGA는
LFE5U-25F-6BG381C이며 25k LUT를 가짐 - 설계는 오픈소스 Project Trellis 툴체인으로 배치·라우팅함
- 게이트웨어를 단순하게 유지해 자원 사용률은 낮고 추가 기능을 넣을 여지가 많음
- DP16KD: 16/56, 28%
- TRELLIS_FF: 1950/24288, 8%
- TRELLIS_COMB: 3701/24288, 15%
- 최대 클록은 50MHz 목표에서 73.17MHz로 통과함
- Ethernet RX 클록의 타이밍 경고는 LiteEth의 gray counter와 관련된 false positive임
- Colorlight i5의 FPGA는
소프트웨어 처리 파이프라인
-
CIC 필터
- 각 마이크는 3.125MHz 1비트 신호를 출력하며, 후속 처리를 위해 더 낮은 샘플링 속도와 비트 깊이로 줄여야 함
- 이 작업에는 산술 연산이 적은 CIC 필터를 사용함
- Tom Verbeure의 Moving Average and CIC Filters 시리즈를 참고함
- 최종 선택은 4단, 16배 디시메이션 CIC 필터임
- 샘플링 속도를 195kHz로 낮춤
- 출력은 32비트임
- 3.125MHz 데이터를 받아들이려면 샘플 묶음 하나를 320ns 안에 처리해야 함
- 단순 Rust 구현은 단일 코어에서 충분히 빠르지 않았고, 추상화를 줄여 자동 벡터화를 더 잘 유도한 구현을 최종 사용함
- SIMD intrinsic 구현은 훨씬 빨랐지만, 다른 코드와 함께 사용할 때 정렬 문제를 만남
- 벤치마크 결과:
bench_cic: 574ns/iter, 41MB/sbench_fast_cic: 181ns/iter, 132MB/sbench_simd_cic: 36ns/iter, 666MB/s
-
보정
- 배열 보정은 화이트 노이즈를 재생하는 스피커를 배열 앞 방 안에서 움직이며 수행함
- 모든 마이크 쌍 사이에 FFT 기반 상호상관을 계산해 상대 지연을 구함
- 마이크 쌍은 18,000개가 넘으므로 계산량이 큼
- 16k~64k 윈도우 크기에서 FFT는 메모리 병목이므로, IFFT와 피크 탐색을 결합해 결과를 메모리에 쓰지 않도록 했고 15배 속도 향상을 얻음
- Ryzen 7950X에서 이 과정은 실시간으로 실행됨
- 이후 각 시점의 음원 위치와 각 마이크 위치를 경사하강법으로 최적화함
- 손실 함수는 측정 상관과 이상적 상관의 차이를 줄임
- 마이크 위치가 초기 위치에서 지나치게 벗어나지 않도록 함
- 음원 궤적의 jerk도 줄임
- 보정 과정에서 음속도 최적화 파라미터로 포함되어, 전체 절차가 과하게 복잡한 온도계처럼 동작함
- 수백 회 반복 후 음원 위치, 마이크 위치, 음속 같은 상수가 합리적인 해로 수렴함
- 이 문제는 GPU 벡터화가 잘 되어 몇 초 만에 수렴함
- 최종 평균 위치 오차는 약 1mm 수준임
- 구조 강성 부족으로 생긴 오목함 같은 대규모 체계적 왜곡도 보정함
- 설계 위치와 보정 위치 사이 최대 오차는 약 5mm임
- 10kHz 소리의 파장은 약 3.4cm라서, 보정하지 않으면 고주파에서 유의미한 위상 오차가 생길 수 있음
빔포밍과 시각화
-
빔포밍 방식
- 빔포밍은 원시 마이크 입력을 처리해 지향성 응답을 만드는 과정임
- 구현한 방식은 가장 단순한 delay-and-sum, 즉 DAS임
- 각 신호를 음원까지 거리 차이에 따라 지연시켜 합산함
- 이 프로젝트에서는 주파수 영역에서 빔포밍함
- 주파수 영역에서 지연은 필요한 지연에 비례하는 선형 위상 항과 신호의 복소 곱으로 구현함
- 샘플링 주기의 정수배가 아닌 지연도 자연스럽게 처리함
- 원래 배열의 여러 중첩 하위 배열을 주파수 범위별로 사용함
- 모든 주파수에서 모든 마이크로 빔포밍할 필요가 없어 처리량을 줄이고, 모든 주파수의 빔포밍 이득을 맞추는 데도 도움이 됨
-
Triton 기반 GPU 구현
-
근거리 3D 빔포밍
- 근거리 3D 빔포밍은 5cm 복셀 그리드에서 수행함
- 그리드 크기는 64×64×64임
- RTX 4090에서 12Hz 업데이트 속도를 달성함
- 더 높은 속도는 작은 작업 단위에서 CPU-GPU 동기화가 최적이 아닌 오버헤드에 제한됨
- 복셀 그리드는 OpenGL 기반 고성능 시각화 라이브러리 VisPy로 시각화함
- 25만 개 반투명 복셀 렌더링은 현대 게임의 다각형 수와 비교하면 인터랙티브 프레임레이트에서 문제가 되지 않음
-
원거리 2D 빔포밍
- 원거리 음원은 파면이 거의 평면이라, 음원이 얼마나 멀리 있는지가 배열 신호를 의미 있게 바꾸지 않음
- 가까운 음원은 파면 곡률이 커서 3D 위치를 결정할 수 있음
- 원거리 빔포밍은 깊이 차원이 없어 더 높은 해상도로 수행 가능함
- 512×512 픽셀 그리드를 사용하고, 동일하게 12Hz 업데이트 속도를 달성함
- 원거리 빔포밍은 실제 평면파 가정 대신 지점을 멀리 배치하는 근사를 사용함
- 방 안의 반사와 다중경로가 많아 2D 시각화 데모는 음향 환경의 영향을 받음
-
지향성 오디오
- 앞선 두 빔포밍 구현은 각 위치의 소리 에너지를 계산하지만, 빔포밍된 오디오를 메모리에 만들지는 않음
- 지향성 오디오 녹음을 위해 시간 영역 delay-and-sum 빔포머를 구현함
- 배열 중심 기준 3D 좌표를 입력받음
- 오디오 샘플을 출력함
- 이 빔포머는 출력에 대해 위치가 미분 가능함
- 오디오 소스 위치를 미분 가능한 손실 함수로 최적화할 수 있음
- 다자간 전사에 강제 정렬 모델을 사용해 각 화자의 물리적 위치를 찾는 응용이 가능할 수 있음
- 한 스피커는 배열 앞에서 오디오를 재생하고, 다른 스피커는 배열 중심에서 약 45도 떨어진 같은 거리에서 화이트 노이즈를 재생하는 방식으로 효과를 비교함
- 단일 마이크 원시 오디오와 빔포밍 오디오를 비교해 빔포밍 효과를 보여줌
녹음 방식과 한계
- 마이크 배열 데이터는 UDP 패킷이므로
tcpdump같은 도구로 녹음할 수 있음 - 패킷 캡처 파일을 읽어 리스너에 패킷을 다시 주입할 수 있음
- 앞선 프로그램들은 실시간 동작을 위해 설계됐지만, 이 방식으로 녹음 데이터에서도 동작함
- 단점은 원시 데이터를 그대로 저장해 출력 데이터율이 매우 높다는 점임
- 양자화 잡음까지 충실히 저장함
- 데이터율은 87.5MB/s
- 1시간 녹음은 315GB가 필요함
- 더 최적화된 구현은 압축을 적용하거나, CIC 필터 이후 낮은 샘플링 속도에서 녹음할 수 있음
가능한 확장
- 프로젝트는 사실상 완료 상태이며, 가까운 미래에 더 작업할 계획은 없음
- 그래도 직접 만들고 싶은 사람에게는 확장 여지가 남아 있음
- DAMAS 같은 더 고급 빔포밍 알고리듬 사용
- 소리가 어디서 나는지 보고 그 위치에서 오디오를 녹음하는 등 기존 기능을 결합한 더 나은 GUI
- 미분 가능 빔포밍과 신경망 모델 결합, 예를 들어 강제 정렬 예시와 같은 응용도 가능함