Android는 내부적으로 다양한 오디오 데이터 형식을 사용하며, 이러한 데이터 형식의 하위 집합을 공개 API, 파일 형식, 하드웨어 추상화 계층(HAL)에 노출합니다.
속성
오디오 데이터 형식은 다음과 같이 속성별로 분류됩니다.
- 압축
- 비압축, 무손실 압축 또는 손실(lossy) 압축이 있습니다. PCM은 가장 일반적인 비압축 오디오 형식입니다. FLAC은 무손실 압축 형식이지만 MP3 및 AAC는 손실(lossy) 압축 형식입니다.
- 비트 심도
- 오디오 샘플당 중요 비트 수입니다.
- 컨테이너 크기
- 샘플을 저장하거나 전송하는 데 사용되는 비트 수입니다. 대개 비트 심도와 동일하지만, 정렬에 추가 패딩 비트가 할당되는 경우도 있습니다. 예를 들어 24비트 샘플은 32비트 단어 내에 포함될 수 있습니다.
- 정렬
- 컨테이너 크기가 비트 심도와 정확하게 동일한 경우 패킹되었다(packed)고 표현합니다. 그렇지 않은 경우에는 언패킹되었다(unpacked)고 표현합니다. 샘플의 중요 비트는 일반적으로 컨테이너의 가장 왼쪽(최상위) 비트 또는 가장 오른쪽(최하위) 비트를 기준으로 정렬됩니다. 비트 심도가 2의 제곱이 아닌 경우에만 패킹 및 언패킹이라는 용어를 사용하는 것이 일반적입니다.
- 부호 포함 여부
- 샘플이 부호를 포함하는지 또는 포함하지 않는지 여부입니다.
- 표현
- 고정 소수점 또는 부동 소수점입니다. 아래를 참조하세요.
고정 소수점 표현
고정 소수점은 비압축 PCM 오디오 데이터, 특히 하드웨어 인터페이스에서 가장 일반적인 표현입니다.
고정 소수점으로 표현된 수는 기수점 앞뒤에 고정된 자릿수(상수)를 갖습니다. 모든 표현은 2진수를 사용하므로 디지트를 비트로, 기수점을 2진 소수점이나 단순한 소수점으로 대체합니다. 소수점 왼쪽에 있는 비트는 정수 부분이고, 소수점 오른쪽에 있는 비트는 소수 부분입니다.
고정 소수점 값은 일반적으로 정수 값으로 저장되고 조작되기 때문에 정수 PCM이라고 합니다. 고정 소수점으로의 해석은 암시적입니다.
Google에서는 모든 부호가 있는 고정 소수점 표현에 2의 보수를 사용하므로 다음은 모든 값이 1LSB 단위로 된 값을 갖습니다.
|largest negative value| = |largest positive value| + 1
Q 및 U 표기법
정수에는 고정 소수점 표현에 관한 다양한 표기법이 있습니다. Google에서는 Q 표기법을 사용하며, Qm.n은 m 정수 비트 및 n 소수 비트를 의미합니다. 'Q'는 1비트로 계산되지만, 값은 2의 보수로 표현됩니다. 총 비트 수는 m + n + 1입니다.
Um.n은 부호가 없는 숫자에 사용합니다. m은 정수 비트, n은 소수 비트이며, 'U'는 0비트로 계산됩니다. 총 비트 수는 m + n입니다.
정수 부분은 최종 결과에 사용되거나 일시적일 수 있습니다. 후자의 경우 정수 부분을 구성하는 비트를 보호 비트라고 합니다. 보호 비트는 최종 값이 범위 내에 있거나 범위 내로 고정될 수 있는 한 중간 계산에서 오버플로를 허용합니다. 고정 소수점 보호 비트는 왼쪽에 있고, 부동 소수점 단위의 보호 자릿수는 반올림 오류를 줄이는 데 사용되며 오른쪽에 있습니다.
부동 소수점 표현
부동 소수점은 고정 소수점의 대안으로, 소수점의 위치가 다를 수 있는 소수점입니다. 부동 소수점의 주요 장점은 다음과 같습니다.
- 더 넓은 헤드룸 및 동적 범위로, 부동 소수점 연산은 중간 계산 중에 명목 범위를 초과할 수 있으며, 끝 부분의 값만 고정합니다.
- 무한대 및 NaN 등의 특수 값을 지원합니다.
- 대부분의 경우 사용이 더 간편합니다.
이전에는 부동 소수점 연산이 정수 또는 고정 소수점 연산보다 느렸지만 이제는 제어 흐름 결정이 계산 값을 기반으로 하지 않는다면 부동 소수점 연산이 더 빠른 것이 일반적입니다.
오디오용 Android 형식
오디오용 주요 Android 형식은 아래 표에 나와 있습니다.
속성 | Q0.15 | Q0.7 1 | Q0.23 | Q0.31 | 부동 소수점 수 | |
---|---|---|---|---|---|---|
컨테이너 비트 |
16 | 8 | 24 또는 32 2 | 32 | 32 | |
부호를 포함하는 중요 비트 |
16 | 8 | 24 | 24 또는 32 2 | 253 | |
dB의 헤드룸 |
0 | 0 | 0 | 0 | 1264 | |
dB의 동적 범위 |
90 | 42 | 138 | 138~186 | 9005 |
위의 모든 고정 소수점 형식은 -1.0 ~ +1.0 - 1LSB의 명목 범위를 갖습니다. 2의 보수 표현으로 인해 양수 값보다 음수 값이 하나 더 있습니다.
각주:
-
위의 모든 형식은 부호가 있는 샘플 값을 표현합니다.
일반적으로 8비트 형식은 '부호가 없다'(unsigned)고 하지만, 실제로는
0.10000000
의 편향이 포함된 부호 있는 값입니다. - Q0.23은 24비트(8비트짜리 바이트 3개, Little Endian)로 패킹되거나 32비트로 언패킹될 수 있습니다. 언패킹된 경우 중요 비트는 MSB 방향으로 부호 확장 패딩이 있는 LSB 방향으로 오른쪽 정렬되거나(Q8.23) LSB 방향으로 0이 채워진 MSB 방향으로 왼쪽 정렬됩니다(Q0.31). Q0.31에서는 이론상 최대 32개의 중요 비트가 허용되지만, Q0.31을 허용하는 하드웨어 인터페이스에서 모든 비트를 사용할 일은 거의 없습니다.
- 단일 정밀도 부동 소수점에는 명시적 비트 23개가 있고, 숨겨진 비트 1개 및 부호 비트 1개가 더해져 총 중요 비트는 25개가 됩니다. 비정규 숫자는 더 적은 중요 비트 수를 갖습니다.
- 단일 정밀도 부동 소수점은 최대 ±1.7e+38의 값을 표현할 수 있으며, 이는 헤드룸이 크다는 것을 의미합니다.
- 표시되는 동적 범위는 명목 최댓값의 ±1.0인 비정규 값입니다. NEON과 같은 일부 아키텍처별 부동 소수점 구현은 비정규 값을 지원하지 않습니다.
전환수
이 섹션에서는 다양한 표현 간의 데이터 변환을 설명합니다.
부동 소수점 변환
값을 Qm.n 형식에서 부동 소수점으로 변환하는 방법은 다음과 같습니다.
- 값을 정수인 것처럼 부동 소수점으로 변환합니다(소수점 무시).
- 2-n을 곱합니다.
예를 들어 Q4.27 내부 값을 부동 소수점으로 변환하려면 다음을 사용합니다.
float = integer * (2 ^ -27)
부동 소수점에서 고정 소수점으로의 변환은 다음 규칙을 따릅니다.
- 단일 정밀도 부동 소수점의 명목 범위는 ±1.0이지만 중간값의 전체 범위는 ±1.7e+38입니다. 외부 표현(예: 오디오 기기로의 출력)을 위한 부동 소수점과 고정 소수점 사이의 변환은 명목 범위만 고려하며 범위를 초과하는 값은 고정됩니다. 특히 +1.0이 고정 소수점 형식으로 변환되면 +1.0에서 1LSB를 뺀 값으로 고정됩니다.
- 비정규 값(준정규 값)과 +/- 0.0을 모두 표현할 수 있지만, 처리 중에 0.0으로 자동 변환될 수 있습니다.
- 무한대는 연산을 거치거나 +/- 1.0으로 자동 제한됩니다. 일반적으로 후자는 고정 소수점 형식으로 변환하기 위한 것입니다.
- NaN이 정의되지 않은 경우 NaN이 동일한 NaN으로 전파되거나, 기본 NaN으로 변환되거나, +/- 1.0으로 자동 제한되거나, 0.0으로 자동 변환되거나, 오류가 발생할 수 있습니다.
고정 소수점 변환
다른 Qm.n 형식 간의 변환은 다음 규칙을 따릅니다.
- m이 증가하면 왼쪽의 정수 부분을 부호 확장합니다.
- m이 감소하면 정수 부분을 고정합니다.
- n이 증가하면 오른쪽 소수 부분을 0으로 확장합니다.
- n이 감소하면 오른쪽의 초과된 소수 비트를 디더, 반올림 또는 절사합니다.
예를 들어 Q4.27 값을 Q0.15로 변환하려면(디더 또는 반올림 없이) Q4.27 값을 12비트 오른쪽으로 이동하고 16비트 부호 범위를 초과하는 결과는 고정합니다. 그러면 Q 표현의 소수점이 정렬됩니다.
Q7.24를 Q7.23으로 변환하려면 부호를 포함하여 2로 나누거나 Q7.24 정수에 부호 비트를 추가한 다음 오른쪽으로 부호를 포함하여 1만큼 이동합니다. 단지 부호를 포함하여 오른쪽으로 이동하는 것은 부호를 포함하여 2로 나누는 것과 동일하지 않습니다.
손실(lossy) 및 무손실 변환
가역적인 경우 변환은 무손실이며, A
에서 B
를 거쳐 C
로 변환하면 결과는 A = C
입니다.
그렇지 않으면 변환은 손실(lossy)입니다.
무손실 변환은 왕복 형식 변환을 허용합니다.
25개 이하의 중요 비트를 부동 소수점으로 사용하는 고정 소수점 표현의 변환은 무손실입니다. 부동 소수점에서 일반적인 고정 소수점 표현으로의 변환은 손실입니다.