코어 오디오 - 사운드 파일 생성 하기

 

 

소리이야기

컴퓨터의 디지털 속성은 연속적인 아날로그 시그널을 처리하기에는 적합하지 않다. 이런 사실은 신호를 샘플링하거나, 사람의 귀로는 차이를 알 수 없게 부드러운 소리 파형을 충분히 잘게 자르는 방법으로 처리된다.

 

 

소리가 전해지는 법

 

 

사운드의 기본 요소

사운드의 기본 요소

 

디지털 사운드로의 변환

ADC(Analog-to-Digital Converter)

DAC(Digital-to-Analog Converter)

 

디지털 변환 과정

-표본화, 양자화, 부호화 과정 필

아날로그 신호와 디지털 신호 간의 변환 과정

 

표본화(Sampling)

아날로그 파형을 디지털 형태로 변환하기 위해 표본을 취하는 것

 

표본화율(Sampling Rate)

1초 동안에 취한 표본수 (단위: Hz)

표본화율이 높을수록 원음을 잘 표현하나 데이터 공간은 증가

 

양자화 (Quantizing)

 

어느 정도의 정밀도로 표현할 것인지
-표본화된 각 점에서 값을 표현하기 위해 사용되는 비트 수

 

음의 해상도

-표본화하는 정밀도 (Sampling Resolution, Sampling Size)

-8 bit로 양자화 하면 값을 256(28) 단계로 표현 가능

-16bit로 양자화 하면 좀 더 세밀한 65,536(216) 단계로 값 표현 가능

 

 

표본화 및 양자화 정도에 따른 비교

 

부호화 (Coding)

표본화와 양자화를 거친 디지털 정보를 표현하는 과정

사운드 파일은 크기 때문에 부호화 과정에서 압축하여 저장

 

 

 

디지털 사운드 파일의 크기

 

 

파일의 크기

= 표본화율 x 해상도 x 모드(mono=1, stereo=2) x 시간(초)

 

1분 길이의 음악 CD

= 44,100(Hz) x 16(bit) x 2(stereo) x 60(초)

= 84,672,000bit

= 10,584,000 byte ≒ 10.6 MB

 

CD 한 장의 용량이 650MB이므로 그 안에는 약 10곡에서 15곡의 음악이 저장 가능

 

 

사운드의 기본 요소 - 용어

 

매체: 서로 가까이 있어서 밀치기에 충분한 여러 객체(공기입자)

사이클: 밀쳐진 객체의 이동

구간(주기) : 사이클을 완료하는데 걸린 시간

압축파형 : 어떤 객체를 반복적으로 밀어낸다면, 객체들이 서로 간에 밀어내는 패턴

파형의 크기 : 밀치는 강도

밀치는 속도 : 파형의 주파수(더 자주 밀칠 수록 파형의 주파수는 높아진다.)

 

 

디지털 오디오

(초당 샘플로 표현되는) 샘플율에 곱해진 (샘플당 비트로 표현되는) 비트깊이는 (초당 비트로 표현되는) 비트율이 된다. 비트율은 오디오의 1초를 나타내는 데 요구되는 비트의 수다. 높은 비트율은 높은 품질의 녹음을 제공하지만, 하드웨어가 더 많이 저장하고 처리해야 함을 의미 한다.

 

오디오 형식은 일반적으로 채널당 하나의 샘플을 프레임으로 합친다. 프레임은 시간 영역의 한 순간에 모든 오디오 채널을 나타낸다. 따라서 모노 사운드에 대해서 프레임은 하나의 샘플을 가진다. 스테레오는 두 개를 가진다. 하나의 시스템에 여러 소리 채널을 넣을 경우 채널이 배정 됐다고 한다. 어떤 오디오 형식은 여러 프레임을 패킷으로 합친다. LPCM(선형 펄스 코드 변조)은 패킷을 사용하지 않지만, 압축된 오디오 형식은 값을 근사하기 위해서 샘플의 그룹으로 수학적인 기법을 사용하기 때문에 이를 사용한다. 주어진 샘플은 주변의 샘플로 어느정도 예상이 가능하기 때문에, 압축 포맷은 압축되지 않은 LPCM 보다 훨씬 적은 데이터를 사용하여 유사한 파형을 만들기 위해서 정렬된 프레임에서 샘플 그룹을 사용할 수 있다.

 

위에서 어떤 형식으로 오디오를 나타내기 위해서 주어진 구간동안 데이터의 양을 나타내는 비트율에 대해서 언급하였다. PCM에서 비트율은 고정된 상수다. 즉, CD 품질 오디오는 초당 2채널 * 16비트 * 44,100 샘플을 가지기 때문에 초당 1,411,200비티율이나 , 1,411kbps를 가진다. 이 데이터율은 주어진 채널 수, 비트 깊이, 샘플율의 조합에 대해서는 절대로 변경되지 않기 때문에 PCM은 고정된 비트율을 가졌다고 한다. 압축 포맷은 가변 비트율을 가지며, 이는 데이터의 특정 부분을 압축하는데 필요한 데이터의 양이 변경됨을 의미한다. 코어 오디오는 가변 프레임율 형식을 지원한다. 즉, 어떤 주어진 프레임에 대한 데이터의 양은 가변이지만, 패킷은 동일한 크기로 유지된다. 코어 오디오는 패킷 비율이 변하더라도 가변 패킷율을 지원한다.

 

 

Viewcontroller.h

 

Viewcontroller.m

 

사각파형

 

톱니파형

 

사인파형

 

 

버퍼

한 번에 하나의 샘플을 읽거나 쓰는것은 배우 비효율적이다. AudioFileWriteByte를 생각해보면, 마지막 두개의 파라미터는 파일에 작성할 바이트의 수와 샘플의 포인터다. 한번에 하나의 샘플을 파일에 쓰고, 샘플 예제에 200,000 이상 함수 호출의 오버헤드를 가지는 대신에 여러 샘플을 가질 수 있는 메모리 버퍼를 만들고, 한번에 파일에 쓸 수도 있다.

 

 

오디오 형식

mp3 파일은 pcm이나 윈도우 미디어 데이터를 포함할 수 없고, 오직 mp3데이터만 저장 가능하다. aiff 파일은 pcm 오디오 데이터를 다루지만, 빅엔디언일 경우만 가능하다. 반대로 wav 파일의 pcm은 리틀엔디언 이어야 한다. 다른 파일 형식은 이런 데이터 형식이 둔감하고, 여러 데이터 형식을 다룬다. 예를들어 mp4 파일 형식은 aac, pcm, ac3를 포함하는 여러 데이터 형식을 포함할 수 있다. 코어오디오에서는 caf 가 제일 둔감하다. mp3, aac 등 모든 오디오 형식을 포함한다.

 

 

 

 

CoreAudio123.zip
4.07MB

 

 

 

참고

https://slidesplayer.org/slide/14470501/

https://evan-moon.github.io/2019/07/10/javascript-audio-waveform/