우주 펄서 탐지 기술로 아이폰을 1000달러짜리 시계 측정기로 만든 이야기


엔지니어로 일하다 보면 가끔 ‘극단적인 노이즈 속에서 의미 있는 신호 찾기’라는 고전적인 문제에 직면하게 됩니다. 보통은 돈을 발라 하드웨어 스펙을 올려서 해결하려 들죠. 하지만 제약 조건이 빡빡한 모바일 환경, 그것도 스마트폰의 기본 마이크만 사용해야 한다면 어떨까요?

최근 해커뉴스에서 제 눈길을 사로잡은 아주 흥미로운 포스트가 있었습니다. 기계식 시계의 오차를 측정하는 ‘타임그래퍼(Timegrapher)‘를 아이폰 앱(ChronoLog)으로 구현한 개발자의 회고록인데, 그 해결 방식이 무려 전파천문학에서 우주의 펄서(Pulsar)를 탐지할 때 쓰는 알고리즘이었습니다.

단순히 ‘앱을 만들었다’가 아니라, 밑바닥 DSP(Digital Signal Processing) 파이프라인을 어떻게 설계했는지 보여주는 훌륭한 엔지니어링 사례입니다. 한 번 깊게 파보겠습니다.

문제의 본질: 1.5 dB SNR이라는 절망적인 환경

기계식 시계 수집가나 수리공들이 쓰는 전문가용 타임그래퍼는 보통 피에조(Piezo) 접촉식 센서를 사용하며 가격이 1,000달러를 쉽게 넘어갑니다. 시계 케이스에 직접 센서를 대고 내부의 미세한 기계적 ‘틱(tick)’ 소리를 물리적으로 잡아내는 방식이죠.

이 개발자의 목표는 이걸 아이폰 마이크로 대체하는 것이었습니다. 문제는 스마트폰 마이크로 시계 소리를 수음할 때의 SNR(Signal-to-Noise Ratio)이 고작 1.5 dB 수준이라는 겁니다. 사실상 주변 백그라운드 노이즈와 신호가 거의 구분되지 않는, 데이터로 쓰기엔 쓰레기에 가까운 상태입니다.

해커뉴스 스레드에서 한 유저가 “아이폰의 가속도계(Accelerometer)를 쓰면 어떠냐”는 아주 엔지니어다운 질문을 던졌습니다. 폰을 뒤집어 놓고 그 위에 시계를 올려서 미세한 진동을 잡자는 아이디어죠. 하지만 이는 불가능합니다. 시계의 틱 소리는 보통 3kHz에서 15kHz 사이의 고주파 대역에 피크가 형성되는데, Apple의 CoreMotion API가 제공하는 가속도계 업데이트 주기는 하드웨어적으로 최대 100Hz 에 불과합니다. Nyquist 정리를 들먹일 필요도 없이 대역폭이 턱없이 모자랍니다.

천문학에서 빌려온 해결책: Epoch Folding

1.5 dB의 노이즈 구덩이에서 신호를 건져내기 위해 개발자가 선택한 방법은 Epoch Folding 이었습니다. 이는 전파 천문학자들이 노이즈로 가득 찬 우주 배경 복사 속에서 규칙적으로 회전하는 중성자별(펄서)의 미세한 전파를 찾아낼 때 쓰는 기법입니다.

원리는 생각보다 직관적입니다. 시계의 틱이 발생하는 대략적인 주기(Period)를 알고 있다면, 해당 주기에 맞춰 오디오 샘플을 여러 겹으로 쌓아 올리는(Folding) 겁니다.

  • 노이즈의 특성: 무작위(Random)이므로 여러 번 더하면 서로 상쇄되어 0에 수렴합니다.
  • 신호의 특성: 주기적(Periodic)이므로 제자리에 계속 누적되어 증폭됩니다.

