GBA 오디오 에뮬레이션: 수학적으로 완벽한 소리가 왜 '틀리게' 들릴까?


최근 Hacker News와 기술 블로그 계를 달구고 있는 흥미로운 글이 하나 있습니다. 바로 Game Boy Advance(GBA) 에뮬레이터의 오디오 보간법(Interpolation)에 관한 기술 포스트입니다.

보통 에뮬레이션 개발이라고 하면 ‘하드웨어의 완벽한 재현(Accuracy)‘을 지상 과제로 삼습니다. 버그까지 똑같이 구현해야 진정한 에뮬레이터라고 칭송받죠. 하지만 GBA의 오디오 시스템은 이야기가 좀 다릅니다. 원본 하드웨어의 설계 자체가 워낙 독특(혹은 열악)해서, 이를 수학적으로 ‘개선’했을 때 오히려 청취 경험이 나빠지는 기현상이 발생하기 때문입니다.

오늘은 15년 차 엔지니어 관점에서, 왜 Signal Processing 의 정석이 레트로 게임기에서는 통하지 않는지, 그리고 이 논쟁이 왜 엔지니어링 적으로 중요한 함의를 갖는지 딥다이브 해보겠습니다.

GBA 오디오 하드웨어의 ‘더러운’ 현실

먼저 배경지식이 좀 필요합니다. 원문 작성자(jsgroth)가 잘 설명했듯, GBA의 사운드 하드웨어는 현대적인 DAC와는 거리가 멉니다.

  • PWM 방식: GBA는 최종 믹싱된 샘플을 PWM(Pulse-width modulation) 방식으로 출력합니다.
  • 낮은 샘플 레이트: 대부분의 게임은 10kHz ~ 14kHz 정도의 매우 낮은 샘플 레이트의 PCM 소스를 사용합니다.
  • Nearest Neighbor: 하드웨어는 이 낮은 샘플 레이트의 소스를 PWM 주파수(약 65kHz)로 업샘플링할 때, 별도의 보간 없이 Nearest Neighbor(최근접 이웃) 방식을 씁니다.

결과적으로 GBA의 사운드는 Aliasing(에일리어싱) 노이즈로 범벅이 됩니다. 계단 현상이 그대로 소리로 출력되는 셈이죠. 우리가 기억하는 GBA 특유의 ‘찌르르’하고 ‘거친’ 금속성 사운드는 바로 이 열악한 하드웨어 처리 방식 덕분입니다.

엔지니어링적 접근: “수학으로 고쳐보자”

작성자는 이 문제를 해결하기 위해, 하드웨어의 PWM 동작을 흉내 내는 대신 소프트웨어 보간법 을 적용했습니다. 소스 샘플 레이트를 파악해서 현대적인 오디오 출력(예: 48kHz)으로 바로 리샘플링하는 것이죠.

여기서 두 가지 알고리즘이 등장합니다.

  1. Cubic Hermite Interpolation: 인접한 4개의 점을 곡선으로 잇습니다. 적당히 부드럽지만 완벽하진 않습니다.
  2. Windowed Sinc Interpolation: 신호 처리 이론상 가장 완벽에 가까운 Band-limited 방식입니다. 나이퀴스트 주파수 이상의 모든 노이즈를 칼같이 잘라냅니다.

이론적으로는 Sinc 방식이 압도적으로 우월해야 합니다. Aliasing을 제거하고 원본 신호만 남기니까요. 그런데 막상 들어보면 충격적인 결과가 나옵니다.

왜 ‘고품질’ 필터가 소리를 망치는가?

블로그의 예시(Metroid: Zero Mission)를 들어보면, Sinc 필터를 적용한 버전이 원본보다 훨씬 “먹먹하게(Muffled)” 들립니다. 마치 물속에서 듣는 것 같죠.

