Format data

Android menggunakan beragam format data audio secara internal, dan menampilkan subset format tersebut di API publik, format file , dan Lapisan Abstraksi Perangkat Keras (HAL).

Properti

Format data audio diklasifikasikan berdasarkan propertinya:

Kompresi
Tidak terkompresi , terkompresi lossless , atau terkompresi lossy . PCM adalah format audio tidak terkompresi yang paling umum. FLAC adalah format kompresi lossless, sedangkan MP3 dan AAC adalah format kompresi lossy.
Kedalaman sedikit
Jumlah bit signifikan per sampel audio.
Ukuran wadah
Jumlah bit yang digunakan untuk menyimpan atau mengirimkan sampel. Biasanya ini sama dengan kedalaman bit, namun terkadang bit padding tambahan dialokasikan untuk penyelarasan. Misalnya, sampel 24-bit dapat dimuat dalam kata 32-bit.
Penyelarasan
Jika ukuran wadah sama persis dengan kedalaman bit, representasinya disebut dikemas . Kalau tidak, representasinya akan dibongkar . Bit signifikan dari sampel biasanya disejajarkan dengan bit paling kiri (paling signifikan) atau paling kanan (paling tidak signifikan) pada wadah. Merupakan hal yang konvensional untuk menggunakan istilah dikemas dan dibongkar hanya jika kedalaman bit bukan pangkat dua .
Ketertandatangan
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.

Bilangan titik tetap mempunyai jumlah digit yang tetap (konstan) sebelum dan sesudah titik radix . Semua representasi kami menggunakan basis 2 , jadi kami mengganti bit dengan digit , dan titik biner atau cukup 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 integer PCM , karena nilai titik tetap biasanya disimpan dan dimanipulasi sebagai nilai integer. Penafsiran sebagai titik tetap bersifat implisit.

Kami menggunakan komplemen dua untuk semua representasi titik tetap yang ditandatangani, sehingga yang berikut ini berlaku jika semua nilai berada 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 : Q m . n berarti m bit bilangan bulat dan n bit pecahan. "Q" dihitung sebagai satu bit, meskipun nilainya dinyatakan dalam dua komplemen. Jumlah total bit adalah m + n + 1.

kamu . n untuk bilangan yang tidak ditandatangani: m bit bilangan bulat dan n bit pecahan, dan "U" dihitung sebagai bit nol. Jumlah total bit adalah m + n .

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

Representasi titik mengambang

Titik mengambang merupakan alternatif dari titik tetap yang letak titiknya dapat berbeda-beda. Keuntungan utama dari floating-point meliputi:

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

Secara historis, aritmatika titik-mengambang lebih lambat daripada aritmatika bilangan bulat atau titik tetap, namun sekarang titik-mengambang menjadi lebih cepat, asalkan keputusan aliran kontrol tidak didasarkan pada nilai komputasi.

Format Android untuk audio

Format utama Android untuk audio tercantum dalam tabel di bawah:

Notasi
Properti Q0.15 Q0.7 1 Q0.23 Q0.31 mengambang
Wadah
bit
16 8 24 atau 32 2 32 32
Bagian yang signifikan
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 dikurangi satu LSB. Ada satu lebih banyak nilai negatif daripada nilai positif karena representasi komplemen keduanya.

Catatan kaki:

  1. Semua format di atas menyatakan nilai sampel bertanda tangan. Format 8-bit umumnya disebut "unsigned", namun sebenarnya merupakan nilai yang ditandatangani dengan bias 0.10000000 .
  2. Q0.23 dapat dikemas menjadi 24 bit (tiga byte 8-bit, little-endian), atau dibongkar dalam 32 bit. Jika dibongkar, bit signifikan akan diratakan ke kanan menuju LSB dengan bantalan ekstensi tanda menuju MSB (Q8.23), atau diratakan ke kiri menuju MSB dengan pengisian nol menuju 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, sehingga menghasilkan total 25 bit signifikan. Bilangan denormal mempunyai bit signifikan yang lebih sedikit.
  4. Titik mengambang presisi tunggal dapat menyatakan 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 titik mengambang:

  1. Ubah nilainya menjadi floating point seolah-olah 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:

  • Titik mengambang presisi tunggal memiliki rentang nominal ±1,0, namun 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 penjepitan untuk nilai yang melebihi rentang tersebut. Khususnya, ketika +1.0 dikonversi ke format titik tetap, itu dijepit ke +1.0 dikurangi satu LSB.
  • Denormal (subnormal) dan +/- 0,0 diperbolehkan dalam representasi, tetapi dapat diubah secara diam-diam menjadi 0,0 selama pemrosesan.
  • Ketidakterbatasan 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 disebarkan sebagai NaN yang identik, atau dapat dikonversi ke NaN Default, mungkin secara diam-diam dibatasi hingga +/- 1,0, atau dikonversi secara diam-diam ke 0,0, atau mengakibatkan kesalahan.

Konversi titik tetap

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

  • Ketika m diperbesar, tanda perpanjang bagian bilangan bulat di sebelah kiri.
  • Ketika m diturunkan, jepit bagian bilangan bulat.
  • Ketika n diperbesar, nol akan memperpanjang bagian pecahan di sebelah kanan.
  • Ketika n dikurangi, 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 sebesar 12 bit, dan jepit hasil apa pun yang melebihi rentang tanda 16-bit. Ini menyelaraskan inti representasi Q.

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

Konversi yang lossy dan lossless

Suatu konversi tidak akan rugi jika dapat dibalik : konversi dari A ke B ke C menghasilkan A = C . Kalau tidak, konversinya akan rugi .

Konversi lossless memungkinkan konversi format bolak-balik .

Konversi dari representasi titik tetap dengan 25 bit signifikan atau kurang ke titik mengambang tidak menimbulkan kerugian. Konversi dari floating point ke representasi titik tetap umum bersifat lossy.