Kami memodifikasi tumpukan Bluetooth untuk meningkatkan suara pada headphone tanpa codec AAC, aptX dan LDAC

Sebelum membaca artikel ini, Anda disarankan untuk membaca artikel sebelumnya: Audio via Bluetooth: sebanyak mungkin tentang profil, codec, dan perangkat / dalam bahasa Inggris

Beberapa pengguna headphone nirkabel mencatat kualitas audio yang buruk dan kurangnya frekuensi tinggi ketika menggunakan codec SBC Bluetooth standar, yang mendukung semua perangkat audio. Rekomendasi yang sering dilakukan untuk meningkatkan suara adalah membeli perangkat dan headphone yang mendukung codec aptX dan LDAC. Codec ini memerlukan biaya lisensi, sehingga perangkat dengan dukungan mereka lebih mahal.

Ternyata kualitas SBC yang rendah disebabkan oleh keterbatasan artifisial dari tumpukan Bluetooth dan pengaturan headphone, dan pembatasan ini dapat dielakkan pada perangkat yang ada dengan perubahan perangkat lunak ke smartphone atau komputer.

SBC Codec

SBC codec memiliki banyak parameter berbeda yang konsisten selama fase pengaturan koneksi. Diantaranya adalah:

  • Jumlah dan jenis saluran: Joint Stereo, Stereo, Dual Channel, Mono;
  • Jumlah pita frekuensi: 4 atau 8;
  • Jumlah blok dalam paket: 4, 8, 12, 16;
  • Algoritma alokasi bit kuantisasi: Loudness, SNR;
  • Nilai maksimum dan minimum dari kumpulan bit yang digunakan dalam kuantisasi (bitpool): biasanya, dari 2 hingga 53.


Perangkat decoding harus mendukung kombinasi parameter ini. Encoder mungkin tidak mengimplementasikan semua.
Tumpukan Bluetooth yang ada, sebagai suatu peraturan, menyetujui profil berikut: Stereo Bersama, 8 band, 16 blok, Loudness, bitpool 2..53. Profil ini menyandikan audio 44,1 kHz dengan bit rate 328 kbps.
Parameter bitpool secara langsung mempengaruhi bitrate dalam satu profil: semakin tinggi, semakin tinggi bitrate, dan oleh karena itu kualitasnya.
Namun, parameter bitpool tidak terikat ke profil tertentu; Parameter lain juga berdampak pada laju bit: jenis saluran, jumlah pita frekuensi, jumlah blok. Anda dapat meningkatkan bitrate secara tidak langsung dengan menegosiasikan profil non-standar tanpa mengubah bitpool.

bitrate= frac8 timesframe length timessample ratesubbands timesblocks


Formula Bitrate SBC


Misalnya, mode Dual Channel mengkodekan saluran secara terpisah, menggunakan seluruh bitpool untuk setiap saluran. Dengan memaksa perangkat untuk menggunakan Dual Channel, bukan Joint Stereo, kami mendapatkan bitrate hampir dua kali lipat dengan nilai bitpool maksimum yang sama: 617 kbps.
Menurut pendapat saya, menggunakan nilai bitpool non-profil pada tahap persetujuan adalah kelemahan dalam standar A2DP, yang menyebabkan keterbatasan buatan kualitas SBC. Akan lebih bijaksana untuk menyetujui bitrate, bukan bitpool.

Nilai-nilai tetap ini, Bitpool dan Bitrate, berasal dari tabel dengan nilai yang disarankan untuk audio berkualitas tinggi. Tetapi rekomendasi itu bukan alasan untuk dibatasi pada nilai-nilai ini.

Tabel Profil Bluetooth SBC

Spesifikasi A2DP v1.2, yang aktif dari 2007 hingga 2015, mengharuskan semua perangkat decoding bekerja dengan benar dengan bitrate hingga 512 kbps:

