힘내라 일처리

Audio Framework - 오디오 기본 본문

기록/오디오 프레임웍

Audio Framework - 오디오 기본

일처리 2023. 5. 23. 02:51
반응형

개요

회사를 이직하면서 이제 한동안 리눅스 및 안드로이드 환경에서 오디오 프레임웍을 다루게 될 일이 없어서 기록이라도 남겨 둘겸 글을 쓰고자 한다.

PCM - 가장 기본적인 오디오 데이터 인코딩 방식

(Pulse Code Modulation) 펄스 코드 변조라는 의미로, 현실 세계의 파형을 디지털화 해서 다룰 수 있도록 한 대상이라고 보면 된다.

현실의 오디오의 파형이 표본화 -> 양자화 -> 부호화 일렬의 과정을 거치면서 생성된 음성 데이터가 순서대로 나열된다고 생각 하면 된다.

 

다만 이렇게 저장된 PCM데이터를 다시 읽어들일때 필요한정보가 몇가지가 있다.

 

1. Sample Rate ( 1초에 몇번 샘플링을 했는지 )

아날로그 신호를 수집하는 속도에 대한 정보이다. 48KHz 로 수집했는데 44.1KHz로 재생하면 원래 녹음시간 보다 길게 재생될거고 말소리도 뭔가 늘려서 말하는 것처럼 들리게된다고 본다. 동일 시간 내에 수집된 횟수가 많을 수록 해상도가 좋아진다고 보면 된다.

PCM속도를 어느정도의 속도로 재생하면 좋은지에 대한 지표라고 보면 된다.

 

2. PCM Format (샘플링된 데이터를 어떻게 저장했는지)

수집된 하나의 값을 몇 비트로 저장 했는지에 대한 내용이다. 이는 오디오의 해상도에 직접적으로 연관이 된다, 바이트 수가 크면 클수록 전채 진폭에서 정확한 위치를 나타내기 유리하기 때문이다, PCM데이터는 결국 각 샘플 간의 구별없이 주욱 나열하기 때문에 2바이트씩 읽을 지 3바이트씩 읽을지 정확히 알아야 소리를 제대로 재생 할 수 있다.

 

3. Channel Count (마이크 몇개 썼고, 스피커 몇개 쓸건지)

요즘은 뭐 8채널 16채널 하면서 스피커가 너무 많다. 각 스피커에서 나올 소리들도 조금씩 다르기 때문에, 스피커의 갯수만큼 오디오가 전달이 되어야 한다. PCM데이터는 채널마다 샘플을 번갈아 가면서 저장한다 16bit pcm format에 2ch 이라면

L(2byte), R(2byte), L(2byte), R(2byte), L(2byte), R(2byte), L(2byte), R(2byte), L(2byte), R(2byte) ....

이렇게 소리가 기록된다. 읽을때도 이를 바탕으로 읽어야한다.

 

이런것들이 PCM 데이터를 쓰고, 읽을 때 고려되는 내용들이다.

다음에 소개 할건 PCM인코딩 방식을 사용하는 가장 대표적인 오디오 컨테이너 인 .wav 에 대해 설명하려고 한다. 

 

WAV - 가장 기본적인 오디오 컨테이너

가장 기본적이라는 것도 내기준이긴 하지만, 가장 흔히 보는 오디오 컨테이너 이니 이걸로 소개하고자 한다.

PCM 데이터만 있는 파일이 있으면 위에 서 이야기한 Sample Rate, PCM Format, Channel Count 에 대한 정보가 따로 필요하다.

WAV는 파일 헤더에 이러한 정보를 추가하고 뒤에 이어서 PCM 데이터를 넣어주는 구조를 가진다. 

 

내 서버에 있는 wav파일 아무거나 찾아서 hex view로 가져와 봤다. AOA 뭐라고 적힌거 보니까 아이돌 앨범 곡인듯.

괜히 보여줄려는거 말고 다른 복잡한게 있어서 좀더 단순한걸로 가져와야 겠다.

마음에 든다, 단순하고, 보기 좋다.

wav 파일 헤더에 대한 자료는 다음 링크를 보면 된다. 

https://docs.fileformat.com/audio/wav/

 

WAV - Waveform Audio File Format

Learn about WAV file format and APIs that can create and open WAV files.

docs.fileformat.com

이게 각 위치별 데이터가 무얼 나타내는 지에 대한 정보인데 이렇게 읽으면 된다.

 

진폭에 대해서 - 진폭과 음량의 관계?

일단 진폭과 우리 귀에서 들리는 음량의 상관 관계에 대해서 나타내면 얼추 이렇다.

베버-페히너의 법칙에 따라서 ( 얼추 사람의 감각기관은 로그 스케일이라 신호가 약할때 변화에 민감하고 신호가 크면 변화에 둔감해진다는 법칙 ) 소리를 받아들이고 인식한다.

그래서 진폭으로 정비례하게 올리면 사람 귀에는 초반에 급격히 커지고, 후반에는 천천히 커지는 것으로 보이게 된다.

고로, 지수 함수를 이용해서 소리를 키워야한다.

나름 정리한건데 이미지 크게 확대해서 보면 잘 보일거라 생각한다.

그리하여 오디오의 음량을 표현하는 단위는 데시벨 단위를 사용한다. 다만 이제 디지털 오디오 시스템에서는 약간의 차이가 있다.

디지털 출력 으로 나오는 음압은 전력량에 비례한다. 전류와 전압의 곱으로서 소비되는 에너지가 그대로 음압으로 나온다고 이해 하면 되는데,

 

이때 디지털 오디오 시스템 내부에서는 전압을 통해서 제어하기 때문에 로그 스케일이 달라진다.

 

전력에 의한 음압이, 소리의 크기가 10배가 될때, 10dB 가 되지만

전압을 기준으로 했을때 전압이 10배가 되면, 전력은 100배가 되고, 20dB가 된다.

 

이는 다음 수식으로 도출이 된다.

V=IR -> I=V/R,

W = I * V -> W = V/R * V -> W = V^2/R

R = 1 이고, V = 1 이 기준이라 했을때, 1 = 1^2/1, 100 = 10^2/1 이런식으로 실제 값이 100배로 뛰게 된다.

결국 전력 량은 전압의 제곱에 비례 하므로, 20Log(value/base) 기준으로 계산 하도록 해야한다.

 

여기서 추가로, 스피커에 출력되는 신호는 전압 신호이기 때문에 20Log 스케일 을 사용한다. ( 음량 20dB가 전압의 10배 ) 

 

또한 최대 진폭이 내는 최대 음량은 보통 최종 DAC와 AMP, 스피커가 결정 하기 때문에 소프트웨어 내부에서는 MAX치 기준으로 얼마나 줄어드는지 ~ 에 대한 목적으로 -dB 단위를 사용한다.

 

그래서 최대 음량을 기준으로 dB 를 계산 하고 싶다면 10^(dB/20) 의 수식을 이용 할 수 있다.

-20dB를 줄이고 싶다면 10^(-20/20) = 0.1 로 계산이 된다.

 

결국 최대 음량 기준 -20dB를 줄인 오디오 pcm 을 만들고 싶다면, 각 샘플에 대해 0.1을 곱하는 방식으로 계산이 가능하다.

 

여기서는 pcm볼륨을 조절하지만 오디오 장치의 볼륨을 조절 할때도 사용하니 해당 수식은 잊지 않고 기억하면 유리하다.

 

다음에는 실제 alsa와 같은 리눅스 디바이스에서 오디오를 재생할때 사용되는 요소들에 대해 설명하고자 한다.

 

버퍼 레이턴시 피리어드 피리어드 카운트 등등... 

반응형
Comments