Format Data

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

Properti

Format data audio diklasifikasikan berdasarkan propertinya:

Kompresi
Tidak terkompresi , terkompresi lossless , atau terkompresi lossy . PCM adalah format audio 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 wadah:
Jumlah bit yang digunakan untuk menyimpan atau mengirimkan sampel. Biasanya ini sama dengan kedalaman bit, tetapi terkadang bit padding tambahan dialokasikan untuk penyelarasan. Misalnya, sampel 24-bit dapat dimasukkan ke dalam kata 32-bit.
Penyelarasan
Jika ukuran wadah sama persis dengan kedalaman bit, representasi tersebut disebut dikemas . Jika tidak, representasi akan dibongkar . Bit signifikan dari sampel biasanya disejajarkan dengan bit paling kiri (paling signifikan) atau paling kanan (paling tidak signifikan) dari wadah. Adalah konvensional untuk menggunakan istilah dikemas dan dibongkar hanya ketika kedalaman bit bukan pangkat dua .
penandatanganan
Apakah sampel ditandatangani atau tidak.
Perwakilan
Baik titik tetap atau titik mengambang; Lihat di bawah.

Representasi titik tetap

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

Angka titik tetap memiliki jumlah digit tetap (konstan) sebelum dan sesudah titik radix . Semua representasi kami menggunakan basis 2 , jadi kami mengganti bit untuk digit , dan titik biner atau hanya titik untuk titik radix . Bit di sebelah kiri titik adalah bagian bilangan bulat, dan bit di sebelah kanan titik adalah bagian pecahan .

Kami berbicara tentang PCM integer , karena nilai titik tetap biasanya disimpan dan dimanipulasi sebagai nilai integer. Interpretasi sebagai titik tetap bersifat implisit.

Kami menggunakan komplemen dua untuk semua representasi titik tetap bertanda, jadi berikut ini berlaku di mana 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. Kami menggunakan notasi Q : Q m . n berarti m bit integer 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 angka yang tidak ditandatangani: m bit integer dan n bit pecahan, dan "U" dihitung sebagai bit nol. Jumlah total bit adalah m + n .

Bagian integer dapat digunakan dalam hasil akhir, atau bersifat sementara. Dalam kasus terakhir, bit yang membentuk bagian integer disebut bit penjaga . Bit pelindung memungkinkan perhitungan perantara meluap, selama nilai akhir berada dalam jangkauan atau dapat dijepit agar berada dalam jangkauan. Perhatikan bahwa bit penjaga titik tetap berada di sebelah kiri, sedangkan angka penjaga unit titik-mengambang digunakan untuk mengurangi kesalahan pembulatan dan berada di sebelah kanan.

Representasi titik mengambang

Titik apung merupakan alternatif titik tetap, di mana letak titik dapat bervariasi. Keuntungan utama dari floating-point meliputi:

  • Ruang kepala lebih besar dan jangkauan dinamis ; aritmatika floating-point mentolerir melebihi rentang nominal selama perhitungan menengah, dan hanya nilai klem di akhir
  • Dukungan untuk nilai khusus seperti tak terhingga dan NaN
  • Lebih mudah digunakan dalam banyak kasus

Secara historis, aritmatika titik-mengambang lebih lambat daripada aritmatika bilangan bulat atau titik-tetap, tetapi sekarang sudah umum untuk titik-mengambang 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 Q0.15 Q0.7 1 Q0.23 Q0.31 mengambang
Wadah
sedikit
16 8 24 atau 32 2 32 32
Bit penting
termasuk tanda
16 8 24 24 atau 32 2 25 3
Ruang utama
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 kisaran nominal -1.0 hingga +1.0 minus satu LSB. Ada satu nilai negatif lebih dari nilai positif karena representasi komplemen dua.

