일반 강좌
  • 댓글

ETC.
샘플레이트, 비트뎁스, 비트레이트, 64비트 부동소수점 연산, 디더링

페이지 정보

댓글 1
  • 본문

    2022년 작성당시 게시판 사용방법의 문제로 글이 잘게 나뉘어 있는 문제가 있어 요약하여 통합본으로 다시 올립니다.



    1. 디지털 시대의 음악제작 소프트웨어


    실시간으로 소리를 녹음하거나 재생하는 소프트웨어에서 시간 요소는 가장 최우선 되는 사항입니다. 하드웨어와 알고리즘이 허용 하는 범위 내에서 최상의 품질로 녹음과 재생이 이루어지기를 기대하기 마련이지만 시간의 흐름을 따라잡지 못하게 되면 다른 모든 노력은 무의미해지므로 악기나 트랙의 수, 샘플레이트나 비트뎁스 등 모든 제반 요소는 시간을 지키기 위해서라면 언제라도 스스로를 희생할 준비가 되어 있어야합니다.


    디지털 레코딩이 대두되던 초창기에는 디지털 레코딩은 데이터 보존성이 뛰어나며 미래지향적이라는 인식은 있었지만 오디오 품질 자체가 그리 뛰어나지는 못했기 때문에 오히려 아날로그를 일컬어 특정한 해상도에 얽매이지 않으므로 한 없이 자연스러움을 표현할 수 있는 방식이라고 여겨지기도 했던 것 같습니다. 사실인 것 같으면서도 아리송한 표현입니다.


    음악을 기록하고 재생하는 테크놀로지에 있어서 가장 중요한 키워드는 재현성입니다. 100을 입력하여 기록된 것이 온전히 100으로 다루어지고 원본 그대로 100으로 재현될 수 있는가의 문제입니다.


    최신 저장장치인 SSD는 메모리 칩에 직접 데이터를 저장하지만 다소 구식인 HDD나 자기테이프는 자기의 N극과 S극을 테이프에 기록합니다. 0과 1의 디지털 처럼 다루어지는 신호인 것은 분명하지만 보존성이 취약하고 쓰기와 읽기의 해상도의 명확한 경계를 가지기 어려운 이 기록방식 자체는 아날로그입니다. 프린터로 종이에 그림을 인쇄하면 종이는 하얀색이고 잉크는 검은색인 것과 같아서 검은 잉크로 정해진 DPI로 무언가를 디지털적으로 인쇄하더라도 종이는 완벽하게 고른 평면이 아니며 잉크는 번진다는 사실에 의해 인쇄물은 엄밀한 의미에서의 정확한 해상도를 제공할 수 없고 무한한 해상도에 대응되는 벡터그래픽 이미지가 될 수도 없습니다.


    이렇게 아날로그적인 방식으로 기록된 디지털데이터를 100%의 정확도로 다시 읽어내기 위해서는 어느 정도의 타협적인 밀도의 기준이 필요합니다. 마치 다항함수로 무한한 해상도로 그려진 곡선의 특정부위의 기울기를 알아내기 위해 미분을 하는 것과 비슷합니다.


    다른 한 예로, 이메일 시대 이전 팩스로 문서를 주고 받던 시절에는 종이에 인쇄된 이미지를 스캔하여 디지털데이터로 만들고 전화선으로 전송한 다음 그 역순으로 다시 이미지를 재현해야 했는데, 스캐너는 아날로그에 가까운 방식으로 인쇄물을 읽고, 전화선은 아날로그적인 방식으로 상당한 전송손실을 수반하는 방식으로 데이터를 전송합니다. 이렇게 수신된 팩스 메시지는 원본 이미지를 100% 재현해주지 못합니다. 팩시밀리라는 장치의 성능표기에도 해상도라는 표현이 사용되지만 그것은 그 해상도 대로 기록되고 그대로 재현된다는 것을 의미하는 것은 아닙니다.


    단순한 숫자열 데이터를 100% 정확하게 읽어들일 수 있도록 고안된 바코드나 QR 코드도 온전한 디지털 방식으로 기록되는 것은 아니지만 평균적인 하드웨어와 소프트웨어의 허용 범위 내에서 인쇄된 패턴이나 선의 굵기와 간격을 정확하게 인지할 수 있는 안전한 밀도의 기준을 적용하여 디지털 데이터로 변환해줍니다.


    다시 오디오로 돌아가서 생각해보면, 멋진 바이올린 연주를 자신의 귀로 현장에서 직접 듣는 것을 온전한 아날로그적인 감상이라고 가정하겠습니다. 물론 사람마다 위치가 다르고, 거리나 방향도 다르며, 고역감쇠의 차이라든가, 온습도, 사람마다 조금씩 다른 의복이나 체형, 고막, 그 밖에도 다양한 개인적인 변수를 달리 가지고 있으므로 어디까지나 각자의 개인적인 입장에서의 온전함입니다.


    이 온전한 아날로그 사운드를 고품질의 마이크로 수음하고 또 고품질의 아날로그 장치로 처리하여 대단한 성능의 앰프를 거친 다음 최고품질의 라우드 스피커로 소리를 내어 감상해봅시다. 아니면 디지털 데이터로 변환하여 기록해두었다가 뛰어난 품질의 재생장치로 다시 재생하는 경우도 생각해봅시다. 아날로그와 디지털의 명확한 차이가 머리에 그려지는 것 같지만, 혹시 이것은 붓으로 종이에 그려낸 완벽한 그림을 아날로그 방식으로 계산된 타협적인 밀도의 해상도로 스캔하고 디지털데이터로 변환한 다음, 다시 훌륭하기는 하지만 그렇다고 100% 수준의 완벽한 재현성을 보장하지는 않는 장치들로 그려낸 결과물, 자세히 보면 색과 색 사이의 경계가 흐릿하지만 전체적으로 보면 상당히 멋진 작품인 것은 분명한, 혹시 그런 느낌의 차이에 불과한 것은 아닐까요?




    2. 샘플레이트(Sample Rate), 비트뎁스(Bit Depth), 비트레이트(Bit Rate)


    오디오의 해상도나 음질을 이야기할 때 샘플레이트(Sample Rate)나 비트뎁스(Bit Depth), 비트레이트(Bit Rate)라는 표현이 등장합니다. 비트라는 표현이 자주 등장해서 혼동의 소지가 있는데 64비트로 동작하는 컴퓨터나 32비트 부동소수점 연산을 하는 DAW의 그 비트와는 전혀 다른 이야기입니다.


    44.1kHz/16-bit 이상의 샘플레이트와 비트뎁스로 기록된 것을 HD 오디오라고 부르는 것 같습니다. 여기서 레이트(Rate)는 시간축을 잘게 나눈 단위이며 뎁스(Depth)는 동시에 처리되는 데이터의 분할단위입니다.


    - 샘플레이트가 44.1kHz라면 오디오 파형을 초당 44.1kHz = 44100회의 샘플레이트로 기록한 것입니다.

    - 비트뎁스가 16비트라면 매 회의 기록에서 샘플을 16비트의 해상도로 기록했다는 의미가 됩니다.


    이렇게 기록된 데이터를 실시간으로 전송하여 동일한 음질로 음악을 듣기 위해서는 어느 정도의 전송속도로 데이터가 전송되어야만 하는지 계산을 해볼 필요가 있는데 여기서 비트레이트가 등장합니다.


    44100 x 16 = 705600, 그리고 좌우 x2 해서 1,411,200 = 1.4Mbps


    즉, 44.1kHz/16-bit 음질의 오디오를 실시간으로 끊김 없이 전송하여 감상할 수 있게 하려면 초당 전송속도가 1.4Mbps 이상의 비트레이트가 확보되어야 합니다.


    비트레이트라는 표현에 비트(bit)라는 단어가 들어 있어어 왠지 2진수 변환을 기준으로 1K를 1024로 해석하고 싶어질 수도 있지만 비트레이트의 단위는 SI-unit이므로 Kbps나 Mbps는 Kg이나 Km의 단위와 마찬가지로 x1,000 및 x1,000,000을 의미합니다.


    평범한 인간이 20-20kHz 범위를 들을 수 있다고 할 때 이 가청주파수의 상한으로 알려진 20kHz의 배수를 충족시킨다는 의미에서 44.1KHz나 48KHz가 널리 사용되게 된 것인데 그 중 44,100처럼 어정쩡한 숫자가 나온 것은 과거의 기록장치들과의 호환성 유지를 위해 결정된 표준이라고 합니다.


    여기서 디지털 오디오의 해상도를 결정하는 중요 요소는 물론 샘플레이트(Sample Rate)와 비트뎁스(Bit Depth)입니다.




    3. 64비트 부동소수점 연산


    스튜디오원은 내부적으로 64비트 부동소수점 연산을 하는 믹스엔진을 갖추고 있습니다. 컴퓨터가 숫자를 다루는 방법을 이야기하려면 우선 대부분의 고수준 컴퓨터 언어의 데이터 타입에 대한 이해가 필요합니다.


    짧게 요약하자면 0이나 1의 이진수 1자리를 비트(Bit)라고 하고, 이진수 4자리는 니블(Nibble)이라고 부르며 16(0~15)가지 수, 니블 2개를 묶은 1바이트(Byte)는 256(0~255)가지 숫자를 표현할 수 있습니다. 니블 하나를 1자리의 16진수(0~F)로 표기할 수도 있습니다. 집적회로나 트랜지스터나 다이오드나 진공관이나 뭐가 됐든 간에 우리가 사용하는 이 기계는 대단히 많은 스위치들이 열려 있거나 닫혀 있는 상태를 유지하면서, 혹은 조작하고 변경하면서 데이터를 저장하고 논리회로를 구사하여 이들 데이터의 연산을 행하게 됩니다. 1과 0으로만 이루어진 이진수는 여기에 안성맞춤입니다. 그렇지만 한편으로는 이진수는 음의 정수라든가 소수점 이하의 자릿수에 값을 가지는 실수를 표현하기가 영 좋지 않습니다.


    음수를 이진수로 표현하려면 비트 하나를 사인비트(Sign Bit)로 만들고 보수를 적용하는 방법 등을 사용하여 비교적 쉽게 다룰 수 있는데, 실수의 경우는 좀 복잡한 문제가 있습니다.


    정수에서는 예를 들어 25와 29 사이에는 3개의 수만 존재합니다. 연산의 대상이 되는 숫자가 256보다 작다면 이 숫자를 이진수로 변환하여 메모리에 저장하기 위해서 1바이트의 데이터 타입을 취하여 변환하고 2진수로 8자리가 들어가는 공간 (좀 더 물리적으로 표현하면 온/오프 스위치 8개의 상태를 저장할 수 있는 공간)을 마련해두면 됩니다. 곱셈은 좀 번거로운 절차가 필요하지만 25 + 38을 계산하려면 25를 담을 1바이트, 38을 담을 1바이트의 메모리 공간, 그리고 25와 38을 더하는 연산을 하기 위한 버퍼를 위해 RAM이라든가 CPU의 고속 레지스터를 준비하고, 그리고 연산자 명령어를 기록하고 입출력을 다룰 공간 같은 것을 준비할 겁니다.


    그런데 실수가 되면 이야기가 달라집니다. 25와 29사이에 무한하게 많은 수가 있을 수 있게 되기 때문에 그 저장단위의 크기를 미리 확정하기 어려워집니다. 소수점 이하 몇 자리까지를 준비해야 할 지를 모르게 되어 준비해야 하는 데이터타입의 크기도 알 수 없습니다. 그래서 계산의 정확도를 약간 희생시키더라도 고정소수점으로 소수점 이하 3자리까지 다루겠다고 하면 4바이트 정도로 해결 될 겁니다. 소수점 이하 8자리나 10자리라고 하면 좀 더 정확도가 높아지지만 그만큼 준비해야 하는 메모리 공간이 커지겠죠. 그런데 숫자가 단순히 25인데도 이것을 25.00000000 으로 표현해서 기록하는 것은 메모리 공간의 엄청난 낭비를 초래합니다. 그래서 가수와 지수를 결합한 부동소수점이라는 개념이 도입됩니다.


    부동소수점이라는 개념의 도입은 메모리를 효율적으로 사용한다는 의미도 있고 계산의 정밀도라는 점에서도 의미가 있을 겁니다. 그런데 유효숫자의 범위에 따라 정도의 차이가 있지만 실수는 이진수 연산에서 필연적으로 오차를 수반합니다. 여러가지 방법으로 해결하고는 있지만 모든 수를 무한소수처럼 취급하면서 발생하는 오차로 간단한 덧셈도 틀리는 경우가 있습니다.


    간혹 선전문구에서 64비트라는 표현이 남용되는 경우가 있어 혼란을 초래하기도 하는데 [64비트를 지원하는 DAW]와 [64비트 부동소수점 연산을 행하는 믹스엔진을 갖춘 DAW]라는 표현은 서로 전혀 다른 의미라는 점에는 주의할 필요가 있습니다. 마치 음성출력과 소비전력의 와트같은 관계입니다. 64비트를 지원한다는 것은 OS에서 정수처리를 64비트로 행하는 아키텍처를 말하는 것이므로 오디오 데이터에 대한 프로세스와는 관계가 없습니다.


    디지털이 아무리 기록한 그대로 100% 재현할 수 있도록 고안되었다고 해도 디지털 오디오 시그널을 다루는 프로세스라면 그것이 소프트웨어든 하드웨어든 매 프로세스 단계마다 필연적으로 음질 열화를 수반할 수밖에 없습니다. 그리고 각 제품 제조사마다 독자적인 알고리즘을 적용하여 엔진을 설계했을 것이므로 그 음질의 열화 패턴도 제각각 다를 것이고 음질이나 음색 차이도 나타날 것입니다.


    오디오 엔진이 64비트 부동소수점 연산을 행한다는 이유로 음질이 더 좋아지는가 하면 그렇지는 않습니다. 잘 만들어진 우수한 오디오엔진이 음질향상을 가져다 줄 수는 있지만, 내부 연산이 64비트 부동소수점으로 이루어진다는 것은 별개 이야기입니다. 64비트 부동소수점 연산은 더 나빠질 수도 있었던 것을 "덜 나빠지게" 해주는 역할에 가깝습니다.


    정수비트로 음량을 조작하면 원래의 파형으로 그대로 복원할 수 없게 됩니다. 그래서 32비트 부동소수점 파일을 64비트 부동소수점 연산 믹서로 처리하려고 하는 것입니다. 2x3의 연산을 하기 위해 2.0000x3.0000으로 연산하는 것과 같습니다. 당연히 동일한 6의 결과가 나와야 하지만 그렇지 않은 경우도 종종 발생합니다. 


    특정 해상도의 샘플을 바운스해보면 원본과 약간씩 차이가 있는 경우가 있습니다. 연산상의 오차로 원본에서는 아무 것도 없던 대역에 소위 양자화 노이즈라는 것이 생겨나거나 하는 경우가 있습니다. 그리고 이 오차는 64비트 부동소수점 연산으로 상당히 줄어듭니다. 하지만 오차가 0%인 것은 아니기 때문에 가청주파수를 벗어난 아주 극한 저역대에 뭔가가 생겨나는 경우가 있고 이것이 가청영역에 영향을 주어 음색의 아주 미묘한 차이를 초래하거나 하는 경우는 있을 수 있다고 생각합니다. 이런 것이 DAW (또는 다른 여러 음향 장비들) 마다의 개성을 가르는 것일지도 모릅니다. 


    24비트로 컨버팅된 시그널은 디지털 데이터로 변환되기 위해 가장 가까운 32비트 부동소수점으로 기록될 것입니다. 이 과정에서 양자오차가 발생합니다. 그런데 32비트를 64비트로 다루는 경우는 정확히 2배의 데이터 타입으로 다루어지는 것 인데도 불구하고 오차가 발생합니다. 그렇지만 그 오차의 폭은 현저하게 줄어듭니다.




    4. 디더링(Dithering)


    그림이나 사진파일을 화면으로 볼 때 작은 크기로 연속되는 패턴, 예를 들어 작은 크기의 체크무늬 옷을 입은 사람의 사진을 찍고 사진을 어정쩡하게 축소하면 무와레(moiré) 패턴이라는 현상이 나타나기도 합니다.

    오선지처럼 가는 선들이 빼곡하게 그려져 있는 그림을 축소하면 검은 선이나 그 사이의 하얀 선 일부가 불규칙하게 사라질 수도 있습니다. 50%로 정수배로 축소되면 그 중 정확히 절반만 사라질 수도 있을 겁니다. 이렇게 축소된 파일을 다시 확대하더라도 일단 사라진 데이터가 다시 나타나주지는 않습니다.


    샘플레이트나 비트뎁스의 컨버팅에는 이러한 문제점이 존재합니다. 아무리 64비트 부동소수점 연산으로 정밀도를 높인다고 해도 이러한 리사이징의 변환과정에서의 열화는 피할 수 없습니다. 그리고 때로는 위의 검은선이 듬성듬성 사라지는 오선지처럼 아주 듣기 불편한 사운드를 만들어 버릴 수도 있습니다.


    여기서 디더링(Dithering)이라는 개념이 등장합니다. 디더링은 이미지 변환이나 오디오 변환 등 여러가지 분야에서 사용되는 표현인데 폰트 외곽의 계단현상을 완화하려고 안티에일리어싱(Anti-Aliasing) 옵션에 체크를 하는 것과 비슷합니다. 디더링은 특정 패턴의 노이즈를 미리 대입하여 이미지나 오디오시그널을 처리(주로 포맷변환)하는 과정에서 발생하는 부자연스러운 경계를 약간 문질러주는 것이라고 이해할 수 있습니다.


    여러분이 오래된 중고차를 운전하고 가다가 접촉사고를 당해서 철판에 크게 움푹 파인 곳(Dent)이 생겼다고 가정하겠습니다. 차가 오래된 것이라서 제대로 수리를 하기에는 비용이 아까웠기 때문에 직접 망치를 들고 철판을 펴보기로 결심합니다. 안팎에서 100번 정도 톡톡 두드리다보면 크게 파인 부분은 어느 정도 평평하게 돌아왔겠지만 대신 100여곳 이상의 자잘한 덴트가 생겼을 겁니다. 디더링은 이런 방식으로 자잘한 노이즈를 넣어 크게 튀는 노이즈를 줄이는 효과를 가져다 줍니다.


    고정소수점과 부동소수점 연산의 차이와 마찬가지로 디더링도 상황에 따라서 좋은 효과를 얻을 수도 있고 반대로 역효과를 초래할 수도 있습니다. 그렇지만 대부분의 경우 디더링의 양자화노이즈가 오디오의 해상도를 떨어뜨리는 부분을 가려주고 음질을 상당히 개선시켜준다고 보아도 될 것입니다. 이처럼 비트뎁스나 디더링에는 양자화(Quantization)라는 표현이 등장합니다. 이 퀀타이즈라는 표현은 스튜디오원과 같은 DAW나 시퀀싱 소프트웨어에서 미디노트를 입력해보신 분이라면 누구나 익숙하게 알고 사용하는 것입니다. 16분음표의 해상도로 기록된 음표들을 8분음표에 맞추어 스냅시키거나, 반대로 8분음표를 16분음표에 맞추는 것은 간단한 정배수의 조작입니다. 그렇지만 3/5/7 잇단음과 같은 홀수 음표들을 16분음표 등에 맞추어 퀀타이즈하게 되면 각 음표가 적당히 가까운 값으로 이동하는 과정에서 불규칙한 패턴이 만들어지기도 하고 여러 음표가 의도치 않게 겹치거나 할 수도 있습니다. 24비트로 녹음된 오디오를 처리하기 위해 32비트 연산을 행하거나 32비트의 디지털데이터로 저장되는 경우도 마찬가지이며 특정 비트뎁스의 시그널을 정배수가 아닌 다른 비트뎁스로 변환하는 경우도 비슷한 현상을 초래할 수 있습니다.


    포맷과 포맷 사이의 변환에서는 다른 부작용들이 나타나기 쉬우므로 디더링의 대상이 되지 않는 경우가 많습니다. 그리고 비트뎁스의 변환에서도 디더링은 대부분은 낮은 쪽 비트뎁스로 변환될 때, 그리고 그것도 가장 마지막 과정에 이루어져야 합니다. 일단 디더링이 이루어진 오디오는 노이즈가 추가된 만큼 원본으로 돌아갈 수 없습니다.

    댓글 (1)
    프로필이미지

    사운더님의 댓글

    처음부터 끝까지 모두 정독했습니다.
    빌드업부터 마무리까지 엄청난 내공이 느껴지네요.
    좋은 강좌 감사합니다.

    공지글

    무료/할인



    질문&답변


    자유광장

    뉴스



    최근글

    새댓글

    알림 0