Format data

Android menggunakan berbagai format data audio secara internal, dan mengekspos sebagian darinya di API publik, format file, dan Hardware Abstraction Layer (HAL).

Properti

Format data audio diklasifikasikan berdasarkan propertinya:

Kompresi
Tidak dikompresi, dikompresi lossless, atau dikompresi lossy. PCM adalah format audio tidak terkompresi yang paling umum. FLAC adalah format terkompresi lossless, sedangkan MP3 dan AAC adalah format terkompresi lossy.
Kedalaman bit
Jumlah bit signifikan per sampel audio.
Ukuran penampung
Jumlah bit yang digunakan untuk menyimpan atau mengirimkan sampel. Biasanya ini sama dengan kedalaman bit, tetapi terkadang bit padding tambahan dialokasikan untuk perataan. Misalnya, sampel 24-bit dapat dimuat dalam kata 32-bit.
Perataan
Jika ukuran penampung sama persis dengan kedalaman bit, representasi disebut dikemas. Jika tidak, representasi akan di-unzip. Bit signifikan sampel biasanya sejajar dengan bit paling kiri (paling signifikan) atau paling kanan (paling tidak signifikan) dari penampung. Secara konvensional, istilah dikemas dan di-unzip hanya digunakan jika kedalaman bit bukan bilangan pangkat dua.
Signedness
Apakah sampel ditandatangani atau tidak ditandatangani.
Representasi
Tetap atau floating point; lihat di bawah.

Representasi titik tetap

Titik tetap adalah representasi paling umum untuk data audio PCM yang tidak dikompresi, terutama di antarmuka hardware.

Bilangan fixed-point memiliki jumlah digit tetap (konstanta) sebelum dan sesudah titik radix. Semua representasi kami menggunakan basis 2, sehingga kita mengganti bit dengan digit, dan titik biner atau hanya titik dengan titik radix. Bit di sebelah kiri titik adalah bagian bilangan bulat, dan bit di sebelah kanan titik adalah bagian pecahan.

Kita berbicara tentang PCM bilangan bulat, karena nilai titik tetap biasanya disimpan dan dimanipulasi sebagai nilai bilangan bulat. Penafsiran sebagai titik tetap bersifat implisit.

Kita menggunakan komplemen dua untuk semua representasi titik tetap bertanda, sehingga hal berikut berlaku jika semua nilai dalam satuan satu LSB:

|largest negative value| = |largest positive value| + 1

Notasi Q dan U

Ada berbagai notasi untuk representasi titik tetap dalam bilangan bulat. Kita menggunakan notasi Q: Qm.n berarti m bit bilangan bulat dan n bit pecahan. "Q" dihitung sebagai satu bit, meskipun nilainya dinyatakan dalam komplemen dua. Jumlah total bit adalah m + n + 1.

Um.n adalah untuk bilangan tanpa tanda tangan: m bit bilangan bulat dan n bit pecahan, dan "U" dihitung sebagai bit nol. Jumlah total bit adalah m + n.

Bagian bilangan bulat dapat digunakan dalam hasil akhir, atau bersifat sementara. Dalam kasus terakhir, bit yang membentuk bagian bilangan bulat disebut bit penjaga. Bit penjaga memungkinkan penghitungan perantara mengalami overflow, asalkan nilai akhir berada dalam rentang atau dapat dikencangkan agar berada dalam rentang. Perhatikan bahwa bit penjaga titik tetap berada di sebelah kiri, sedangkan unit floating point digit penjaga digunakan untuk mengurangi error pembulatan dan berada di sebelah kanan.

Representasi floating point

Floating point adalah alternatif dari titik tetap, dengan lokasi titik yang dapat bervariasi. Keuntungan utama floating point meliputi:

  • Headroom dan rentang dinamis yang lebih besar; aritmetika floating point dapat mentoleransi melebihi rentang nominal selama komputasi perantara, dan hanya membatasi nilai di akhir
  • Dukungan untuk nilai khusus seperti tak terhingga dan NaN
  • Lebih mudah digunakan dalam banyak kasus

Secara historis, aritmetika floating point lebih lambat daripada aritmetika bilangan bulat atau titik tetap, tetapi sekarang floating point biasanya lebih cepat, asalkan keputusan alur kontrol tidak didasarkan pada nilai komputasi.

Format Android untuk audio

Format Android utama untuk audio tercantum dalam tabel di bawah:

Notasi
Properti Q0,15 Q0,7 1 Q0,23 Q0,31 float
Bit
penampung
16 8 24 atau 32 2 32 32
Bit signifikan
termasuk tanda
16 8 24 24 atau 32 2 25 3
Headroom
dalam dB
0 0 0 0 126 4
Rentang dinamis
dalam dB
90 42 138 138 hingga 186 900 5

Semua format titik tetap di atas memiliki rentang nominal -1,0 hingga +1,0 dikurangi satu LSB. Ada satu nilai negatif lebih banyak daripada nilai positif karena representasi komplemen dua.

