AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

Bu makaleyi okumadan önce bir önceki makaleyi okumanızı öneririz: Bluetooth üzerinden ses: profiller, codec'ler ve cihazlar hakkında maksimum ayrıntı

Bazı kablosuz kulaklık kullanıcıları, tüm ses cihazları tarafından desteklenen standart SBC Bluetooth codec bileşenini kullanırken düşük ses kalitesini ve yüksek frekansların eksikliğini bildirmektedir. Sesi iyileştirmeye yönelik yaygın bir öneri, aptX ve LDAC codec bileşenlerini destekleyen cihazlar ve kulaklıklar satın almaktır. Bu codec'ler lisans ücreti gerektirdiğinden bunları destekleyen cihazlar daha pahalıdır.

SBC'nin düşük kalitesinin, Bluetooth yığınlarının ve kulaklık ayarlarının yapay sınırlamalarından kaynaklandığı ve bu sınırlamanın, bir akıllı telefon veya bilgisayardaki yazılım değişiklikleri yoluyla mevcut herhangi bir cihazda atlanabileceği ortaya çıktı.

Codec SBC'si

SBC codec bileşeni, bağlantı kurulum aşamasında görüşülen birçok farklı parametreye sahiptir. Aralarında:

  • Kanal sayısı ve türü: Ortak Stereo, Stereo, Çift Kanal, Mono;
  • Frekans bantlarının sayısı: 4 veya 8;
  • Paketteki blok sayısı: 4, 8, 12, 16;
  • Niceleme sırasında bitleri dağıtmak için algoritma: Ses yüksekliği, SNR;
  • Niceleme sırasında kullanılan bit havuzunun maksimum ve minimum değeri (bit havuzu): genellikle 2 ila 53 arasındadır.

Kod çözme cihazı bu parametrelerin herhangi bir kombinasyonunu desteklemelidir. Kodlayıcı her şeyi uygulamayabilir.
Mevcut Bluetooth yığınları genellikle şu profil üzerinde mutabakata varır: Ortak Stereo, 8 bant, 16 blok, Ses Yüksekliği, bitpool 2..53. Bu profil, 44.1 kbps bit hızında 328 kHz sesi kodlar.
Bit havuzu parametresi, bir profil içindeki bit hızını doğrudan etkiler: ne kadar yüksek olursa, bit hızı ve dolayısıyla kalite de o kadar yüksek olur.
Ancak bit havuzu parametresi belirli bir profile bağlı değildir; Bit hızı ayrıca diğer parametrelerden de büyük ölçüde etkilenir: kanal türü, frekans bantlarının sayısı, blok sayısı. Bit havuzunu değiştirmeden standart dışı profiller üzerinde anlaşarak bit hızını dolaylı olarak artırabilirsiniz.

AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

SBC bit hızını hesaplamak için formül

Örneğin, Çift Kanal modu, her kanal için bit havuzunun tamamını kullanarak kanalları ayrı ayrı kodlar. Cihazı Ortak Stereo yerine Çift Kanal kullanmaya zorlayarak, aynı maksimum bit havuzu değeri olan 617 kbps ile neredeyse iki kat bit hızı elde ediyoruz.
Bana göre, müzakere aşamasında bir profile bağlı olmayan bir bit havuzu değerinin kullanılması, A2DP standardındaki bir kusurdur ve bu, SBC kalitesinin yapay olarak sınırlandırılmasına yol açmıştır. Bit havuzu yerine bit hızı üzerinde anlaşmak daha mantıklı olacaktır.

Bu sabit Bitpool ve Bit Hızı değerleri, yüksek kaliteli ses için kullanılması önerilen değerlerin bulunduğu bir tablodan kaynaklanır. Ancak tavsiye, kendinizi bu değerlerle sınırlamanız için bir neden değildir.

AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

2'den 1.2'e kadar aktif olan A2007DP v2015 spesifikasyonu, tüm kod çözme cihazlarının 512 kbps'ye kadar bit hızlarıyla doğru şekilde çalışmasını gerektirir:

