오디오 실시간 처리를 위해 AVAudioEngine에 대해 학습하려고 했더니 꼬리에 꼬리를 무는 배경 지식이 필요했다.
AVAudioEngine -> AVAudioNode -> AVAudioPCMBuffer -> Frame -> Sample -> ...
위와 같은 순서로 배경 지식에 대한 의존성이 발생했다.
이렇게 꼬리를 물며 학습해나가다 보니 오디오의 기본적인 개념에 도달하게 되었다.
Frame은 뭐고 Sample은 뭘까..
학부 시절에 배웠던 것 같지만, 너무나 희미했기에 처음부터 다시 정리해보기로 했다.
아날로그 신호와 샘플링(Sampling)
우리가 귀로 듣는 소리는 시간에 따라 연속적으로 변화하는 아날로그 신호이다.
이 소리를 디지털로 표현하려면, 숫자(수치)로 변환해야 하는데,
이 때 사용하는 방법이 바로 샘플링(Sampling) 이다.
일정한 시간 간격으로 소리의 진폭(Amplitude)을 측정해 수치로 변환하는 것이다.
샘플(Sample)
이렇게 측정된 하나하나의 값들을 샘플(Sample)이라고 부른다.
샘플링 레이트(Sampling Rate)
그리고 이때 1초 동안 몇 번을 측정할 것인지를 나타내는 단위가 바로 샘플링 레이트(Sampling Rate) 이다.
예를 들어, 1초에 44,100번 측정한다면 샘플링 레이트는 44,100Hz, 또는 44.1kHz라고 표현한다.
샘플링 레이트가 높을수록 소리가 원음 (아날로그 신호)에 가까워진다.
44.1 kHz 가 자주 사용되는 이유
인간의 가청 주파수 범위는 20Hz에서 최대 20kHz 이다.
이 대역폭에서 나이퀴스트 정리를 만족시키는 최소 샘플링 레이트는 40kHz이기 때문에, 44.1 kHz 가 주로 사용되는 것이다.
나이퀴스트 정리에서 2배의 샘플링 레이트가 필요한 이유
샘플링으로 아날로그 파형을 복원하려면, 파형의 모양을 정확히 재현해야 함.
예를 들어, 100Hz의 사인파는 1초에 100번 진동한다.
그러면 파형의 1 주기는 0.01초 가 된다.
이 파형을 정확히 표현하려면 최소 상승할 때 한 번, 하강할 때 한 번 측정해야 하므로,
1 주기당 최소 2개의 샘플이 필요한 것이다.
만약 2배보다 낮은 샘플링 레이트가 사용될 경우 엘리어싱이 발생할 수 있으며, 원래의 신호 정보가 완전히 복원되지 못할 수 있다고 한다.
이 때 소리가 어떻게 변할지 궁금하네요
채널(Channel)
음악을 듣다보면 소리가 좌우로 왔다갔다하는 패닝(Panning)을 경험할 수 있다.
또한 게임을 하다보면 다른 유저의 발소리가 어느 방향에서 나는지 구분할 수 있다.
이처럼 소리는 방향성과 공간감을 가질 수 있는데,
이를 디지털 오디오에서 표현하기 위해 채널(Channel)이란 개념이 사용된다.
가장 기본이 되는 채널 구성은 모노(Mono)와, 스테레오(Stereo)가 있다.
그리고 종종 들어봤을 2.1 채널, 5.1 채널, 7.1 채널 등도 다채널 오디오 구성이다.
- 모노(Mono): 1개의 채널로 모든 소리를 전달한다. (ex: 전화 통화, 라디오)
- 스테레오(Stereo): 2개의 채널(L, R)로 소리를 분리해 전달한다. (ex: 음악, 영화, 게임)
모노와 스테레오의 샘플 수 차이
스테레오는 왼쪽과 오른쪽 각각의 채널에 샘플이 필요하기 때문에,
모노에 비해 샘플 수가 2배로 필요하다.
예를 들어 샘플링 레이트가 44.1 kHz 라면,
모노는 초당 44,100개의 샘플을 처리하지만 스테레오는 초당 88,200개의 샘플을 처리하게 된다.
그만큼 오디오 데이터의 크기도 커지고 처리 부하도 커지게 된다.
프레임(Frame)
프레임(frame)은 한 시점의 전체 채널 값을 묶은 것으로,
모노의 경우 1프레임 = 1 샘플
스테레오의 경우 1프레임 = 2 샘플
이 된다.
비트 깊이(Bit Depth)
비트 깊이(Bit Depth)는 각 샘플을 얼마나 정밀하게 표현할 수 있는지를 나타낸다.
위 이미지는 4bit의 예시로 2^4 = 16단계로 진폭을 표현한다.
bit depth | 표현 단계 수 | 다이나믹 레인지 | 용도 |
---|---|---|---|
16 bit | 65,536 | ~96dB | CD, MP3, 음악 감상 |
24 bit | 16,777,216 | ~144dB | 스튜디오, 고음질 음원 |
32 bit float | 부동소수점(무한대에 가까움) | ~ 1500dB+ | 무손실 음원, 후처리 유리 |
다이나믹 레인지(Dynamic Range)
가장 작은 소리부터 가장 큰 소리까지 표현 가능한 음량(dB)의 범위
다이나믹 레인지(Dynamic Range)가 넓어야 작은 소리도 놓치지 않고, 큰 소리도 클리핑되지 않고 섬세하고 리얼하게 표현 가능
1bit = 약 6.02dB 의 다이나믹 레인지를 가짐
다이나믹 레인지 계산 공식
Dynamic Range (dB) = 20 * log10(Vmax / Vmin)
- Vmax : 가장 큰 진폭
- Vmin : 표현 가능한 최소 진폭
참고
https://www.youtube.com/watch?v=ZVw4xSrU6EQ
https://ko.wikipedia.org/wiki/%EC%83%98%ED%94%8C%EB%A7%81_%EC%86%8D%EB%8F%84
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=guburi&logNo=221369911121
https://en.wikipedia.org/wiki/Audio_bit_depth
https://miing95.tistory.com/18
'CS' 카테고리의 다른 글
SQL 기본 쿼리문 정리 (0) | 2024.08.05 |
---|---|
Heap이 Stack에 비해 느릴 수 밖에 없는 이유 (0) | 2024.07.21 |
객체 지향 프로그래밍을 설계할 때는 SOLID 원칙을 지켜야 한다. (0) | 2024.04.12 |
[컴퓨터 구조] 시스템 버스(System Bus) 및 동작 방식 (0) | 2024.03.12 |
[소프트웨어 공학] 블랙박스 테스트-1 (0) | 2022.11.07 |