Catatan kaki:

  1. Semua format di atas menyatakan nilai sampel yang ditandatangani. Format 8-bit biasanya disebut "tanpa tanda tangan", tetapi sebenarnya merupakan nilai bertanda tangan dengan bias 0.10000000.
  2. Q0.23 dapat dikemas menjadi 24 bit (tiga byte 8-bit, little-endian), atau di-unpack dalam 32 bit. Jika diekstrak, bit signifikan akan dijustifikasi ke kanan ke LSB dengan padding ekstensi tanda ke MSB (Q8.23), atau dijustifikasi ke kiri ke MSB dengan pengisian nol ke LSB (Q0.31). Q0.31 secara teori memungkinkan hingga 32 bit signifikan, tetapi antarmuka hardware yang menerima Q0.31 jarang menggunakan semua bit.
  3. Floating point presisi tunggal memiliki 23 bit eksplisit ditambah satu bit tersembunyi dan bit tanda, sehingga menghasilkan total 25 bit signifikan. Angka denormal memiliki lebih sedikit bit signifikan.
  4. Floating point presisi tunggal dapat menyatakan nilai hingga ±1,7e+38, yang menjelaskan headroom yang besar.
  5. Rentang dinamis yang ditampilkan adalah untuk denormal hingga nilai maksimum nominal ±1,0. Perhatikan bahwa beberapa implementasi floating point khusus arsitektur seperti NEON tidak mendukung denormal.

Konversi

Bagian ini membahas konversi data di antara berbagai representasi.

Konversi floating point

Untuk mengonversi nilai dari format Qm.n ke floating point:

  1. Mengonversi nilai ke floating point seolah-olah itu adalah bilangan bulat (dengan mengabaikan titik).
  2. Kalikan dengan 2-n.

Misalnya, untuk mengonversi nilai internal Q4.27 menjadi floating point, gunakan:

float = integer * (2 ^ -27)

Konversi dari floating point ke fixed point mengikuti aturan berikut:

  • Floating point presisi tunggal memiliki rentang nominal ±1,0, tetapi rentang penuh untuk nilai perantara adalah ±1,7e+38. Konversi antara floating point dan fixed point untuk representasi eksternal (seperti output ke perangkat audio) hanya akan mempertimbangkan rentang nominal, dengan pembatasan untuk nilai yang melebihi rentang tersebut. Secara khusus, saat +1,0 dikonversi ke format titik tetap, nilainya akan dibatasi ke +1,0 dikurangi satu LSB.
  • Denormal (subnormal) dan +/- 0.0 diizinkan dalam representasi, tetapi dapat dikonversi secara diam-diam menjadi 0.0 selama pemrosesan.
  • Infinity akan meneruskan operasi atau akan dibatasi secara keras ke +/- 1,0. Umumnya, yang terakhir adalah untuk konversi ke format titik tetap.
  • Perilaku NaN tidak ditentukan: NaN dapat di-propagasi sebagai NaN yang identik, atau dapat dikonversi menjadi NaN Default, dapat dibatasi secara diam-diam hingga +/- 1,0, atau dikonversi secara diam-diam menjadi 0,0, atau menyebabkan error.

Konversi floating point

Konversi antarformat Qm.n yang berbeda mengikuti aturan berikut:

  • Saat m ditingkatkan, tandai bagian bilangan bulat di sebelah kiri.
  • Saat m dikurangi, pasang bagian bilangan bulat.
  • Saat n ditingkatkan, nol akan memperluas bagian pecahan di sebelah kanan.
  • Saat n dikurangi, dither, bulatkan, atau pangkas bit pecahan berlebih di sebelah kanan.

Misalnya, untuk mengonversi nilai Q4.27 menjadi Q0.15 (tanpa dither atau pembulatan), geser nilai Q4.27 ke kanan sebesar 12 bit, dan pasang hasil apa pun yang melebihi rentang bertanda 16-bit. Tindakan ini akan menyelaraskan titik representasi Q.

Untuk mengonversi Q7.24 ke Q7.23, lakukan pembagian bertanda dengan 2, atau secara setara tambahkan bit tanda ke kuantitas bilangan bulat Q7.24, lalu geser kanan bertanda dengan 1. Perhatikan bahwa pergeseran kanan bertanda sederhana tidak setara dengan pembagian bertanda dengan 2.

Konversi lossy dan lossless

Konversi bersifat tanpa kehilangan jika dapat dibalik: konversi dari A ke B ke C menghasilkan A = C. Jika tidak, konversi akan berkualitas rendah.

Konversi lossless mengizinkan konversi format bolak-balik.

Konversi dari representasi titik tetap dengan 25 bit signifikan atau kurang ke floating point tidak akan mengalami kerugian. Konversi dari floating point ke representasi titik tetap umum akan mengalami penurunan kualitas.