Format data

Android menggunakan berbagai macam audio format data secara internal, dan mengekspos subset dari keduanya dalam API publik, format file, dan Hardware Abstraksi Layer (HAL).

Properti

Format data audio diklasifikasikan menurut propertinya:

Kompresi
Tidak dikompresi, dikompresi lossless, atau dikompresi lossy. PCM adalah format audio tidak terkompresi yang paling umum. FLAC adalah aplikasi kompresi lossless sementara 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 tambahan bit padding dialokasikan untuk penyelarasan. Sebagai contoh, Sampel 24-bit dapat dimuat dalam kata 32-bit.
Perataan
Jika ukuran kontainer sama persis dengan kedalaman bit, representasi disebut packed. Jika tidak, representasinya adalah dibuka. Bit sampel yang signifikan biasanya sejajar dengan yang paling kiri (paling signifikan) atau paling kanan (paling tidak signifikan) dari container. Cara tersebut adalah hal yang lazim untuk istilah packed dan unpacked hanya jika bit kedalaman bukanlah pangkat dua.
Tanda tangan
Apakah sampel ditandatangani atau tidak ditandatangani.
Representasi
Berupa titik tetap atau floating point; lihat di bawah ini.

Representasi titik tetap

Titik tetap adalah representasi paling umum untuk data audio PCM yang tidak dikompresi, terutama pada antarmuka perangkat keras.

Suatu bilangan titik tetap memiliki jumlah digit yang tetap (konstan). sebelum dan setelah titik radius. Semua representasi kita menggunakan base 2, jadi bit diganti dengan digit, dan titik biner atau cukup titik untuk titik radius. 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 yang ditandatangani, jadi yang berikut ini berlaku di mana semua nilai dalam unit satu LSB:

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

Notasi Q dan U

Ada berbagai notasi untuk representasi titik tetap dalam integer. Kami 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 nomor yang tidak ditandatangani: m bit bilangan bulat dan n bit pecahan, dan "U" akan dihitung sebagai nol bit. Jumlah total bit adalah m + n.

Bagian bilangan bulat dapat digunakan dalam hasil akhir, atau bersifat sementara. Dalam kasus yang terakhir, bit yang membentuk bagian bilangan bulat disebut bit pelindung. Bit penjaga mengizinkan kalkulasi menengah untuk meluap, selama nilai akhir berada dalam jangkauan atau dapat dibulatkan agar berada dalam jangkauan. Perlu diketahui bahwa bit pelindung titik tetap berada di sebelah kiri, sedangkan unit floating point digit penjaga digunakan untuk mengurangi {i> roundoff error<i} dan berada di sebelah kanan.

Representasi floating point

Floating point merupakan alternatif untuk titik tetap, yang lokasi titiknya dapat bervariasi. Keuntungan utama floating point meliputi:

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

Secara historis, aritmetika floating point lebih lambat daripada bilangan bulat atau titik tetap aritmatika, tetapi sekarang umumnya {i> floating point<i} menjadi lebih cepat, asalkan keputusan aliran kontrol tidak didasarkan pada nilai komputasi.

Format Android untuk audio

Format Android utama untuk audio tercantum dalam tabel di bawah ini:

Notasi
Properti T0.15 P0.7 1 P0.23 P0.31 float
Bit
penampung
16 8 24 atau 32 2 32 32
Bit yang 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-186 tahun 900 5

Semua format tetap di atas memiliki rentang nominal -1.0 hingga +1.0 dikurangi satu LSB. Ada satu lebih banyak nilai negatif daripada nilai positif karena representasi pelengkap dua.

Catatan kaki:

  1. Semua format di atas menyatakan nilai contoh yang ditandatangani. Format 8-bit biasanya disebut "{i>unsigned<i}", tetapi itu sebenarnya adalah nilai bertanda tangan dengan bias 0.10000000.
  2. Q0.23 dapat dikemas menjadi 24 bit (tiga byte 8-bit, little-endian), atau dibongkar dalam 32 bit. Jika tidak dipaketkan, bit signifikan akan diratakan ke kanan menuju LSB dengan padding ekstensi tanda terhadap MSB (P8.23), atau diratakan ke kiri ke arah MSB dengan isian nol ke arah LSB (P0.31). Q0.31 secara teoritis mengizinkan hingga 32 bit yang signifikan, tetapi antarmuka perangkat keras yang menerima Q0.31 jarang menggunakan semua bit.
  3. Floating point presisi tunggal memiliki 23 bit eksplisit ditambah satu {i>hidden bit<i} dan bit tanda, yang menghasilkan total 25 bit yang signifikan. Nomor denormal memiliki bit signifikan yang lebih sedikit.
  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 nilai ±1,0. Perhatikan, 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. Konversikan nilai ke floating point seolah-olah merupakan bilangan bulat (dengan mengabaikan titik tersebut).
  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 titik tetap mengikuti aturan berikut:

  • Floating point presisi tunggal memiliki rentang nominal ±1,0, tetapi kisaran penuh untuk nilai antara adalah ±1,7e+38. Konversi antara floating point dan titik tetap untuk representasi eksternal (seperti output ke perangkat audio) akan mempertimbangkan rentang nominal saja, dengan untuk nilai yang melebihi rentang tersebut. Khususnya, saat +1.0 dikonversi ke format titik tetap, maka dibulatkan ke +1,0 dikurangi satu LSB.
  • Denormal (subnormal) dan +/- 0,0 diperbolehkan dalam representasi, tetapi dapat diam-diam dikonversi ke 0.0 selama pemrosesan.
  • Keterbatasan akan melewati proses operasi atau akan dibatasi aksesnya secara diam-diam menjadi +/- 1,0. Umumnya yang kedua adalah untuk konversi ke format titik tetap.
  • Perilaku NaN tidak terdefinisi: NaN dapat disebarkan sebagai NaN yang identik, atau mungkin dikonversi ke NaN Default, mungkin diam-diam sulit dibatasi ke +/- 1.0, atau secara otomatis dikonversi ke 0.0, atau menghasilkan error.

Konversi titik tetap

Konversi antara berbagai format Qm.n mengikuti aturan berikut:

  • Saat m dinaikkan, tanda perluas bagian bilangan bulat di sebelah kiri.
  • Saat m diturunkan, jepit bagian bilangan bulat.
  • Jika n dinaikkan, nol memperluas bagian pecahan di kanan.
  • Saat n diturunkan, Anda dapat membuat duplikat, membulatkan, atau memotong kelebihan bit pecahan di sebelah kanan.

Misalnya, untuk mengonversi nilai Q4.27 ke Q0.15 (tanpa dither atau pembulatan), geser kanan nilai Q4.27 sebesar 12 bit, dan jepit hasil apa pun yang melebihi rentang 16-bit yang ditandai. Hal ini selaras dengan Representasi Q.

Untuk mengonversi Q7.24 ke Q7.23, lakukan pembagian bertanda dengan 2, atau ekuivalen tambahkan bit tanda ke kuantitas integer Q7.24, dan kemudian ditandatangani shift kanan oleh 1. Perhatikan bahwa pergeseran kanan sederhana yang ditandatangani tidak sama dengan pembagian bertanda dengan 2.

Konversi lossy dan lossless

Konversi dianggap lossless jika invertibel: konversi dari A ke B menjadi C menghasilkan A = C. Jika tidak, konversi akan lossy.

Izin konversi lossless konversi format round-trip.

Konversi dari representasi titik tetap dengan 25 bit signifikan atau kurang ke floating point bersifat lossless. Konversi dari floating point ke representasi titik tetap umum bersifat lossy.