Hacker News

Turn a WiFi 7 Router into a 320Msps Software Defined Radio Receiver

Wi-Fi 7 공유기를 320Msps 소프트웨어 정의 라디오 수신기로 바꾸기

Gemtek W1700K 공유기의 MediaTek MT7996 무선 칩을 자체 펌웨어로 구동해 최대 320Msps의 14비트 IQ 데이터를 받는 프로젝트입니다. 10GbE로 데이터를 전송해 Linux 호스트에서 실시간 스펙트럼을 확인하며, 수신 전용으로 동작합니다.

AI 요약

Gemtek W1700K 또는 W1700K2 공유기를 광대역 소프트웨어 정의 라디오(Software-Defined Radio, SDR) 수신기로 바꾸는 프로젝트입니다. MediaTek MT7996 무선 칩에서 14비트 복소 IQ 데이터를 최대 320Msps로 캡처하고, Airoha AN7581 SoC가 이를 10GbE로 Linux 호스트에 보냅니다. 호스트에서는 브라우저로 실시간 스펙트럼과 워터폴을 보고 수신기를 제어합니다.

수신 성능과 데이터 흐름

2.4GHz, 5GHz, 6GHz 대역에서 40, 80, 160, 320Msps로 샘플링합니다. 2.4GHz 대역에서는 640Msps 샘플을 하나씩 건너뛰는 방식으로도 받을 수 있습니다. 이 설정은 ±155MHz까지 평탄한 응답을 제공하지만, 중심 주파수에서 160~320MHz 떨어진 신호는 대역 안으로 접혀 들어옵니다. 프로젝트는 샘플 스트림에 감쇠 보정(flatten)을 적용해 주파수 가장자리에서 생기는 감쇠를 보정합니다.

주파수는 Wi-Fi 채널 단위로 고르지 않습니다. 각 대역의 발진기(LO)가 맞출 수 있는 임의의 주파수를 지정하며, 스트리밍 중에도 약 1ms 안에 다시 조정합니다. 전면부 이득은 자동 이득 제어(AGC)나 수동 저잡음 증폭기(LNA)·베이스밴드 이득으로 설정하고, 아날로그 필터는 20~320MHz 범위에서 조절합니다.

무선부는 데이터를 SoC 메모리에 있는 1GiB 링 버퍼로 DMA 전송합니다. 커널은 8KiB 단위로 데이터를 나눠 UDP 패킷에 담고, 복사 없이 10GbE 포트로 보냅니다. 320Msps에서는 링크 대역폭에 맞추기 위해 무선 칩 내부 코어가 샘플 일부를 샘플 쌍당 28비트로 압축합니다. 데이터 손실 없이 자동으로 처리하며, 프로젝트 설명상 링크 전송량은 9.75Gbit/s에 이릅니다.

자체 펌웨어와 호스트 구성

MT7996에는 MediaTek 펌웨어 대신 프로젝트 자체 ROM 패치와 WM·WA 펌웨어를 올립니다. 펌웨어는 전원 차단 상태에서 무선을 초기화하고, LO·샘플링 속도·캡처·스트리밍·이득·필터 명령을 호스트에서 받습니다. 작성자는 MediaTek 펌웨어의 동작을 추적하고 레지스터를 분석해 초기화와 보정 절차를 재구성했다고 설명합니다.

호스트 쪽에서는 w1700k-stream이 공유 메모리에 IQ 스트림을 제공해 여러 프로그램이 함께 이용합니다. w1700k-spectrum은 262,144포인트 FFT를 초당 100회 계산하고 브라우저 화면에 스펙트럼과 워터폴을 표시합니다. sdr-recv는 스트림을 녹화합니다. 설치에는 시리얼 어댑터와 유선 연결이 필요하며, IQ 스트림을 받으려면 호스트에 10GbE NIC도 있어야 합니다.

설치 과정은 공유기의 기존 운영체제를 교체합니다. 설치 도구는 NAND 데이터를 먼저 호스트에 백업하며, init/restore로 기존 펌웨어를 복원할 수 있습니다. 펌웨어는 수신 전용이고 송신 경로를 비활성화합니다. 다만 민감한 장비를 안테나 포트에 바로 연결하지 말고 감쇠기를 사용하라고 프로젝트는 경고합니다.