SNK'nin kod çözücüsü, maksimum bit hızının aşılmasına neden olmayan tüm olası bit havuzu değerlerini destekleyecektir. Bu profil, mevcut maksimum bit hızını mono için 320 kb/s ve iki kanallı modlar için 512 kb/s ile sınırlar.

Spesifikasyonun yeni versiyonunda bit hızı konusunda herhangi bir sınırlama yoktur. 2015'ten sonra piyasaya sürülen ve EDR'yi destekleyen modern kulaklıkların ≈730 kbps'ye kadar bit hızlarını destekleyebileceği tahmin edilmektedir.

Bazı nedenlerden dolayı, test ettiğim Linux (PulseAudio), Android, Blackberry ve macOS Bluetooth yığınları, maksimum bit hızını doğrudan etkileyen bitpool parametresinin maksimum değeri üzerinde yapay sınırlara sahiptir. Ancak en büyük sorun bu değil; neredeyse tüm kulaklıklar maksimum bitpool değerini 53 ile sınırlandırıyor.
Daha önce de gördüğüm gibi çoğu cihaz, 551 kbps bit hızına sahip değiştirilmiş bir Bluetooth yığınında kesinti veya çatlama olmadan mükemmel şekilde çalışıyor. Ancak böyle bir bit hızı, normal Bluetooth yığınlarında normal koşullar altında asla tutarlı olmayacaktır.

Bluetooth yığınını değiştirme

A2DP standardıyla uyumlu herhangi bir Bluetooth yığınının Çift Kanal modu desteği vardır ancak bunu arayüzden etkinleştirmek mümkün değildir.

Arayüze bir geçiş ekleyelim! Android 8.1 ve Android 9 için yığına tam Çift Kanal desteği ekleyen, geliştirme araçlarındaki mod değiştirme menüsüne bir mod ekleyen ve Çift Kanal özellikli SBC'lere aptX gibi ek bir codec bileşeniymiş gibi davranan yamalar yaptım , AAC veya LDAC'yi (Android buna HD Audio adını verir) Bluetooth cihazı ayarlarına bir onay işareti ekleyerek seçebilirsiniz. Şuna benziyor:

AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

Android 9 için yama
Android 8.1 için yama

Onay kutusu etkinleştirildiğinde, Bluetooth sesi bir bit hızında iletilmeye başlar 551 kbps, kulaklıklar 3 Mbit/s bağlantı hızını destekliyorsa veya 452 kbps, kulaklık yalnızca 2 Mbit/s'yi destekliyorsa.

Bu yama aşağıdaki alternatif yazılımlara dahildir:

  • LineageOS
  • Diriliş Remix
  • crDroid

551 ve 452 kbit/s nereden geldi?

Bluetooth hava paylaşım teknolojisi, büyük sabit boyutlu paketleri verimli bir şekilde iletmek için tasarlanmıştır. Veri aktarımı slotlarda gerçekleşir, bir aktarımda gönderilen en fazla slot sayısı 5'tir. Ayrıca 1 veya 3 slot kullanan ancak 2 veya 4'ü kullanmayan transfer modları da vardır. 5 slotta bağlantı hızında 679 bayta kadar aktarım yapabilirsiniz. 2 Mbit/s ve 1021 Mbit/s hızında 3 bayta kadar ve sırasıyla 3 - 367 ve 552 bayta kadar.

AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

679 veya 1021 byte'tan az, 367 veya 552 byte'tan fazla veri aktarmak istersek aktarım yine 5 slot alacaktır ve veriler aynı anda aktarılacaktır, bu da aktarım verimliliğini azaltır.

AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

Çift Kanal modunda SBC, Bitpool 44100 parametreli 38 Hz ses, kare başına 16 blok, 8 frekans aralığı, sesi 164 kbps bit hızıyla 452 bayt kareye kodlar.
Sesin, ses yükünden 2 bayt alan L16CAP ve AVDTP aktarım protokollerinde kapsüllenmesi gerekir.

AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

