Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Format Data

Menggunakan Android berbagai audio format data internal, dan mengekspos bagian dari ini dalam API publik, format file , dan Hardware Abstraction Layer (HAL).

Properti

Format data audio diklasifikasikan berdasarkan propertinya:

Kompresi
Tak terkompresi , lossless dikompresi , atau lossy terkompresi . 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.
Penjajaran
Jika ukuran kontainer adalah persis sama dengan kedalaman bit, representasi yang disebut dikemas. Jika tidak representasi yang dibongkar. Bit signifikan dari sampel biasanya disejajarkan dengan bit paling kiri (paling signifikan) atau paling kanan (paling tidak signifikan) dari wadah. Hal ini konvensional untuk menggunakan istilah dikemas dan membongkar hanya ketika kedalaman bit bukanlah kekuatan 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 terkompresi PCM, terutama pada antarmuka hardware.

Sejumlah fixed-point memiliki tetap (konstan) jumlah digit 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 integer, dan bit ke kanan titik adalah bagian pecahan .

Kami berbicara tentang bilangan bulat PCM, karena nilai-nilai fixed-point biasanya disimpan dan dimanipulasi sebagai nilai integer. Interpretasi sebagai titik tetap bersifat implisit.

Kami menggunakan komplemen dua ini untuk semua representasi fixed-point ditandatangani, sehingga berikut memegang mana semua nilai-nilai dalam satuan satu LSB :

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

notasi Q dan U

Ada berbagai notasi untuk fixed-point representasi dalam integer. Kami menggunakan Q notasi : Q m. n cara m bilangan bulat bit dan n bit fraksional. "Q" dihitung sebagai satu bit, meskipun nilainya dinyatakan dalam komplemen dua. Jumlah bit adalah m + n + 1.

U m. n adalah untuk nomor unsigned: m bilangan bulat bit dan n bit fraksional, dan "U" dianggap sebagai nol bit. Jumlah bit adalah m + n.

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

Representasi titik mengambang

Floating point adalah sebuah alternatif untuk titik tetap, di mana lokasi titik dapat bervariasi. Keuntungan utama dari floating-point meliputi:

  • Lebih besar ruang kepala 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 mengapung
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 yang biasa disebut "unsigned", tetapi sebenarnya nilai 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. Nomor Denormal memiliki bit signifikan 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 arsitektur-spesifik implementasi floating point seperti NEON tidak mendukung denormals.

Konversi

Bagian ini membahas konversi Data antara berbagai representasi.

Konversi titik mengambang

Untuk mengkonversi nilai dari Q m. n memformat 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 yang berbeda Q m. n format mengikuti aturan ini:

  • Ketika m meningkat, tanda memperpanjang bagian integer di sebelah kiri.
  • Ketika m menurun, klem bagian integer.
  • Ketika n meningkat, nol memperpanjang bagian pecahan di sebelah kanan.
  • Ketika n menurun, baik gentar, bulat, atau memotong bit fraksional 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 mengkonversi Q7.24 untuk Q7.23, melakukan membagi ditandatangani oleh 2, atau ekuivalen menambahkan sedikit tanda dengan kuantitas Q7.24 integer, dan kemudian ditandatangani shift kanan dengan 1. Perhatikan bahwa sederhana ditandatangani shift kanan tidak sama dengan tanda bagi dengan 2.

Konversi lossy dan lossless

Konversi adalah lossless jika dibalik : konversi dari A ke B ke C hasil di A = C . Jika tidak konversi adalah lossy .

Konversi lossless mengizinkan konversi format round-trip .

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.