Veri biçimleri

Android, dahili olarak çok çeşitli ses verisi biçimleri kullanır ve bunların bir alt kümesini genel API'lerde, dosya biçimlerinde ve Donanım Soyutlama Katmanı'nda (HAL) kullanıma sunar.

Özellikleri

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

Sıkıştırma
Sıkıştırılmamış , kayıpsız sıkıştırılmış veya kayıplı sıkıştırılmış . PCM en yaygın sıkıştırılmamış ses formatıdır. FLAC kayıpsız sıkıştırılmış bir formattır, MP3 ve AAC ise kayıplı sıkıştırılmış formatlardır.
Bit derinliği
Ses örneği başına anlamlı bit sayısı.
Konteynır boyutu
Bir örneği depolamak veya iletmek için kullanılan bit sayısı. Genellikle bu, bit derinliği ile aynıdır, ancak bazen hizalama için ek dolgu bitleri tahsis edilir. Örneğin, 32 bitlik bir sözcük içinde 24 bitlik bir örnek bulunabilir.
hizalama
Kap boyutu, bit derinliğine tam olarak eşitse, gösterime paketli denir. Aksi takdirde temsil paketinden çıkar . Örneğin anlamlı bitleri, tipik olarak, kabın en solundaki (en anlamlı) veya en sağdaki (en az önemli) bit ile hizalanır. Paketlenmiş ve paketlenmemiş terimlerini yalnızca bit derinliği ikinin katı olmadığında kullanmak gelenekseldir.
imza
Numunelerin imzalı veya imzasız olup olmadığı.
temsil
Sabit nokta veya kayan nokta; aşağıya bakınız.

Sabit nokta gösterimi

Sabit nokta , özellikle donanım arayüzlerinde, sıkıştırılmamış PCM ses verilerinin en yaygın temsilidir.

Sabit noktalı bir sayı, sayı tabanı noktasından önce ve sonra sabit (sabit) basamak sayısına sahiptir. Tüm temsillerimiz taban 2'yi kullanır, bu nedenle basamak yerine bit ve taban noktası yerine ikili nokta veya basitçe nokta koyarız. Noktanın solundaki bitler tamsayı kısmı ve noktanın sağındaki bitler kesirli kısımdır .

PCM tamsayısından bahsediyoruz, çünkü sabit noktalı değerler genellikle tamsayı değerler olarak saklanır ve işlenir. Sabit nokta olarak yorumlama örtüktür.

Tüm imzalı sabit nokta gösterimleri için ikinin tümleyenini kullanırız, bu nedenle aşağıdakiler, tüm değerlerin bir LSB'nin birimlerinde olduğu durumlarda geçerlidir:

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

Q ve U notasyonu

Bir tamsayıda sabit nokta gösterimi için çeşitli gösterimler vardır. Q notasyonu kullanıyoruz: Q m . n , m tamsayı biti ve n kesirli bit anlamına gelir. Değer ikiye tümleyende 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 tamsayı biti ve n kesirli bit ve "U" sıfır bit olarak sayılır. Toplam bit sayısı m + n'dir .

Tamsayı kısmı nihai sonuçta kullanılabilir veya geçici olabilir. İkinci durumda, tamsayı kısmını oluşturan bitlere koruma bitleri denir. Koruma bitleri, nihai değer aralık dahilinde olduğu veya aralık dahilinde olması için sıkıştırılabildiği sürece, bir ara hesaplamanın taşmasına izin verir. Sabit nokta koruma bitlerinin solda olduğuna, kayan nokta birimi koruma basamaklarının yuvarlama hatasını azaltmak için kullanıldığına ve sağda olduğuna dikkat edin.

Kayan nokta gösterimi

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

  • Daha fazla boşluk payı ve dinamik aralık ; kayan noktalı aritmetik, ara hesaplama sırasında nominal aralıkları aşmayı tolere eder ve yalnızca sonunda değerleri sabitler
  • Sonsuzluklar ve NaN gibi özel değerler için destek
  • Birçok durumda kullanımı daha kolay

Tarihsel olarak, kayan nokta aritmetiği, tamsayı veya sabit nokta aritmetiğinden daha yavaştı, ancak kontrol akışı kararlarının bir hesaplamanın değerine dayalı olmaması koşuluyla, kayan noktanın daha hızlı olması artık yaygın bir durum.

Ses için Android biçimleri

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

gösterim
Mülk Q0.15 Q0.7 1 Q0.23 Q0.31 batmadan yüzmek
Konteyner
bit
16 8 24 veya 32 2 32 32
önemli bitler
işareti dahil
16 8 24 24 veya 32 2 25 3
tavan boşluğu
dB cinsinden
0 0 0 0 126 4
Dinamik aralık
dB cinsinden
90 42 138 138 ila 186 900 5

Yukarıdaki tüm sabit noktalı biçimlerin nominal aralığı -1.0 ila +1.0 eksi bir LSB'dir. İkisinin tümleyen gösterimi nedeniyle, pozitif değerden bir negatif değer daha vardır.