Böylece, 5 yuvalı bir Bluetooth iletimi 4 ses çerçevesini barındırabilir:

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (заголовок SBC) - (164*4) = 6

Gönderilen pakete 11.7 ms'de iletilecek olan 3.75 ms'lik ses verisini sığdırıyoruz ve pakette 6 adet kullanılmayan bayt kalıyor.
Bit havuzunu biraz yükseltirseniz artık 4 ses çerçevesini tek bir pakete sığdırmak mümkün olmayacaktır. Bir seferde 3 kare göndermeniz gerekecektir; bu da iletim verimliliğini azaltır, kare başına iletilen ses miktarını azaltır ve kötü radyo koşullarında sesin daha hızlı bir şekilde takılmasına neden olur.

Aynı şekilde, EDR 551 Mbit/s için 3 kbit/s'lik bir bit hızı seçilmiştir: Bitpool 47 ile, çerçeve başına 16 blok, 8 frekans aralığı, çerçeve boyutu 200 bayttır ve bit hızı 551 kbit/s'dir. Bir pakette 5 kare veya 14.6 ms müzik bulunur.

Tüm SBC parametrelerini hesaplamak için kullanılan algoritma oldukça karmaşıktır, manuel olarak sayarsanız kolayca kafanız karışabilir, bu yüzden ilgilenenlere yardımcı olmak için etkileşimli bir hesap makinesi hazırladım: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Bütün bunlara neden ihtiyaç duyuldu?

AptX codec bileşeninin ses kalitesi hakkındaki yaygın inanışın aksine, bazı dosyalarda standart 328 kbps bit hızıyla SBC'den daha kötü sonuçlar üretebilir.

SBC, nicemleme bitlerini frekans bantlarına düşükten yükseğe doğru dinamik olarak tahsis eder. Bit hızının tamamı düşük ve orta frekanslar için kullanılmışsa, yüksek frekanslar "kesilecektir" (bunun yerine sessizlik olacaktır).
aptX her zaman aynı sayıda bit içeren frekans bantlarını niceler, bu nedenle sabit bir bit hızına sahiptir: 352 kHz için 44.1 kbps, 384 ​​kHz için 48 kbps ve bunlara en çok ihtiyaç duyan frekanslara "bit kaydırması" yapılamaz. . SBC'den farklı olarak aptX, frekansları "kesmeyecek" ancak bunlara nicemleme gürültüsü ekleyerek sesin dinamik aralığını azaltacak ve bazen karakteristik çatırtılara neden olacaktır. SBC "ayrıntıları yer" - en sessiz alanları göz ardı eder.
Ortalama olarak, SBC 328k ile karşılaştırıldığında aptX, geniş frekans aralığına sahip müzikte daha az distorsiyona neden olur, ancak dar frekans aralığı ve geniş dinamik aralığa sahip müzikte SBC 328k bazen kazanır.

Özel bir durumu ele alalım. Bir piyano çalma kaydının spektrogramı:
AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

Ana enerji 0 ila 4 kHz arasındaki frekanslarda bulunur ve 10 kHz'e kadar devam eder.
AptX'te sıkıştırılmış bir dosyanın spektrogramı şuna benzer:
AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

SBC 328k işte böyle görünüyor.
AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

SBC 328k'nin periyodik olarak 16 kHz'in üzerindeki aralığı tamamen kapattığı ve mevcut tüm bit hızını bu değerin altındaki aralıklara harcadığı görülebilir. Bununla birlikte, aptX, aptX spektrogramından çıkarılan orijinal spektrogramda görülebileceği gibi, insan kulağının duyabileceği frekans spektrumuna daha fazla distorsiyon getirmiştir (ne kadar parlaksa, o kadar distorsiyon):
AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

SBC 328k, sinyali 0 ila 10 kHz aralığında daha az bozar ve geri kalanını keser:
AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

SBC'nin 485k bit hızı, bantları devre dışı bırakmadan tüm frekans aralığını korumak için yeterliydi.
AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