이유는 간단합니다. GBA 게임의 원본 샘플 레이트는 13kHz 수준입니다. 즉, 유효한 주파수 대역이 6.5kHz밖에 안 된다는 뜻입니다. 인간의 가청 주파수가 20kHz까지인 걸 감안하면 턱없이 부족하죠.

  • 원본 하드웨어: Aliasing 노이즈가 고주파 대역을 가득 채웁니다. 비록 그것이 ‘노이즈’일지라도, 우리 뇌는 그 자글자글한 고음역을 ‘선명함’이나 ‘질감(Crunchiness)‘으로 인식합니다.
  • Sinc Interpolation: 수학적으로 완벽하게 6.5kHz 이상의 모든 소리를 제거합니다. 결과는? 고음이 싹둑 잘려 나간, 꽉 막힌 소리만 남습니다.

이것이 바로 “객관적 품질(Quality)”“주관적 경험(Experience)” 의 괴리입니다. 엔지니어링에서는 Signal-to-Noise Ratio(SNR)를 높이는 게 정답이지만, 아트의 영역에서는 그 Noise가 작품의 일부였던 겁니다.

Hacker News의 반응: 보존이냐 개선이냐

이 글에 대한 Hacker News의 반응은 그야말로 전쟁터입니다. 저도 댓글들을 읽으면서 몇 번이나 무릎을 쳤습니다.

한 유저는 이렇게 말합니다.

“원본의 Aliasing이 주는 그 거친 느낌(Crunchiness)이 감정을 고조시키는 도구입니다. 필터링 된 소리는 너무 부드러워서 긴장감이 없어요.”

또 다른 유저는 기술적인 통찰을 더합니다.

“Nearest Neighbor 방식이 만들어내는 이미징(Imaging) 노이즈가 고주파 대역을 채워줍니다. 이걸 제거하면 당연히 소리가 빈약하게 들리죠. 현대 코덱들이 쓰는 Spectral Band Replication 의 원시적인 형태라고 볼 수도 있습니다.”

반면, “나는 GBA에 대한 향수가 없어서 그런지, 깨끗한 소리가 훨씬 낫다”는 의견도 있습니다. 결국 Nostalgia(향수) 가 기술적 판단을 흐리게 만드는 것일 수도 있다는 지적이죠.

PSG 채널의 딜레마

더 골치 아픈 건 PCM 샘플이 아니라 PSG(Programmable Sound Generator), 즉 칩튠 사운드입니다. 사각파(Square Wave)는 본래 급격한 변화를 가져야 하는데, 여기에 섣불리 보간법을 적용하면 파형이 뭉개집니다.

작성자는 PSG 채널에 대해 2MHz로 오버샘플링 후 Low-pass Filter를 적용하는 방식을 제안합니다. 하지만 이마저도 문제가 있습니다. 고주파 성분이 사라지면 칩튠 특유의 날카로움이 사라지고, 일부 게임에서는 믹싱 밸런스가 무너집니다. Castlevania 같은 게임에서는 PSG가 멜로디를 리드하는데, 필터를 거치니 배경음 뒤로 숨어버리는 현상이 발생하죠.

마치며: 엔지니어의 오만함을 경계하라

저는 이 사례가 우리 엔지니어들에게 주는 교훈이 크다고 생각합니다. 우리는 종종 “수학적으로 더 나은 알고리즘” 이 무조건 더 좋은 결과를 낼 것이라 착각합니다. 하지만 사용자가 경험하는 최종 결과물(UX)은 수식 너머에 있습니다.

특히 레거시 시스템을 다룰 때, 그 시스템의 ‘결함(Artifact)‘조차도 사용자의 기억 속에 ‘기능(Feature)‘으로 자리 잡았을 수 있음을 명심해야 합니다. GBA의 그 거친 노이즈는 단순한 하드웨어의 한계가 아니라, 그 시대를 풍미했던 사운드 텍스처의 일부 였습니다.

제 개인적인 결론은 이렇습니다. “기본값은 원본 하드웨어(Accuracy)로 두되, 옵션은 제공하라.”

기술적으로는 Sinc Interpolation이 훌륭한 DSP 예제일지 몰라도, 제 귀에는 그 지글거리는 Aliasing 노이즈가 들려야 비로소 “아, 내가 GBA를 하고 있구나”라는 생각이 듭니다. 여러분의 생각은 어떠신가요?

References: