1P by GN⁺ | ★ favorite | 댓글 1개
  • 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

소프트웨어 처리 파이프라인

  • 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/s
      • bench_fast_cic: 181ns/iter, 132MB/s
      • bench_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 구현

    • 빔포머는 Triton 커널로 구현함
    • Triton은 Nvidia GPU에서 실행되도록 컴파일되는 Python DSL임
    • 수십만 개 지점에 빔포밍할 때 GPU의 대규모 병렬성이 실시간 결과를 가능하게 함
    • Triton 언어의 공유 메모리 배열 인덱싱 지원 관련 현재 제약 때문에 성능이 약간 최적이 아니지만, CUDA C++ 작성은 선택하지 않음
  • 근거리 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
    • 미분 가능 빔포밍과 신경망 모델 결합, 예를 들어 강제 정렬 예시와 같은 응용도 가능함

댓글과 토론

Hacker News 의견들
  • 보정 과정에서 음속도 시스템의 최적 모델을 얻기 위해 최적화되는 매개변수라서, 전체 절차가 말도 안 되게 과하게 설계된 온도계처럼 동작한다는 점이 재미있음
    전자공학 격언인 “모든 센서는 온도 센서이고, 일부는 다른 것도 측정한다”가 떠오름

    • 고등학교 때 부모님 도움을 받아, 아주 작은 구멍으로 공기가 새는 가압 실린더에서 압력이 얼마나 빨리 떨어지는지 측정하는 장치를 만들었음
      알고 보니 그 방식으로 온도도 측정할 수 있고, 그래프를 외삽해서 절대영도도 찾을 수 있었음
      기억상 결과가 약 20K 정도 빗나갔는데, 고등학생의 차고 프로젝트치고는 꽤 훌륭했다고 봄
    • 시간에 따라 뭔가를 측정할 때는 주변 온도도 반드시 같이 측정해야 한다는 원칙을 갖고 있음
    • 이런 우발적 측정을 좋아함
      충분히 정확한 관성측정장치(IMU)는 코리올리 효과를 이용해 비교적 정확한 경도 측정까지 가능하다는 예가 특히 마음에 듦
    • “모든 전자기기는 연기 발생기이고, 일부는 계산도 한다” 같은 격언도 있나 싶음
    • Duracell Powercheck© 가 온도를 이용해 동작했다는 걸 방금 알게 됨
      https://youtu.be/zsA3X40nz9w?si=oGg2wdUlLXSDxpsN
  • 예전에 큰 Y자 형태로 바닥에 배치한 마이크 4개 배열로 박쥐의 다변측량을 하는 프로젝트를 했음
    네 마이크에 도달한 시간 차이를 이용해 배열 위를 날아간 각 박쥐의 위치를 찾고 종도 식별할 수 있었음
    풍력 터빈 설치가 환경에 미치는 영향을 판단하는 연구에 쓰였고, 꽤 재미있었음

    • Intellectual Ventures의 Optical Fence가 떠오름
      짧은 레이저 펄스로 모기를 추적해 죽이기 위해 개발된 장치였음
      모기의 공간 위치를 정밀하게 잡아야 했기 때문에, 부수적으로 날갯짓 주파수 차이를 감지해서 성별과 종에 따라 표적을 구분할 수 있었음
    • 18살 때 비슷한 프로젝트를 했음
      당연히 하드웨어와 소프트웨어 실력이 부족해서, TDOA 알고리즘도 가장 순진한 형태로 구현했고 상호상관으로 시간 차이를 추정하는 방식도 매우 비효율적이었음
      그래도 많이 배웠고, 결국 SAR 시스템 박사과정으로 이어졌음
      SAR는 실제로 배열 대신 플랫폼의 움직임을 사용하는 빔포머에 가깝다고 봄
    • 연구 결과가 어땠는지 궁금함
      박쥐의 폐가 너무 민감해서 대형 터빈의 압력 차를 가로질러 날면 모세혈관이 사실상 터진다는 얘기를 들은 적 있음
    • 정원에 있는 박쥐를 추적하려고 이런 걸 해보고 싶은데, 개인 프로젝트로 아마추어가 하기에는 얼마나 현실적인지 궁금함
      어디서 시작하면 좋을지 참고할 만한 자료가 있으면 좋겠음
    • Antwerp 대학 Cosys-Lab의 훌륭하고 조용한 작업도 떠오름
      전갈 아래에 마이크 배열을 놓고, 박쥐가 전갈을 스캔하려고 초음파 빔을 어떻게 움직이는지 보여줬음
      정말 놀라운 결과였음 [0]
      [0]: https://www.youtube.com/watch?v=57ScSPWhGqU
  • 왜 배열에 TDM I2S 마이크를 쓰지 않고 PDM을 썼는지 궁금함
    ICS-52000은 비교적 저렴하고 100개에 2달러 수준이며, 4개 마이크가 달린 브레이크아웃 보드도 있고 8개나 16개까지 체인으로 연결할 수 있는 것으로 이해함
    https://www.cdiweb.com/datasheets/notwired/ds-nw-aud-ics5200...
    Jetson이나 I2S 가능한 DSP/GPU 장착 하드웨어를 쓰면 I2S 포트당 16개 마이크를 체인으로 연결할 수 있어서, FPGA 구성보다 조립과 프로그래밍이 훨씬 쉬워 보임

    • 비용이 가장 컸음
      마이크가 192개면 2달러/개와 0.5달러/개의 차이가 꽤 커짐
      16개 데이지체인을 해도 I2S 인터페이스가 충분한 장치를 찾기 어렵고, 대부분의 장치가 필요한 수만큼 갖고 있지 않음
      FPGA와 맞춤 하드웨어 자체도 재미의 일부였음
    • 몇 년 전에 찾아봤는데, 그때는 더 비쌌고 20kHz까지만 가능했음
      누출 가스의 쉭쉭거리는 소리나 전기 아크의 코로나 방전을 들으려면 더 높은 주파수가 유용함
      Orin은 내부적으로 I2S 포트가 6개라서 16*6 = 96개 마이크까지는 가능해 보이고 꽤 좋은 숫자임
      다만 실제로는 3개만 보드 밖으로 나와 있고 서로 다른 개발 보드 커넥터에 있는 것 같음 [1]
      설계에서는 늘 세부가 문제라서, 96개보다 많이 필요하면 FPGA가 더 구성하기 쉬울 수도 있음
      메모해 둔 부품은 ICS-52000 $3.50 20kHz, ICS-41350 $1.05 40kHz, SPH0641LU4H-1 $1.45 80kHz+였음
      [1] https://docs.nvidia.com/jetson/archives/r34.1/DeveloperGuide...
    • 직접 위상 배열을 만들어볼까 했지만 PCB 제작까지는 가지 못했음
      I2S가 최선이 아닌 이유는 두 가지 정도 있음
      I2S는 PDM의 2핀 대신 3핀이 필요함
      다만 제공한 데이터시트처럼 마이크를 데이지체인할 수 있다면 꽤 멋지고, 표준 I2S는 아니어도 이 논점은 사라짐
      PDM은 훨씬 높은 표본화율에 접근할 수 있어서 지연-합산 연산에서 지연을 고르는 유연성이 커짐
      예를 들어 PDM 클록이 2MHz라면 이론상 0.5µs 정밀도로 지연시킬 수 있음
      실제로는 더 낮은 정밀도로 하겠지만, I2S 클록은 보통 최대 192kHz 수준임
      PDM 마이크가 더 저렴하기도 함
  • YouTube에서 음향 카메라를 찾아보면 성능을 보여주는 꽤 인상적인 시연들이 있음
    한동안 지켜본 회사 중 하나가 여기이고, FLIR 같은 큰 업체들도 들어오는 것 같음: https://www.youtube.com/@gfaitechgmbh
    흥미롭지만 섬뜩한 활용 사례는 공공장소를 녹음해 둔 뒤 나중에 특정 개인들 사이의 대화로 ‘줌인’하는 것임

    • 이런 배열이 얼마나 작아질 수 있는지에 관심이 많음
      인공와우를 쓰는 친구와 얘기해 보니, 적절한 신호 처리가 붙으면 듣는 데 큰 도움이 될 수 있을 것 같음
  • 대학원생으로 돌아가서 초음파 스피커 배열과 결합해 의료 응용을 시도해보고 싶음
    본질적으로 실시간 피드백이 있는 초강력 HIFU(고강도 집속 초음파) 같은 것임
    https://en.wikipedia.org/wiki/Focused_ultrasound

    • 공기 중 초음파 위상 배열로 박사과정을 하고 있고 학회나 연구실에서 의료 쪽 사람들과 이야기해 보는데, 고체와 액체에서는 훨씬 더 어려움
      주파수가 훨씬 높아서 40kHz가 아니라 1~10MHz 정도를 생각해야 하고, 일반적인 전자회로는 사실상 쓸 수 없음
    • 한 가지 문제는 음파가 고체와 액체를 통과할 때, 관심 있는 대역폭 전체에서 음속이 일정하지 않다는 것임
    • 찾고 있는 FUS 대학원생이 나일 수도 있음
      이야기하고 싶으면 프로필 이메일로 연락하면 됨
    • 의료 응용이라면 공기 중이 아니라 접촉 결합이 필요할 가능성이 높아 보임
  • 이런 기술이 잘 포장된 형태로 여러 모바일 기기에 들어오면 좋겠음
    비서, 범용 번역기 같은 것이 막히는 이유 중 하나가 나쁜 오디오 품질이라고 봄
    잡음을 줄이고 방향을 감지할 수 있으면 큰 도움이 될 잠재력이 있음
    예를 들어 식탁에 둘러앉은 그룹 대화를 실시간 번역하고 싶음
    우선 휴대폰과 헤드폰이 각자의 마이크를 결합해 이런 용도로 쓸 수 있으면 좋겠음
    더 나아가 근처의 모든 휴대폰이 협력해 고품질 방향성 오디오를 제공할 수 있다면 어떨까 싶음
    물론 개인정보 문제를 해결할 수 있다는 전제임

    • 나처럼 난청이 있는 사람에게는 모임이나 파티처럼 시끄러운 환경에서 실시간 자막을 제공하고, 서로 다른 화자의 말을 분리·그룹화하는 것이 킬러 앱이 될 것임
      삶을 바꿀 수 있음
      Android의 Live Transcribe는 지금 매우 좋지만, 어떤 단어가 어느 화자에게서 나왔는지는 분리하려고도 하지 않음
    • 최신 MacBook Pro에는 이미 여러 마이크가 있고, 아마도 위상 배열 비슷한 처리를 하고 있을 것 같음
    • 이것은 칵테일 파티 문제로 알려져 있음
      시끄러운 방에서 누군가가 우리에게 말하는 내용을 이해할 수 있도록 뇌가 엄청난 처리를 한다는 점이 드러남
      https://en.wikipedia.org/wiki/Cocktail_party_effect?wprov=sf...
    • 일반적으로 위상 이동 계산을 제대로 하려면 공간상 마이크 위치를 정확히 알아야 하고, 휴대폰들의 클록도 매우 높은 정밀도로 동기화되어야 함
      대략 수집하려는 최고 음향 주파수의 10배 수준, 즉 수만 분의 1초 이내여야 함
      또 배열 마이크 위치가 직선, 원, 기타 단순한 기하가 아니면 개선된 신호를 뽑아내는 코드, 즉 수학이 매우 어려워짐
  • Boeing은 이런 장치의 구형 버전을 만들어 787 시제품에서 방음재 후보를 찾는 데 사용했음
    비행기처럼 시끄러운 환경에서는 청각 착시 때문에 소리가 실제 위치와 다른 곳에서 나는 것처럼 느껴질 수 있다고 함
    방음재에 무게 예산이 정해져 있으면 80/20 지점을 제대로 맞추는지가 중요해짐

  • Zynq 7010을 갖고 놀고 싶다면 EBAZ4205 보드를 살펴볼 만함
    AliExpress에서 20~30유로에 살 수 있고, 예전 Bitcoin 채굴 컨트롤러였음
    어떤 사람들이 전체를 역공학해 GitHub에 올려뒀고, GPIO에 접근하기 위한 어댑터 판도 있음
    더 덜 복잡하게 시작하려면 GoWin FPGA를 쓰는 “Sipeed” 보드 같은 중국산 FPGA도 있음
    꽤 쓸 만하고 IDE도 무료임

    • Xilinx 도구 체인도 무료임
  • 어젯밤에 조사하다가 바로 이 페이지에 도착했음
    방에 마이크를 설치해 특정 영역의 오디오만 녹음하는 방법을 아는 사람이 있는지 궁금함
    내 용도는 소파 쪽을 녹음해서 온라인 친구들과 TV를 보면서, 친구들 목소리와 방송 소음을 오디오에서 제거하는 것임
    마이크 배열을 만들고 빔 조향을 쓰면 가능할 것 같지만, 실시간으로 동작하는 코드 예제를 GitHub에서 많이 찾지는 못했음

    • OBS나 VoiceMeeter를 살펴보면 스트리머들이 라이브 방송이나 녹화 중 오디오를 선택적으로 라우팅하는 방법을 알 수 있을 것임
      https://obsproject.com/
      https://voicemeeter.com/
    • 큰 방송 소리와 온라인 친구들의 가까운 오디오는 방 안과 몸에서 반사될 것임
      원하는 것은 마이크나 빔포밍 기술이 아니라, 모든 화상회의 소프트웨어가 쓰는 것과 같은 반향 제거
      방송 오디오와 친구 오디오를 입력으로 넣고 각각에 반향 제거를 적용하면 됨
    • 글에 나온 것처럼 “가장 단순한 빔포밍 방식은 지연-합산(DAS)”임
      한 지점, 즉 소파에서 각 마이크까지의 거리를 측정하고, 소리가 소파에서 마이크까지 이동하는 시간만큼 시간 영역에서 신호를 지연시킨 뒤 더하면 됨
      기본적으로 서로 다른 거리에 있더라도 마이크들이 소파 신호를 같은 시각에 받은 것처럼 맞추려는 것임
      이 방식이 효과를 내려면 마이크 거리 차이가 충분히 나도록 해야 함