SBC 485k, 0-15 kHz aralığında bu yolda aptX'in önemli ölçüde ilerisindedir ve daha küçük ama yine de fark edilir bir farkla - 15-22 kHz'de (ne kadar karanlıksa o kadar az bozulma):
AAC, aptX ve LDAC kodekleri olmayan kulaklıklarda sesi iyileştirmek için Bluetooth yığınını değiştiriyoruz

Orijinal ses, SBC ve aptX arşivi.

Yüksek bit hızına sahip bir SBC'ye geçerek, çoğu zaman herhangi bir kulaklıktaki aptX'i geride bırakan ses elde edeceksiniz. 3 Mbps EDR bağlantısını destekleyen kulaklıklarda 551 kbps bit hızı, aptX HD ile karşılaştırılabilir ses üretir.

Daha fazlasını yapabilir misin?

Android yaması ayrıca 2 Mbps EDR cihazları için bit hızını daha da artırma seçeneğini de içeriyor. Zorlu radyo koşullarında iletim stabilitesini azaltma pahasına bit hızını 452 kbit/s'den 595 kbit/s'ye artırabilirsiniz.
Persist.bluetooth.sbc_hd_higher_bitrate değişkenini 1 olarak ayarlamanız yeterlidir:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Aşırı bit hızı yaması şu ana kadar yalnızca LineageOS 15.1'de benimsendi, ancak 16.0'da benimsenmedi.

Cihaz Uyumluluğu

SBC Çift Kanal neredeyse tüm kulaklıklar, hoparlörler ve araç ana üniteleri tarafından desteklenir. Bu hiç de şaşırtıcı değil; standart, herhangi bir kod çözme cihazında desteklenmesini gerektiriyor. Bu modun sorunlara neden olduğu az sayıda cihaz vardır, ancak bunlar izole edilmiş örneklerdir.
Uyumlu cihazlar hakkında daha fazla ayrıntıyı şu adreste bulabilirsiniz: W4bsitXNUMX-dns.com veya XDA-Developers.

Ses farklılıklarının karşılaştırılması

Sesi doğrudan tarayıcıdan SBC'ye (ayrıca aptX ve aptX HD'ye) gerçek zamanlı olarak kodlayan bir web hizmeti hazırladım. Bununla, farklı SBC profillerinin ve diğer codec bileşenlerinin sesini, aslında Bluetooth üzerinden ses iletmeden, herhangi bir kablolu kulaklıkta, hoparlörde ve en sevdiğiniz müzikte karşılaştırabilir ve ayrıca ses oynatırken kodlama parametrelerini doğrudan değiştirebilirsiniz.
btcodecs.valdikss.org.ru/sbc-encoder

Android Geliştiricileriyle İletişime Geçin

Google'daki birçok Bluetooth yığını geliştiricisine, yamaları ana Android şubesi olan AOSP'ye eklemeyi düşünmelerini istediğimi yazdım, ancak tek bir yanıt alamadım. Benim yamalarım Android için Gerrit yama sistemi ayrıca olaya dahil olan herhangi birinden yorum yapılmadan kaldı.
Google'daki geliştiricilerle iletişime geçme ve SBC HD'yi Android'e getirme konusunda yardım alabilirsem çok mutlu olurum. Gerrit'teki yama zaten güncel değil (bu ilk revizyonlardan biri) ve geliştiriciler değişikliklerimle ilgilenirse onu güncelleyeceğim (güncellemek benim için kolay değil, Android Q ile uyumlu cihazlarım yok) ).

Sonuç

LineageOS, Resurrection Remix ve crDroid donanım yazılımına sahip akıllı telefon kullanıcıları artık iyileştirilmiş ses kalitesinin keyfini çıkarabilir; yalnızca Bluetooth cihaz ayarlarındaki seçeneği etkinleştirmeniz yeterlidir. Linux kullanıcıları ayrıca kurulum yaparak daha yüksek SBC bit hızı elde edebilirler. Pali Rohar'dan yamaBu, diğer şeylerin yanı sıra aptX, aptX HD ve FastStream codec bileşenleri için destek ekler.

Kaynak: habr.com

Yorum ekle