Veri biçimleri

Android, dahili olarak çok çeşitli ses veri biçimleri kullanır ve bunların bir alt kümesini herkese açık API'ler, dosya biçimleri ve Donanım Soyutlama Katmanı'nda (HAL) gösterir.

Özellikler

Ses verisi biçimleri, özelliklerine göre sınıflandırılır:

Sıkıştırma
Sıkıştırılmamış, kaybetmeden sıkıştırılmış veya kaybetmeyle sıkıştırılmış. PCM, en yaygın sıkıştırılmamış ses biçimidir. FLAC kayıpsız sıkıştırılmış bir biçimdir. MP3 ve AAC ise kayıplı sıkıştırılmış biçimlerdir.
Bit derinliği
Ses örneği başına anlamlı bit sayısı.
Kapsayıcı boyutu
Bir örneği depolamak veya iletmek için kullanılan bit sayısı. Bu genellikle bit derinliğiyle aynıdır ancak bazen hizalama için ek dolgu bitleri ayrılır. Örneğin, 24 bitlik bir örnek 32 bitlik bir kelime içinde bulunabilir.
Hizalamayı
Kapsayıcı boyutu bit derinliğine tam olarak eşitse temsile paketlenmiş denir. Aksi takdirde temsil ayrıştırılır. Örneğin önemli bitleri genellikle kapsayıcının en soldaki (en önemli) veya en sağdaki (en az önemli) bitiyle hizalanır. Paketlenmiş ve paketlenmemiş terimleri yalnızca bit derinliği ikinin kuvveti olmadığında kullanılır.
İmza
Sana Özel içeriklerinin imzalı olup olmadığı.
Representation
Sabit nokta veya kayan nokta; aşağıya bakın.

Sabit nokta gösterimi

Sabit nokta, özellikle donanım arayüzlerinde sıkıştırılmamış PCM ses verileri için en yaygın gösterimdir.

Sabit noktalı sayılarda, sayı tabanı noktasından önce ve sonra sabit (sabit) sayıda basamak bulunur. Tüm gösterimlerimizde 2'lik taban kullanılır. Bu nedenle, bit yerine hane, radix noktası yerine ikili nokta veya kısaca nokta kullanılır. Noktanın solundaki bitler tam sayı kısmı, sağındaki bitler ise ondalık kısım'dır.

Sabit noktalı değerler genellikle tam sayı değerleri olarak depolandığı ve işlenildiği için tam sayı PCM'den bahsederiz. Sabit nokta olarak yorumlama örtüktür.

Tüm işaretli sabit nokta gösterimlerinde ikili tamamlayıcı kullanırız. Bu nedenle, tüm değerlerin bir LSB biriminde olduğu durumlarda aşağıdakiler geçerlidir:

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

Q ve U gösterimi

Tam sayılarda sabit nokta gösterimi için çeşitli notasyonlar vardır. Q gösterimini kullanırız: Qm.n, m tam sayı biti ve n kesirli bit anlamına gelir. Değer ikilik tamamlayıcı olarak ifade edilse de "Q" bir bit olarak sayılır. Toplam bit sayısı m + n + 1'dir.

Um.n, işaretsiz sayılar içindir:m tam sayı biti ve n kesirli bit bulunur ve "U" sıfır bit olarak sayılır. Toplam bit sayısı m + n'dır.

Tam sayı kısmı nihai sonuçta kullanılabilir veya geçici olabilir. İkinci durumda, tam sayı bölümünü oluşturan bitlere koruma bitleri denir. Koruma bitleri, nihai değer aralık içinde olduğu veya aralık içinde olacak şekilde sınırlandırılabildiği sürece ara hesaplamanın taşmasına izin verir. Sabit noktalı koruma bitlerinin solda, kayan noktalı birim koruma basamaklarının ise yuvarlama hatasını azaltmak için kullanıldığını ve sağda olduğunu unutmayın.

Kayan nokta gösterimi

Kayan nokta, noktanın konumunun değişebileceği sabit noktaya alternatiftir. Kayan noktanın başlıca avantajları şunlardır:

  • Daha fazla başlık alanı ve dinamik aralık; kayan noktalı aritmetik, ara hesaplama sırasında nominal aralıkların aşılmasına izin verir ve yalnızca son kısımda değerleri sınırlar
  • Sonsuzluk ve NaN gibi özel değerler için destek
  • Birçok durumda daha kolay kullanılır

Geçmişte kayan noktalı aritmetik, tam sayı veya sabit noktalı aritmetikten daha yavaştı. Ancak artık kontrol akışı kararları bir hesaplamanın değerine bağlı olmadığı sürece kayan noktalı aritmetik daha hızlıdır.

Android ses biçimleri

Ses için başlıca Android biçimleri aşağıdaki tabloda listelenmiştir:

Notasyon
Özellik Q0.15 Q0.7 1 0,23 saniye S0.31 float
Container
bits
16 8 24 veya 32 2 32 32
Anlamlı bitler
işaret dahil
16 8 24 24 veya 32 2 25 3
dB cinsinden
boşluk
0 0 0 0 126 4
Dinamik aralık
(dB cinsinden)
90 42 138 138 ila 186 900 5

Yukarıdaki tüm sabit nokta biçimlerinin nominal aralığı, bir LSB eksi -1,0 ile +1,0 arasındadır. İkilik tamamlayıcı gösterimi nedeniyle pozitif değerden bir tane daha negatif değer vardır.

