같은 음표, 다른 소리: 처음에 잘못 측정했던 부분
528 Hz의 세 가지 파형은 모두 같은 음을 나타내지만, 소리는 전혀 다르게 들립니다. 그 이유를 파헤치다 보니 존재해서는 안 될 수치가 드러났고, 이를 처음 측정하려 했을 때는 잘못된 결과를 얻었습니다.
같은 주파수의 사인파와 구형파를 동시에 재생해도 아무도 이 둘을 혼동하지 않습니다. 하나는 부드럽고, 다른 하나는 거칠기 때문입니다. 하지만 악기에 어떤 음이 연주되고 있는지 물어보면, 두 경우 모두 같은 대답을 합니다.
바로 그 차이가 이 주제의 핵심입니다. 또한 그 차이로 인해 이론상으로는 애초에 존재해서는 안 될 수치를 발견하게 되었는데, 그 수치를 처음 측정했을 때 결과가 틀렸던 점은 조용히 수정하기보다는 오히려 공개할 만한 가치가 있는 사례였습니다.
음표가 소리와는 다르다
파이썬을 사용하여 528 Hz의 세 가지 파형(사인파, 구형파, 삼각파)을 생성하고, 각각에 대해 FFT를 실행해 봅니다. 세 파형 모두 528.00 Hz를 기본 주파수로 나타냅니다. 음표로 따지면 이 세 파형은 모두 동일합니다.
차이를 만드는 것은 기본 주파수보다 높은 모든 주파수입니다. 반복되는 파형은 해당 기본 주파수의 정수배에 해당하는 순수한 사인파가 겹쳐진 형태로 표현될 수 있습니다. 이러한 배수 주파수들을 고조파라고 하며, 어떤 고조파가 어떤 강도로 존재하느냐에 따라 귀는 이를 음색으로 인식합니다.
사각파의 경우, 오래전부터 정립된 명확한 법칙이 있습니다. 홀수 배수만 남으며, 각 배수는 기본파 진폭의 그 배수 자체의 역수에 해당하는 비율을 가집니다. 3차 고조파에서는 진폭의 3분의 1을, 5차 고조파에서는 5분의 1을 가집니다.
제 파일을 기준으로 측정한 결과:
| Harmonic | Predicted | Measured |
|---|---|---|
| 3rd | −9.5 dB | −9.5 dB |
| 5th | −14.0 dB | −14.0 dB |
| 7th | −16.9 dB | −16.9 dB |
| 9th | −19.1 dB | −19.1 dB |
이 규칙은 소수점 자리까지 적용됩니다. 그게 쉬운 부분입니다.
0이어야 했던 숫자
같은 규칙에 따르면 짝수 고조파는 아예 존재해서는 안 됩니다. 약간만 없는 것이 아니라, 아예 없어야 합니다.
그것들이 없는 것은 아닙니다. 제2고조파는 기본파보다 75.9 dB 낮은 위치에 있으며, 이는 약 6,000분의 1에 해당합니다. 아주 미미하고 들리지 않지만, 0은 아닙니다. 이론상으로는 0이어야 했습니다.
가장 유력한 원인은 측정 장비일 것입니다. 하지만 그렇지 않습니다. 순수한 사인파에 대해 동일한 측정을 수행해 보면, 같은 측정 구간에서 238 dB 낮은 수치가 나오는데, 이는 단순히 숫자 자체에서 발생하는 산술적 잡음에 불과합니다. 이 계측기는 이보다 훨씬 더 미세한 현상도 감지할 수 있습니다.
사실은, 샘플링된 사각파가 528 Hz 주기로 전혀 반복되지 않는다는 것이 정답입니다.
주파수와 샘플 레이트의 최대공약수를 구해 봅시다: gcd(528, 44100) = 12. 샘플 패턴은 초당 12번 정도만 반복되므로, 변환 결과로 나타나는 것은 깨끗한 고조파열이 아니라 12 Hz 간격으로 선이 나타나는 빗 모양입니다. 이 빗 모양의 선 중 일부는 고조파가 위치할 법한 지점 근처에 위치하며, 그중 하나가 짝수 빈에 나타납니다.
내가 잘못 생각했던 점
이 부분이 바로 이 영상에서 상당한 시간을 할애하고 있는 부분인데, 대부분의 채널이라면 이 부분을 편집해 버렸을 테니까요.
그 짝수 차 고조파에 대한 첫 번째 측정값은 −67.3 dB로 나왔고, 나는 이를 정답으로 적어 두었다.
그건 정답이 아니었다. 나는 예상 주파수를 중심으로 대략 ±14 Hz 폭의 창 내에서 피크를 찾아보았는데, 약간의 오차 정도는 용납될 것이라고 생각했기 때문이다. 하지만 빗살 선들은 12 Hz 간격으로 떨어져 있었다. 그 정도로 넓은 윈도우에는 반드시 인접한 빗살 선이 포함될 수밖에 없는데, 그 선의 신호 강도가 내가 실제로 목표로 했던 고조파보다 더 컸다. 측정 결과는 윈도우 내에서 가장 강한 신호를 충실히 보고했고, 나는 그것을 내가 묻고 싶었던 것으로 오해한 것이다.
주변에서 가장 큰 소리가 나는 곳이 아니라 정확한 빈에서 측정한 올바른 값은 −75.9 dB입니다. 제가 처음 스스로에게 공개했던 수치보다 8.5 데시벨 더 조용한 수치입니다.
이 글에서 얻을 수 있는 교훈은 이 파일을 넘어 더 광범위하게 적용됩니다. 허용 오차 범위는 무제한이 아닙니다. 안전을 위해 허용 오차 범위를 넓히면, 측정 결과가 원래 묻고자 했던 질문과는 다른 질문에 대한 답이 될 가능성이 높아집니다. 이 글에서 한 가지 실용적인 교훈을 얻으시려면, 바로 이 점을 명심하시기 바랍니다.
창을 더 넓게 열었더니 더 끔찍한 것을 발견했다
좁은 해석을 믿지 않고 전체적인 맥락을 살펴보니, 더 큰 인공물이 드러났는데, 이는 빗살무늬와는 전혀 관련이 없습니다.
사각파에는 무한히 많은 고조파가 존재합니다. 샘플링 주파수의 절반을 초과하는 모든 주파수는 표현될 수 없으며, 가청 주파수 범위로 다시 접혀 들어갑니다. 음높이가 높을수록 별도의 분석 없이도 이를 들을 수 있습니다. 3000 Hz의 사인파를 생성해 보면, 음 자체에는 없는 낮은 음이 그 밑에서 들립니다. 이것이 45 kHz인 15차 고조파가 900 Hz로 접혀 내려온 것으로, 연주되는 음보다 두 옥타브 낮은 음입니다.
528 Hz로 돌아가 보면, 가장 큰 폴드는 −33 dB에 위치합니다. 이는 제가 추적해 오던 짝수 고조파 아티팩트보다 40 데시벨 높은 수치입니다. 제가 아티팩트라고 부르던 것은 사실 가장 큰 것이 아니었습니다.
다음 두 가지 테스트를 통해 이것이 접힘 현상이며 다른 문제가 아님을 확인할 수 있습니다:
샘플링 주파수를 두 배로 늘리면, 매번 주파수 성분의 음량이 6데시벨씩 감소합니다. −33, −39, −45, −51. 이는 우연이 아닙니다. 더 이상 주파수 대역에 맞지 않는 첫 번째 고조파의 주파수가 두 배로 늘어나고, 주파수가 두 배로 높아진 고조파는 ‘1/n 법칙’에 따라 6데시벨 더 작아지기 때문입니다.
모두 들어맞는 사인파로 동일한 모양을 구성하면 — 무한 급수도 없고, 에일리어싱이 발생할 경계도 없으므로 — 소음 수준이 236 dB 낮아져 다시 산술 잡음 수준으로 돌아갑니다.
음색이 아닌 세 가지
음표가 아닙니다. 세 가지 음형 모두 528.00 Hz입니다. 악기에 어떤 소리가 나는지 물어보면, 세 번 모두 같은 대답이 돌아옵니다.
음량이 아닙니다. 피크 높이가 동일하게 설정된 경우, 사각파는 정현파보다 약 3 dB 더 많은 에너지를 지닙니다. 이는 사실이지만, 이는 크레스트 팩터(같은 에너지가 피크에 얼마나 밀집되어 있는지)의 차이일 뿐, 고조파가 음량을 증가시킨다는 증거는 아닙니다. 대신 두 파형의 에너지를 동일하게 맞추면, 사각파의 기본 주파수는 사인파보다 약 1 dB 낮은 위치에 놓이게 됩니다. 즉, 동일한 에너지가 더 많은 단계에 분산되어 있는 것입니다.
품질의 문제가 아닙니다. 어떤 음형도 더 풍부하거나, 더 순수하거나, 여러분에게 더 좋은 것은 아닙니다. 우리가 측정한 것은 계단식 분포를 보이는 에너지입니다 — 정사각형에는 여섯 개의 수치가, 삼각형에는 여섯 개의 서로 다른 수치가 있으며, 둘 모두 밑바탕에는 동일한 음이 깔려 있습니다. 이것이 안정된 음색에 대한 완전한 설명이며, 물리학이 뒷받침하는 주장은 바로 이것뿐입니다. 실제 악기는 연주 중에 변화하기도 하는데, 이는 별개의 문제입니다.
한 번 해보고, 정확한 빈을 확인해 보세요
네 줄. 초당 44,100 샘플의 속도로 528 Hz의 사각파를 생성하고, 이에 대한 FFT를 구한 뒤, 기본 주파수의 3배와 2배 지점에서 레벨을 읽어옵니다.
주변에서 가장 큰 소리가 나는 곳이 아니라 정확한 빈을 확인하세요. 그렇지 않으면 제가 저지른 실수를 반복하게 될 것입니다. 홀수 번호 빈에서는 −9.5 dB가, 짝수 번호 빈에서는 약 76 dB 낮은 수치가 나와야 합니다.
그런 다음 주파수를 변경하고 다시 실행해 보세요. −9.5는 100 Hz에서 1000 Hz 사이의 어느 범위에서도 움직이지 않을 것입니다. 이는 법칙이기 때문입니다. 짝수 값은 반드시 이동할 것이며, 실행하기 전에 그 위치를 예측할 수 있습니다. 주파수와 44,100의 최대공약수를 구하면, 그것이 샘플링 그리드가 추가하는 모든 요소의 간격이 됩니다.
위의 두 가지 수정 사항은 모두 공개된 영상 버전에 반영되어 있습니다. 올바른 수치와 함께 잘못된 수치를 함께 공개하는 것은 겸손함 때문이 아니라, 측정 결과를 주장한 당사자 이외의 다른 사람이 그 주장을 검증할 수 있는 유일한 방법이기 때문입니다.
참고 문헌
여기서 다루는 내용은 임상적 증거라기보다는 신호 처리의 기본 개념을 설명하는 것입니다: 이산 푸리에 변환과 그 빈 그리드(numpy.fft), 스펙트럼 누설과 윈도우 분해능, 나이퀴스트 한계와 에일리어싱, 그리고 n분의 1을 곱한 홀 고조파 진폭을 갖는 사각파의 푸리에 급수 등이 포함됩니다. numpy를 사용하여 구현되었으며, 측정 스크립트와 그 결과는 동반 동영상의 화면에 표시되어 있습니다.
오디오 신호 처리에 관한 교육용 콘텐츠입니다. 의학적 조언이 아닙니다.
Listen · FFT-verified session 같은 음표, 다른 소리: 처음에 잘못 측정했던 부분 Watch on YouTube →