Hacker News 반응

  • @aftbit — 정말 멋집니다. 직류부터 광대역 전체를 받는 장비는 아니지만, 5GHz에서 320Msps 수신기를 이보다 싸게 마련할 방법은 잘 모르겠습니다.
  • @ChuckMcM — 이 글의 레지스터 초기화 설명은 제게 전문 용어만 늘어놓은 문장처럼 읽힙니다. 제가 얻은 결론은 문서가 있다면 이 하드웨어용 범용 SDR을 만들 수 있다는 점뿐입니다. LLM이 이런 결과물을 낼 수 있다는 사례로는 볼 수 있겠습니다.
    • @Aurornis — XO나 핀 멀티플렉서 같은 용어는 임베디드와 무선 칩 분야에서 흔히 씁니다. 별도 구현 문서에 들어갈 법한 내용이 README에 있어 일반 독자는 혼란스러울 수는 있습니다.
    • @h0m3us3r — 지적한 부분은 제가 재미 삼아 Claude에게 작성하게 한 대목입니다. 보정과 초기화는 묶음으로 제공되는 제조사 바이너리만으로도 잘 작동했습니다. 다만 절차 중 일부를 이해하고 싶었습니다.
  • @NitpickLawyer — 20년 전에는 USRP를 GNU Radio에 연결하고 외부 클록을 찾은 뒤 자료를 읽고 스크립트를 쓰는 데 많은 시간과 노력이 들었습니다. 이제 모델에 토큰을 투입해 출발점을 마련할 수 있다는 점은 대단하다고 봅니다.
  • @BlackRabbit1 — 320Msps로 이 주파수 대역을 받고 10GbE로 빼내는 장비가 100달러 미만이라면 의미가 큽니다. 예전에는 이런 장비에 수만 달러가 들었습니다.
  • @acd — 신호 대 잡음비(SNR)는 어느 정도인가요?
    • @BlackRabbit1 — Wi-Fi 인증을 받았다면 품질은 꽤 좋을 것이라고 추측합니다. MediaTek 모뎀도 대체로 인증 시험을 거칩니다.
  • @h0m3us3r — 테스트 모드를 한 번 작동시키는 일은 꽤 쉽습니다. 어려웠던 부분은 끊김 없이 계속 실행하고, 쏟아지는 데이터를 추출하는 일이었습니다. 의도되지 않은 설정을 찾아내는 과정도 필요했습니다. 예를 들어 기존 테이블은 2.4GHz 대역에서 80Msps 기준 최대 40MHz만 허용합니다.
  • @bcrl — 고속 ADC가 얼마나 비싼지 모르는 사람이 많습니다. Digikey에서 14비트·350MSPS ADC를 하나 사려면 200달러가 넘습니다. 수백만 대씩 생산하는 Wi-Fi 장비에 ADC가 들어가는 대량 생산의 효과가 큽니다.
  • @yieldcrv — 칩이 원래 설계된 목적과 다른 일을 하는 건가요? Msps가 무엇인지도 잘 모르겠습니다.
    • @crest — Msps는 초당 백만 샘플이라는 뜻입니다.
    • @h0m3us3r — 테스트 모드를 작동시키는 것 자체보다, 데이터가 끊기지 않도록 유지하고 만들어진 데이터를 추출하는 일이 복잡했습니다.
  • @zdw — 여기서는 80달러라고 하네요. 꽤 괜찮은 가격입니다.
  • @SyzygyRhythm — RTL-SDR 동글 다섯 개를 서로 다른 대역에 맞춰 한 컴퓨터로 스트리밍하고 있습니다. 지역 기상 관측기, 수도 계량기, 항공기 ADS-B/UAT, 자동차 타이어 공기압 센서 신호까지 잡힙니다. 주변에서 오가는 신호를 들여다보는 재미가 있습니다.

원문: Hacker News / 번역·요약: Trawling