Catatan kaki:

  1. Semua format di atas mengekspresikan nilai sampel yang ditandatangani. Format 8-bit biasanya disebut "unsigned", tetapi sebenarnya adalah nilai yang ditandatangani dengan bias 0.10000000 .
  2. Q0.23 dapat dikemas ke dalam 24 bit (tiga byte 8-bit, little-endian), atau dibongkar dalam 32 bit. Jika dibongkar, bit signifikan diratakan ke kanan menuju LSB dengan bantalan ekstensi tanda ke arah MSB (Q8.23), atau diratakan ke kiri ke arah MSB dengan pengisian nol ke arah LSB (Q0.31). Q0.31 secara teoritis mengizinkan hingga 32 bit signifikan, tetapi antarmuka perangkat keras yang menerima Q0.31 jarang menggunakan semua bit.
  3. Titik mengambang presisi tunggal memiliki 23 bit eksplisit ditambah satu bit tersembunyi dan bit tanda, menghasilkan total 25 bit signifikan. Bilangan denormal memiliki bit signifikan yang lebih sedikit.
  4. Titik apung presisi tunggal dapat mengekspresikan nilai hingga ±1.7e+38, yang menjelaskan ruang kepala 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 antara berbagai representasi.

Konversi titik mengambang

Untuk mengonversi nilai dari Q m . n format ke floating point:

  1. Ubah nilai menjadi floating point seolah-olah itu bilangan bulat (dengan mengabaikan titik).
  2. Kalikan dengan 2 - n .

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

float = integer * (2 ^ -27)

Konversi dari floating point ke fixed point mengikuti aturan berikut:

  • Titik apung presisi tunggal memiliki kisaran nominal ±1,0, tetapi kisaran penuh untuk nilai antara 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 penjepitan untuk nilai yang melebihi rentang tersebut. Secara khusus, ketika +1.0 dikonversi ke format titik tetap, itu dijepit ke +1.0 dikurangi satu LSB.
  • Denormal (subnormal) dan keduanya +/- 0,0 diperbolehkan dalam representasi, tetapi dapat secara diam-diam diubah menjadi 0,0 selama pemrosesan.
  • Tak terhingga akan melewati operasi atau akan dibatasi secara diam-diam hingga +/- 1.0. Umumnya yang terakhir adalah untuk konversi ke format titik tetap.
  • Perilaku NaN tidak terdefinisi: NaN dapat menyebar sebagai NaN yang identik, atau dapat dikonversi ke NaN Default, mungkin secara diam-diam terbatas pada +/- 1,0, atau secara diam-diam dikonversi ke 0,0, atau menghasilkan kesalahan.

Konversi titik tetap

Konversi antara Q m yang berbeda. n format mengikuti aturan berikut:

  • Ketika m diperbesar, tanda memperpanjang bagian bilangan bulat di sebelah kiri.
  • Ketika m berkurang, jepit bagian bilangan bulat.
  • Ketika n diperbesar, nol memperpanjang bagian pecahan di sebelah kanan.
  • Ketika n diturunkan, gentar, bulatkan, atau potong bit pecahan berlebih di sebelah kanan.

Misalnya, untuk mengonversi nilai Q4.27 ke Q0.15 (tanpa gentar atau pembulatan), geser ke kanan nilai Q4.27 sebanyak 12 bit, dan jepit hasil apa pun yang melebihi rentang bertanda 16-bit. Ini 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 ke kanan bertanda dengan 1. Perhatikan bahwa pergeseran kanan bertanda sederhana tidak ekuivalen dengan tanda bagi dengan 2.

Konversi lossy dan lossless

Sebuah konversi lossless jika dapat dibalik : konversi dari A ke B ke C menghasilkan A = C . Jika tidak, konversi menjadi lossy .

Konversi lossless memungkinkan konversi format bolak-balik .

Konversi dari representasi titik tetap dengan 25 atau lebih sedikit bit signifikan ke titik mengambang tidak bersifat lossless. Konversi dari floating point ke representasi titik tetap umum adalah lossy.