Dipnotlar:

  1. Yukarıdaki tüm formatlar, imzalı örnek değerleri ifade eder. 8 bitlik biçime genellikle "imzasız" denir, ancak aslında 0.10000000 önyargılı imzalı bir değerdir.
  2. Q0.23, 24 bit (üç 8 bit bayt, küçük endian) olarak paketlenebilir veya 32 bit olarak paketten çıkarılabilir. Paketlenmemişse, anlamlı bitler ya MSB'ye doğru işaret uzatma dolgulu (Q8.23) LSB'ye doğru sağa hizalanır veya LSB'ye doğru sıfır dolgulu MSB'ye doğru sola hizalanır (Q0.31). Q0.31 teorik olarak 32 anlamlı bite kadar izin verir, ancak Q0.31'i kabul eden donanım arayüzleri nadiren tüm bitleri kullanır.
  3. Tek duyarlıklı kayan nokta, 23 açık bit artı bir gizli bit ve işaret bitine sahiptir ve toplamda 25 anlamlı bit ile sonuçlanır. Normal olmayan sayılar daha az anlamlı bit içerir.
  4. Tek duyarlıklı kayan nokta, büyük boşluk payını açıklayan ±1.7e+38'e kadar değerleri ifade edebilir.
  5. Gösterilen dinamik aralık, nominal maksimum değer ±1.0'a kadar olan denormaller içindir. NEON gibi bazı mimariye özgü kayan nokta uygulamalarının denormalleri desteklemediğini unutmayın.

Dönüşümler

Bu bölümde, çeşitli gösterimler arasındaki veri dönüştürmeleri anlatılmaktadır.

Kayan nokta dönüşümleri

Q m'den bir değeri dönüştürmek için. n biçiminden kayan noktaya:

  1. Değeri bir tam sayıymış gibi kayan noktaya dönüştürün (noktayı yok sayarak).
  2. 2 - n ile çarpın .

Örneğin, bir Q4.27 dahili değerini kayan noktaya dönüştürmek için şunu kullanın:

float = integer * (2 ^ -27)

Kayan noktadan sabit noktaya dönüşümler şu kuralları takip eder:

  • Tek duyarlıklı kayan nokta nominal aralığı ±1.0'dır, ancak ara değerler için tam aralık ±1.7e+38'dir. Harici gösterim (ses cihazlarına çıkış gibi) için kayan nokta ve sabit nokta arasındaki dönüştürme, bu aralığı aşan değerler için sıkıştırma ile yalnızca nominal aralığı dikkate alacaktır. Özellikle, +1.0 sabit nokta biçimine dönüştürüldüğünde, +1.0 eksi bir LSB'ye sabitlenir.
  • Denormaller (alt normaller) ve hem +/- 0.0'a temsilde izin verilir, ancak işlem sırasında sessizce 0.0'a dönüştürülebilir.
  • Sonsuzluklar ya işlemlerden geçecek ya da sessizce +/- 1.0 ile sınırlandırılacaktır. Genellikle ikincisi, sabit nokta biçimine dönüştürmek içindir.
  • NaN davranışı tanımsızdır: bir NaN, aynı NaN olarak yayılabilir veya Varsayılan NaN'ye dönüştürülebilir, +/- 1.0 ile sessizce sabit sınırlanabilir veya sessizce 0.0'a dönüştürülebilir veya bir hatayla sonuçlanabilir.

Sabit nokta dönüşümleri

Farklı Q m arasındaki dönüşümler. n biçimleri şu kurallara uyar:

  • m arttırıldığında, işaret soldaki tamsayı kısmı uzatır.
  • m azaldığında tamsayı kısmını sıkıştırın.
  • n artırıldığında, sıfır sağdaki kesirli kısmı uzatır.
  • n azaltıldığında, sağdaki fazla kesirli bitleri taklidi yapın, yuvarlayın veya kısaltın.

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

Q7.24'ü Q7.23'e dönüştürmek için, 2'ye işaretli bir bölme yapın veya işaret bitini Q7.24 tamsayı miktarına eşdeğer şekilde ekleyin ve ardından sağa kaydırmayı 1 ile imzalayın. Basit bir işaretli sağa kaydırmanın eşdeğer olmadığını unutmayın . 2 ile imzalı bir bölme.

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

Bir dönüşüm, tersine çevrilebilirse kayıpsızdır : A B C bir dönüşüm, A = C ile sonuçlanır. Aksi takdirde dönüşüm kayıplı olur.

Kayıpsız dönüştürmeler , gidiş-dönüş biçimi dönüştürmeye izin verir.

25 veya daha az anlamlı bit içeren sabit nokta gösteriminden kayan noktaya dönüşümler kayıpsızdır. Kayan noktadan herhangi bir ortak sabit nokta gösterimine dönüşümler kayıplıdır.