개발자는 약 100개 이상의 틱 주기를 겹쳐서 무려 +20 dB 의 유효 게인(Effective Gain)을 얻어냈습니다. 이 정도면 일오차(Rate)와 비트 에러(Beat error)를 신뢰할 수 있는 수준으로 측정하기에 충분합니다.

해커뉴스의 한 댓글이 지적했듯, 이는 GPS 수신기에서 노이즈 플로어(Noise floor) 아래에 묻혀 있는 위성 신호를 찾아낼 때 사용하는 상관 수신기(Correlation receiver)의 원리와 정확히 일치합니다. 하드웨어의 한계를 수학과 알고리즘으로 뚫어버린 우아한 접근법입니다.

DSP 파이프라인과 엔지니어링 디테일

포스트에 설명된 전체 DSP 파이프라인은 다음과 같이 구성되어 있습니다.

  1. Bandpass Filtering: 3kHz ~ 15kHz 대역만 남기고 저주파 노이즈를 날려버립니다.
  2. Epoch Folding: 위에서 설명한 대로 신호를 누적하여 게인을 확보합니다.
  3. Autocorrelation (자기상관): 신호의 정확한 주기를 찾습니다. 여기서 개발자는 매우 흥미로운 사실을 발견했는데, SNR이 극도로 낮을 때는 기본 주파수(Fundamental)보다 고조파(Harmonics)가 먼저 잡힌다는 점입니다. 오디오 신호 처리를 해본 분들이라면 격하게 공감할 만한 골치 아픈 엣지 케이스죠.
  4. Kalman Filtering: 최종적으로 측정값이 수렴하도록 스무딩 처리를 합니다.

애플의 ‘스마트한’ 오지랖과 현실의 벽

알고리즘이 아무리 완벽해도 현실의 플랫폼 위에서는 항상 예상치 못한 버그를 만납니다. iOS 환경에서 이 앱을 테스트하며 겪은 가장 큰 문제는 오디오 라우팅이었습니다.

개발자가 명시적으로 아이폰의 내장 하단 마이크를 사용하도록 코드를 작성했음에도 불구하고, 사용자의 귀에 에어팟(AirPods)이 꽂혀 있으면 iOS가 조용히 마이크 입력을 에어팟으로 돌려버리는 현상이 발생했습니다. 애플 생태계에서 개발을 해본 시니어들이라면 이 대목에서 실소를 터뜨렸을 겁니다. OS가 개발자의 의도를 무시하고 사용자 경험을 명목으로 ‘스마트하게’ 개입할 때 발생하는 전형적인 디버깅 지옥이죠.

총평 (Verdict)

솔직히 처음엔 “그냥 20달러짜리 Korg 접촉식 마이크 하나 사서 PC에 꽂으면 끝날 일을 굳이 앱으로?”라고 생각했습니다. (실제로 해커뉴스에서도 비슷한 지적이 있었습니다.) 물리적인 센서를 쓰는 것이 수학적으로 훨씬 깨끗한 데이터를 얻는 지름길이니까요.

하지만 모바일 기기 단 하나만으로, 그것도 성능이 턱없이 부족한 기본 마이크를 가지고 전문가용 장비의 영역을 흉내 냈다는 점에서 이 프로젝트는 엄청난 가치가 있습니다.

이 글은 우리에게 중요한 엔지니어링 교훈을 줍니다. 우리는 종종 문제에 직면했을 때 새로운 라이브러리나 더 좋은 클라우드 인스턴스, 더 비싼 장비부터 찾습니다. 하지만 때로는 다른 도메인(이 경우엔 천문학과 GPS 통신)에서 이미 수십 년 전에 증명된 수학적 모델을 가져오는 것만으로도, 불가능해 보이던 하드웨어의 한계를 극복할 수 있습니다.

기계식 시계의 오차를 측정할 일이 없더라도, 신호 처리나 최적화에 관심이 있는 엔지니어라면 원문 블로그의 DSP 파이프라인 설명은 꼭 한번 정독해 보시길 권합니다.


References: