오늘은 AVAudioPCMBuffer에 대하여 알아보자.
audio의 연속적인 analog data를 sampling과 quantization을 거쳐서 digital data로, 즉, descrete value로 만들었다.
quantization을 세밀하게 하기 위해선 bit depth의 개념이 필요하다.
Bit depth가 16bits이면, 16비트(약 65536 levels)의 값으로 dicrete하게 양자화된다는 개념이다.
32bits로 양자화하게 되면 그만큼 더욱 세밀한 값으로 data를 만들 수 있다는 말이 된다.
그럼 이렇게 만든 data를 AVAudioPCMBuffer로 만든다는 개념은?
설명해보자면
AVAudioPCMBuffer는 인접한 메모리 블록에 저장된 audio sample의 1-dimensional array로 생각할 수 있으며 sample 순서는 channel 레이아웃과 buffer의 audio format에 따라 결정된다. buffer의 특정 구조와 레이아웃은 audio format과 audio data의 channelCount에 따라 달라진다.
그리고 이 buffer에 접근할 때는 pointer를 사용해서 접근한다. 이 때 사용하는 pointer가 floatChannelData이다.
frameCapacity 속성은 buffer가 보유할 수 있는 최대 audio frameCount를 나타내고, frameLength는 현재 buffer에 저장된 audio data의 실제 frame 수를 나타낸다.
정리하자면, AVAudioPCMBuffer는 channelCount, AudioFormat에 따라 구조가 달라지며, buffer에 접근하기 위해서 floatChannelData를 사용한다. 그리고 하나 더, AVAudioPCMBuffer를 사용하게 될 시 자동으로 Swift 내부에서 ADC, DAC과정을 거쳐서 연속 데이터를 이진수로 변환하고, 이진수를 연속 데이터로 변환하는 과정을 거친다.
audio data는 sampling하는 과정에서 데이터가 왜곡될 수 있기 때문에 데이터를 잘 처리해야 한다. audio data 관련 논문을 더 찾아봐야겠다.