Decoder SNK akan mendukung semua nilai bitpool yang mungkin yang tidak menghasilkan kelebihan dari bit rate maksimum. Profil ini membatasi laju bit maksimum yang tersedia hingga 320kb / s untuk mono, dan 512kb / s untuk mode dua saluran.


Tidak ada batas bitrate dalam versi spesifikasi yang baru. Diasumsikan bahwa headphone modern yang dirilis setelah 2015 dan mendukung EDR dapat mendukung bitrate hingga 30730 kbps.

Untuk beberapa alasan, tumpukan Bluetooth Linux yang saya uji (PulseAudio), Android, Blackberry dan macOS memiliki batasan buatan pada nilai maksimum dari parameter bitpool, yang secara langsung mempengaruhi bitrate maksimum. Tapi ini bukan masalah terbesar, hampir semua headphone juga membatasi nilai bitpool maksimum menjadi 53.
Karena saya sudah berhasil memastikan, sebagian besar perangkat berfungsi dengan baik pada tumpukan Bluetooth yang dimodifikasi dengan bit rate 551 kbit / s, tanpa gangguan dan kresek. Tetapi bitrate semacam itu tidak akan pernah dinegosiasikan dalam kondisi normal, pada tumpukan Bluetooth biasa.

Memodifikasi Bluetooth Stack

Tumpukan Bluetooth apa pun yang kompatibel dengan standar A2DP memiliki dukungan untuk mode Dual Channel, tetapi tidak dimungkinkan untuk mengaktifkannya dari antarmuka.

Mari tambahkan saklar ke antarmuka! Saya membuat tambalan untuk Android 8.1 dan Android 9 yang menambahkan dukungan penuh untuk Dual Channel ke stack, menambahkan mode ke menu switching mode ke alat pengembang, dan memproses SBC dengan dukungan Dual Channel seolah-olah itu adalah codec tambahan seperti aptX, AAC atau LDAC ( Android menyebutnya HD Audio) dengan menambahkan tanda centang ke pengaturan perangkat Bluetooth. Begini tampilannya:

gambar

Patch untuk Android 9
Patch untuk Android 8.1

Ketika kotak centang diaktifkan, audio Bluetooth mulai ditransmisikan dengan laju bit 551 kbps jika headphone mendukung koneksi pada 3 Mbps, atau 452 kbps jika headphone hanya mendukung 2 Mbps.

Patch ini termasuk dalam firmware alternatif berikut:
  • LineageOS
  • Remix kebangkitan
  • crDroid


Dari mana datangnya 551 dan 452 kbit / s?

Teknologi Bluetooth split-air dirancang untuk secara efisien mentransfer paket berukuran besar. Data ditransmisikan oleh slot, jumlah slot terbesar yang dikirim dalam satu transmisi adalah 5. Ada juga mode transmisi yang menggunakan 1 atau 3 slot, tetapi bukan 2 atau 4. Dalam 5 slot, Anda dapat mentransfer hingga 679 byte pada kecepatan koneksi 2 Mbps dan hingga 1021 byte pada kecepatan 3 Mbps, dan masing-masing dalam 3 - 367 dan 552 byte.

gambar

Jika kita ingin mentransfer lebih sedikit data dari 679 atau 1021 byte, tetapi lebih dari 367 atau 552 byte, maka transfer akan tetap membutuhkan 5 slot, dan data akan ditransmisikan dalam waktu yang bersamaan, yang mengurangi efisiensi transmisi.

gambar

SBC dalam mode Dual Channel, pada audio 44100 Hz dengan parameter Bitpool 38, 16 blok per frame, 8 rentang frekuensi, mengkodekan audio ke dalam bingkai dengan ukuran 164 byte, dengan bitrate 452 kbps.
Audio harus dienkapsulasi dalam protokol transfer L2CAP dan AVDTP, yang mengambil 16 byte dari muatan audio.