Dipnotlar:

  1. Yukarıdaki tüm biçimler, imzalı örnek değerleri ifade eder. 8 bitlik biçim genellikle "işaretsiz" olarak adlandırılır ancak aslında 0.10000000 önyargısıyla işaretli bir değerdir.
  2. Q0.23, 24 bit (üç 8 bit bayt, küçük endian) olarak paketlenebilir veya 32 bit olarak paketten çıkarılabilir. Paketi açılmışsa anlamlı bitler, en büyük boyutlu bitlere doğru işaret uzantısı doldurma ile en küçük boyutlu bitlere doğru sağa ya da en büyük boyutlu bitlere doğru sıfır doldurma ile en küçük boyutlu bitlere doğru sola hizalanır (Q8.23) Q0.31 teorik olarak 32 önemli bit'e kadar izin verir, ancak Q0.31'i kabul eden donanım arayüzleri nadiren tüm bit'leri kullanır.
  3. Tek hassasiyetli kayan nokta, 23 açık bitin yanı sıra bir gizli bit ve işaret bitine sahiptir. Bu da toplam 25 önemli bit yapar. Normal olmayan sayılar daha az önemli bit içerir.
  4. Tek hassasiyetli kayan nokta, ±1,7e+38'e kadar olan değerleri ifade edebilir.Bu da büyük marjı açıklar.
  5. Gösterilen dinamik aralık, nominal maksimum değere (±1,0) kadar olan normal olmayan değerler içindir. NEON gibi mimariye özgü bazı kayan nokta uygulamalarının, normal olmayan sayıları desteklemediğini unutmayın.

Dönüşümler

Bu bölümde, çeşitli gösterimler arasındaki veri dönüşümleri ele alınmaktadır.

Kayan nokta dönüşümleri

Bir değeri Qm.n biçiminden kayan noktaya dönüştürmek için:

  1. Değeri, tam sayıymış gibi kayan noktaya dönüştürün (virgülü yoksayarak).
  2. 2-n ile çarpın.

Örneğin, 4.27. çeyrek dahili değerini kayan noktaya dönüştürmek için şunları kullanın:

float = integer * (2 ^ -27)

Kayan noktadan sabit noktaya yapılan dönüşümler aşağıdaki kurallara uyar:

  • Tek hassasiyetli kayan noktanın nominal aralığı ±1,0'dur ancak ara değerler için tam aralık ±1,7e+38'dir. Harici temsil için kayan nokta ile sabit nokta arasında dönüşüm (ör. ses cihazlarına çıkış) yalnızca nominal aralığı dikkate alır ve bu aralığı aşan değerler için sınırlama uygulanır. Özellikle +1, 0 sabit nokta biçimine dönüştürüldüğünde +1, 0 eksi bir LSB değerine sabitlenir.
  • Normal olmayan değerlere (normal olmayan değerler) ve +/- 0,0'a gösterimde izin verilir ancak işleme sırasında sessizce 0,0'a dönüştürülebilir.
  • Sonsuz değerler işlemlerden geçer veya sessiz bir şekilde +/- 1,0 değerine sabitlenir. Genellikle ikincisi, sabit nokta biçimine dönüştürme için kullanılır.
  • NaN davranışı tanımlanmamıştır: NaN, aynı NaN olarak yayılabilir veya varsayılan NaN'a dönüştürülebilir, sessizce +/- 1, 0 ile sınırlandırılabilir veya sessizce 0, 0'a dönüştürülebilir ya da hatayla sonuçlanabilir.

Sabit nokta dönüşümleri

Farklı Qm.n biçimleri arasındaki dönüşümler aşağıdaki kurallara uyar:

  • m arttığında, sol taraftaki tam sayı bölümünü işaretli olarak uzatın.
  • m azaldığında tam sayı kısmı sabitlenir.
  • n arttığında, sağdaki kesirli kısmı sıfırla genişletin.
  • n azaldığında, sağdaki fazla kesirli bitleri dithering, yuvarlama veya kısaltma işlemine tabi tutun.

Örneğin, bir Q4.27 değerini Q0.15'e dönüştürmek için (gölgeleme veya yuvarlama olmadan) Q4.27 değerini 12 bit sağa kaydırın ve 16 bitlik işaretli aralığı aşan tüm sonuçları sınırlayın. Bu işlem, Q temsilinin noktasını hizalar.

Q7.24'ü Q7.23'e dönüştürmek için işaretli olarak 2'ye bölme işlemi yapın veya eşdeğer olarak işaretli bit'i Q7.24 tam sayı miktarına ekleyin ve ardından işaretli olarak 1 sağa kaydırın. Basit bir imzalı sağ kaydırmanın, imzalı 2'ye bölme işlemine eşit olmadığını unutmayın.

Kayıplı ve kayıpsız dönüşümler

Dönüştürülebilir bir dönüşüm kaybetsizdir: A'ten B'e ve C'e giden bir dönüşüm A = C ile sonuçlanır. Aksi takdirde dönüşüm kayba uğrar.

Kaybetsiz dönüşümler, dönüşüm biçimi dönüşümüne izin verir.

25 veya daha az önemli bit içeren sabit nokta gösteriminden kayan noktaya yapılan dönüşümler kayıpsızdır. Kayan noktadan herhangi bir yaygın sabit nokta gösterimine yapılan dönüştürmelerde kayıp yaşanır.