얼쑤의 연주 분석은 스테레오 녹음을 16kHz 모노 PCM으로 변환한 뒤 시작합니다. 두 채널을 같은 비중으로 평균 내는 동작을 검사하려고, 440Hz 사인파를 담은 44.1kHz·2초짜리 AAC 파일 두 개를 만들었습니다. 한 파일에는 왼쪽 채널에만 소리를 넣고, 다른 파일에는 양쪽에 같은 소리를 넣었습니다.
처음에는 두 출력의 RMS를 나눴습니다. RMS는 샘플을 제곱해 평균을 낸 뒤 제곱근을 구한 값으로, 여기서는 디코딩한 신호의 크기를 비교하는 데 썼습니다. 왼쪽만 소리가 나는 출력의 RMS를 양쪽에 같은 소리가 나는 출력으로 나눠 0.5 ± 0.05인지 확인했습니다. 리뷰어가 FFmpeg 필터를 두 채널의 합으로 바꿔도 이 검사는 통과했습니다.
RMS 비율에서 사라진 공통 계수
왼쪽의 사인파를 x라고 두면 한쪽 파일의 입력은 (x, 0), 양쪽 파일은 (x, x)입니다. 두 채널에 같은 계수 c를 곱해 더하면 출력은 각각 cx와 2cx입니다. 클리핑이 없는 선형 계산에서는 두 출력의 RMS 비율이 항상 0.5입니다. 평균의 계수 0.5와 합산의 계수 1.0이 나눗셈에서 모두 사라집니다.
| 변환 | 양쪽 소리 ÷ 모노 | 한쪽 소리 ÷ 모노 | 한쪽 소리 ÷ 양쪽 소리 |
|---|---|---|---|
| 두 채널 평균 | 1.0 | 0.5 | 0.5 |
| 두 채널 합산 | 2.0 | 1.0 | 0.5 |
표의 값은 같은 신호를 섞었을 때의 계산값입니다. 리뷰에서 확인한 관측은 합산으로 바꿔도 기존 0.5 비율 검사를 통과했다는 점입니다.
같은 사인파의 모노 RMS와 비교
같은 사인파를 담은 모노 AAC를 하나 더 만들고, 두 스테레오 출력의 RMS를 각각 모노 출력과 비교했습니다. 평균을 내면 양쪽에 같은 신호가 들어왔을 때는 모노와 같은 크기이고, 한쪽에만 신호가 들어왔을 때는 절반입니다.
level = rms(decode_recording(mono))
assert rms(decode_recording(both)) / level == pytest.approx(1.0, abs=0.05)
assert rms(decode_recording(left)) / level == pytest.approx(0.5, abs=0.05)
수정한 검사를 포함한 AI 테스트는 FFmpeg 8.0.1을 넣은 Linux ARM64 이미지에서 63개가 통과했습니다. 정상 구현이 위 허용 범위를 만족한 결과입니다. 수정한 검사에 합산 변형을 다시 넣었을 때의 RMS 숫자는 기록에 남아 있지 않습니다. 두 스테레오 출력을 서로 비교할 때 사라지던 배율이 모노 기준과의 두 비교에는 남습니다.

댓글
댓글과 반응은 GitHub 계정으로 로그인해 남길 수 있어요.