\ begin {align *} framelength & = 4 + \ frac {subbands \ times channels} {2} + \\ & \ begin {cases} \ frac {blocks \ times channels \ kali bitpool} {8} & \ text { jika mode mono atau saluran ganda} \\ \ frac {subbands + blok \ kali bitpool} {8} & \ teks {jika mode stereo bersama} \\ \ frac {blok \ kali bitpool} {8} & \ teks {jika stereo mode} \\ \ end {cases} \ end {align *}





Dengan demikian, dalam satu transmisi Bluetooth dengan 5 slot, dimungkinkan untuk mengakomodasi 4 frame audio:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 ( SBC) - (164*4) = 6 

Kami memasukkan 11,7 ms data audio ke dalam paket pengiriman, yang akan dikirim dalam 3,75 ms, dan kami memiliki 6 byte yang tidak digunakan dalam paket.
Jika Anda sedikit meningkatkan bitpool, 4 frame audio tidak lagi dapat dikemas dalam satu paket. Anda harus mengirim 3 frame sekaligus, yang mengurangi efisiensi transmisi, mengurangi jumlah audio yang ditransmisikan per paket, dan dengan cepat akan menyebabkan gagap audio dalam kondisi radio yang buruk.

Dengan cara yang sama, bit rate 551 kbit / s dipilih untuk EDR 3 Mbps: dengan Bitpool 47, 16 blok per frame, 8 rentang frekuensi, ukuran frame adalah 200 byte, dengan bit rate 551 kbit / s. 5 frame atau 14,6 ms musik cocok dalam satu paket.

Algoritma untuk menghitung semua parameter SBC cukup rumit, Anda dapat dengan mudah menjadi bingung jika Anda menghitung secara manual, jadi saya membuat kalkulator interaktif untuk membantu mereka yang tertarik: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Mengapa semua ini perlu?

Berlawanan dengan kepercayaan umum tentang kualitas suara codec aptX, ini mungkin menghasilkan hasil yang lebih buruk pada beberapa file daripada SBC dengan bit rate standar 328 kbps.

SBC secara dinamis mengalokasikan bit kuantisasi untuk pita frekuensi, yang beroperasi dengan basis "bawah ke atas". Jika seluruh bitrate digunakan untuk frekuensi rendah dan menengah, frekuensi yang lebih tinggi akan "terputus" (akan ada keheningan sebagai gantinya).
aptX menghitung pita frekuensi dengan jumlah bit yang sama secara terus-menerus, itulah sebabnya ia memiliki bitrate konstan: 352 kbit / s untuk 44,1 kHz, 384 kbit / s untuk 48 kHz, dan tidak dapat "mentransfer bit" ke frekuensi tersebut paling membutuhkan mereka. Tidak seperti SBC, aptX tidak akan "memotong" frekuensinya, tetapi akan menambahkan noise kuantisasi pada mereka, mengurangi rentang dinamis audio, dan kadang-kadang mengenalkan karakteristik crackles. SBC, di sisi lain, "memakan detail" - membuang area yang paling sunyi.
Dibandingkan dengan SBC 328k, rata-rata, aptX memperkenalkan lebih sedikit distorsi pada musik dengan rentang frekuensi yang luas, tetapi kadang-kadang memenangkan musik dengan rentang frekuensi yang sempit dan rentang dinamis yang luas.

Pertimbangkan kasus khusus. Spectrogram untuk merekam piano:
gambar

Energi utama terletak pada frekuensi dari 0 hingga 4 kHz, dan bertahan hingga 10 kHz.
Spektrogram file yang dikompresi dalam aptX adalah sebagai berikut:
gambar

Dan itu terlihat SBC 328k.
gambar

Dapat dilihat bahwa SBC 328k secara berkala benar-benar mematikan kisaran di atas 16 kHz, dan mengkonsumsi semua bitrate yang tersedia untuk rentang di bawah nilai ini. Namun, aptX memperkenalkan lebih banyak distorsi ke dalam spektrum frekuensi yang didengar oleh telinga manusia, yang dapat dilihat pada spektogram asli yang dikurangkan dari spektrogram aptX (semakin cerah, semakin banyak distorsi):
gambar

Sementara SBC 328k kurang mengacaukan sinyal di kisaran 0 hingga 10 kHz, dan memotong sisanya -
gambar

Bitrate SBC 485k cukup untuk menyimpan seluruh rentang frekuensi, tanpa memutus hubungan band.
gambar

SBC 485k pada komposisi ini jauh di depan aptX dalam kisaran 0-15 kHz, dan dengan perbedaan yang lebih kecil namun masih terlihat - 15-22 kHz (semakin gelap, semakin sedikit distorsi):
gambar

Arsip audio asli, SBC dan aptX .

Beralih ke SBC bit tinggi, Anda akan mendapatkan suara, seringkali lebih unggul daripada aptX, pada headphone apa pun. Pada headphone yang mendukung koneksi EDR 3 Mbps, bit rate 551 Kbps menghasilkan suara yang sebanding dengan aptX HD.

Bisakah saya memiliki lebih banyak?

Patch untuk Android juga memiliki opsi untuk lebih meningkatkan bitrate untuk perangkat EDR 2 Mbps. Anda dapat meningkatkan bitrate dari 452 kbps menjadi 595 kbps, dengan biaya mengurangi stabilitas transmisi dalam kondisi radio yang kompleks.
Cukup atur variabel persist.bluetooth.sbc_hd_higher_bitrate menjadi 1:
 # setprop persist.bluetooth.sbc_hd_higher_bitrate 1 

Patch bitrate ekstrim sejauh ini hanya diterima di LineageOS 15.1, tetapi tidak di 16.0.

Kompatibilitas perangkat

SBC Dual Channel didukung oleh hampir semua headphone, speaker, dan unit kepala mobil. Ini tidak mengherankan - standar menentukan dukungannya pada perangkat decoding apa pun. Ada sejumlah kecil perangkat yang mode ini menyebabkan masalah, tetapi ini adalah contoh tunggal.
Rincian lebih lanjut tentang perangkat yang kompatibel dapat ditemukan di w3bsit3-dns.com atau xda-developer .

Perbandingan perbedaan suara

Saya membuat layanan enkode audio dalam SBC (dan juga aptX dan aptX HD) secara real time, tepat di browser. Dengannya, Anda dapat membandingkan suara berbagai profil SBC dan codec lainnya, tanpa benar-benar mentransmisikan audio melalui Bluetooth, pada headphone kabel apa pun, speaker, dan musik favorit Anda, serta mengubah pengaturan penyandian secara langsung selama pemutaran audio.
btcodecs.valdikss.org.ru/sbc-encoder

Hubungi Pengembang Android

Saya menulis kepada banyak pengembang Google Bluetooth stack dengan permintaan untuk mempertimbangkan dimasukkannya tambalan di cabang Android utama - AOSP, tetapi tidak menerima satu jawaban pun. Tambalan saya di sistem tambalan Gerrit untuk Android juga dibiarkan tanpa komentar oleh siapa pun yang terlibat.
Saya akan senang jika saya dibantu sehubungan dengan pengembang dari Google dan implementasi SBC HD di Android. Gerrit patch sudah usang (ini adalah salah satu revisi awal), dan saya akan memperbaruinya jika pengembang tertarik pada perubahan saya (tidak mudah bagi saya untuk memperbaruinya, saya tidak memiliki perangkat yang kompatibel dengan Android Q).

Kesimpulan

Pengguna smartphone dengan LineageOS, Resurrection Remix, dan firmware crDroid dapat puas dengan kualitas suara yang ditingkatkan sekarang, cukup aktifkan opsi dalam pengaturan perangkat Bluetooth. Pengguna Linux juga bisa mendapatkan bitrate SBC yang meningkat dengan menginstal patch dari Pali RohΓ‘r , yang, antara lain, menambahkan dukungan untuk codec aptX, aptX HD dan FastStream.

Source: https://habr.com/ru/post/id455316/


All Articles