Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Sebelum membaca artikel ini, anda disyorkan untuk membaca artikel sebelum ini: Audio melalui Bluetooth: butiran maksimum tentang profil, codec dan peranti

Sesetengah pengguna fon kepala wayarles melaporkan kualiti bunyi yang lemah dan kekurangan frekuensi tinggi apabila menggunakan codec Bluetooth SBC standard, yang disokong oleh semua peranti audio. Pengesyoran biasa untuk menambah baik bunyi ialah membeli peranti dan fon kepala yang menyokong codec aptX dan LDAC. Codec ini memerlukan bayaran pelesenan, jadi peranti yang menyokongnya lebih mahal.

Ternyata kualiti rendah SBC adalah disebabkan oleh pengehadan tiruan susunan Bluetooth dan tetapan fon kepala, dan had ini boleh dipintas pada mana-mana peranti sedia ada melalui perubahan perisian pada telefon pintar atau komputer.

Codec SBC

Codec SBC mempunyai banyak parameter berbeza yang dirundingkan semasa fasa persediaan sambungan. Antaranya:

  • Bilangan dan jenis saluran: Stereo Bersama, Stereo, Saluran Dwi, Mono;
  • Bilangan jalur frekuensi: 4 atau 8;
  • Bilangan blok dalam pakej: 4, 8, 12, 16;
  • Algoritma untuk mengedarkan bit semasa kuantisasi: Loudness, SNR;
  • Nilai maksimum dan minimum kumpulan bit yang digunakan semasa pengkuantitian (bitpool): biasanya dari 2 hingga 53.

Peranti penyahkodan mesti menyokong sebarang kombinasi parameter ini. Pengekod mungkin tidak melaksanakan segala-galanya.
Tindanan Bluetooth sedia ada biasanya bersetuju dengan profil berikut: Stereo Bersama, 8 jalur, 16 blok, Kenyaringan, bitpool 2..53. Profil ini mengekod audio 44.1 kHz pada kadar bit 328 kbps.
Parameter bitpool secara langsung mempengaruhi kadar bit dalam satu profil: semakin tinggi ia, semakin tinggi kadar bit, dan oleh itu kualitinya.
Walau bagaimanapun, parameter bitpool tidak terikat pada profil tertentu; Kadar bit juga banyak dipengaruhi oleh parameter lain: jenis saluran, bilangan jalur frekuensi, bilangan blok. Anda boleh meningkatkan kadar bit secara tidak langsung, dengan bersetuju dengan profil bukan standard, tanpa menukar bitpool.

Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Formula untuk mengira kadar bit SBC

Sebagai contoh, mod Dwi Saluran mengekod saluran secara berasingan, menggunakan keseluruhan bitpool untuk setiap saluran. Dengan memaksa peranti menggunakan Saluran Dwi dan bukannya Stereo Bersama, kami mendapat hampir dua kali ganda kadar bit dengan nilai bitpool maksimum yang sama: 617 kbps.
Pada pendapat saya, penggunaan nilai bitpool yang tidak terikat pada profil pada peringkat rundingan adalah kecacatan dalam piawaian A2DP, yang membawa kepada pengehadan tiruan kualiti SBC. Adalah lebih masuk akal untuk merundingkan kadar bit daripada bitpool.

Nilai Bitpool dan Bitrate tetap ini berasal daripada jadual dengan nilai yang disyorkan untuk digunakan untuk audio berkualiti tinggi. Tetapi pengesyoran bukanlah alasan untuk menghadkan diri anda kepada nilai-nilai ini.

Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Spesifikasi A2DP v1.2, yang aktif dari 2007 hingga 2015, memerlukan semua peranti penyahkodan berfungsi dengan betul dengan kadar bit sehingga 512 kbps:

Penyahkod SNK hendaklah menyokong semua kemungkinan nilai bitpool yang tidak menghasilkan lebihan daripada kadar bit maksimum. Profil ini mengehadkan kadar bit maksimum yang tersedia kepada 320kb/s untuk mono dan 512kb/s untuk mod dua saluran.

Dalam versi baharu spesifikasi tiada had pada kadar bit. Dianggarkan fon kepala moden dikeluarkan selepas 2015 yang menyokong EDR boleh menyokong kadar bit sehingga β‰ˆ730 kbps.

Atas sebab tertentu, tindanan Linux (PulseAudio), Android, Blackberry dan macOS Bluetooth yang saya uji mempunyai had buatan pada nilai maksimum parameter bitpool, yang secara langsung mempengaruhi kadar bit maksimum. Tetapi ini bukan masalah terbesar; hampir semua fon kepala juga mengehadkan nilai bitpool maksimum kepada 53.
Seperti yang telah saya lihat, kebanyakan peranti berfungsi dengan sempurna pada tindanan Bluetooth yang diubah suai dengan kadar bit 551 kbps, tanpa gangguan atau gemeretak. Tetapi kadar bit sedemikian tidak akan konsisten dalam keadaan biasa, pada tindanan Bluetooth biasa.

Mengubah suai tindanan Bluetooth

Mana-mana tindanan Bluetooth yang serasi dengan standard A2DP mempunyai sokongan untuk mod Dwi Saluran, tetapi tidak mungkin untuk mengaktifkannya daripada antara muka.

Mari tambahkan togol pada antara muka! Saya telah membuat tampung untuk Android 8.1 dan Android 9 yang menambahkan sokongan Dwi Saluran penuh pada timbunan, menambahkan mod pada menu togol mod dalam alat pembangun dan merawat SBC yang didayakan Dwi Saluran seolah-olah ia adalah codec tambahan seperti aptX , AAC atau LDAC ( Android memanggil Audio HD ini) dengan menambahkan tanda semak pada tetapan peranti Bluetooth. Inilah rupanya:

Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Patch untuk Android 9
Patch untuk Android 8.1

Apabila kotak semak diaktifkan, audio Bluetooth mula dihantar pada kadar bit 551 kbps, jika fon kepala menyokong kelajuan sambungan 3 Mbit/s, atau 452 kbps, jika fon kepala hanya menyokong 2 Mbit/s.

Tampalan ini disertakan dalam perisian tegar alternatif berikut:

  • LineageOS
  • Remix Kebangkitan
  • crDroid

Dari manakah 551 dan 452 kbit/s?

Teknologi perkongsian udara Bluetooth direka untuk menghantar paket bersaiz tetap yang besar dengan cekap. Pemindahan data berlaku dalam slot, bilangan slot terbesar yang dihantar dalam satu pemindahan ialah 5. Terdapat juga mod pemindahan yang menggunakan 1 atau 3 slot, tetapi bukan 2 atau 4. Dalam 5 slot anda boleh memindahkan sehingga 679 bait pada kelajuan sambungan sebanyak 2 Mbit/s dan sehingga 1021 bait pada kelajuan 3 Mbit/s, dan masing-masing pada 3 - 367 dan 552 bait.

Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Jika kami ingin memindahkan kurang data daripada 679 atau 1021 bait, tetapi lebih daripada 367 atau 552 bait, pemindahan masih akan mengambil 5 slot dan data akan dipindahkan dalam masa yang sama, yang mengurangkan kecekapan pemindahan.

Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

SBC dalam mod Dwi Saluran, pada audio 44100 Hz dengan parameter Bitpool 38, 16 blok setiap bingkai, 8 julat frekuensi, mengekod audio ke dalam bingkai 164 bait, dengan kadar bit 452 kbps.
Audio mesti dikapsulkan dalam protokol pemindahan L2CAP dan AVDTP, yang mengambil 16 bait daripada muatan audio.

Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Oleh itu, satu penghantaran Bluetooth dengan 5 slot boleh memuatkan 4 bingkai audio:

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ SBC) - (164*4) = 6

Kami memuatkan 11.7 ms data audio ke dalam paket yang dihantar, yang akan dihantar dalam 3.75 ms, dan kami mempunyai 6 bait yang tidak digunakan lagi dalam paket.
Jika anda menaikkan sedikit bitpool, ia tidak lagi dapat membungkus 4 bingkai audio ke dalam satu pakej. Anda perlu menghantar 3 bingkai pada satu masa, yang mengurangkan kecekapan penghantaran, mengurangkan jumlah audio yang dihantar setiap bingkai dan akan menyebabkan audio tergagap dengan lebih cepat dalam keadaan radio yang lemah.

Dengan cara yang sama, kadar bit 551 kbit/s telah dipilih untuk EDR 3 Mbit/s: dengan Bitpool 47, 16 blok setiap bingkai, 8 julat frekuensi, saiz bingkai ialah 200 bait, dengan kadar bit 551 kbit/s. Satu pakej mengandungi 5 bingkai atau 14.6 ms muzik.

Algoritma untuk mengira semua parameter SBC agak rumit, anda boleh keliru dengan mudah jika anda mengira secara manual, jadi saya membuat kalkulator interaktif untuk membantu mereka yang berminat: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Mengapa semua ini diperlukan?

Bertentangan dengan kepercayaan popular tentang kualiti bunyi codec aptX, pada sesetengah fail ia boleh menghasilkan keputusan yang lebih teruk daripada SBC dengan kadar bit standard 328 kbps.

SBC secara dinamik memperuntukkan bit pengkuantitian kepada jalur frekuensi pada asas rendah ke tinggi. Jika semua kadar bit digunakan untuk frekuensi rendah dan pertengahan, frekuensi tinggi akan "diputuskan" (sebaliknya akan ada senyap).
aptX mengukur jalur frekuensi dengan bilangan bit yang sama sepanjang masa, itulah sebabnya ia mempunyai kadar bit malar: 352 kbps untuk 44.1 kHz, 384 kbps untuk 48 kHz, dan ia tidak boleh "anjakan bit" kepada frekuensi yang paling memerlukannya . Tidak seperti SBC, aptX tidak akan "memotong" frekuensi, tetapi akan menambah hingar kuantisasi padanya, mengurangkan julat dinamik audio, dan kadangkala memperkenalkan ciri berderak. SBC "makan butiran" - membuang kawasan paling senyap.
Secara purata, berbanding dengan SBC 328k, aptX memperkenalkan kurang herotan dalam muzik dengan julat frekuensi yang luas, tetapi dalam muzik dengan julat frekuensi yang sempit dan julat dinamik yang luas, SBC 328k kadangkala menang.

Mari kita pertimbangkan kes khas. Spektrogram rakaman bermain piano:
Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Tenaga utama terletak pada frekuensi dari 0 hingga 4 kHz, dan berterusan sehingga 10 kHz.
Spektrogram fail yang dimampatkan dalam aptX kelihatan seperti ini:
Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Dan inilah rupa SBC 328k.
Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Ia boleh dilihat bahawa SBC 328k secara berkala mematikan sepenuhnya julat di atas 16 kHz, dan menghabiskan semua kadar bit yang tersedia pada julat di bawah nilai ini. Walau bagaimanapun, aptX memperkenalkan lebih banyak herotan ke dalam spektrum frekuensi yang boleh didengari oleh telinga manusia, seperti yang boleh dilihat dalam spektrogram asal yang ditolak daripada spektrogram aptX (semakin cerah, lebih banyak herotan):
Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Walaupun SBC 328k merosakkan isyarat kurang dalam julat dari 0 hingga 10 kHz, dan memotong yang lain:
Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Kadar bit 485k SBC sudah cukup untuk mengekalkan keseluruhan julat frekuensi, tanpa melumpuhkan jalur.
Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

SBC 485k jauh mendahului aptX pada trek ini dalam julat 0-15 kHz, dengan perbezaan yang lebih kecil tetapi masih ketara iaitu 15-22 kHz (lebih gelap semakin kurang herotan):
Kami mengubah suai tindanan Bluetooth untuk menambah baik bunyi pada fon kepala tanpa codec AAC, aptX dan LDAC

Arkib audio asal, SBC dan aptX.

Dengan bertukar kepada SBC kadar bit tinggi, anda akan mendapat audio yang sering mengalahkan aptX pada mana-mana fon kepala. Pada fon kepala yang menyokong sambungan EDR 3 Mbps, kadar bit 551 kbps menghasilkan bunyi yang setanding dengan aptX HD.

Bolehkah anda melakukan lebih banyak lagi?

Patch Android juga termasuk pilihan untuk meningkatkan lagi kadar bit untuk peranti EDR 2 Mbps. Anda boleh meningkatkan kadar bit daripada 452 kbit/s kepada 595 kbit/s, dengan kos mengurangkan kestabilan penghantaran dalam keadaan radio yang sukar.
Ia cukup untuk menetapkan pembolehubah persist.bluetooth.sbc_hd_higher_bitrate kepada 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Tampalan kadar bit yang melampau setakat ini hanya diterima pakai dalam LineageOS 15.1, tetapi tidak dalam 16.0.

Keserasian Peranti

SBC Dual Channel disokong oleh hampir semua fon kepala, pembesar suara dan unit kepala kereta. Ini tidak menghairankan - piawaian memerlukan sokongannya dalam mana-mana peranti penyahkodan. Terdapat sebilangan kecil peranti di mana mod ini menyebabkan masalah, tetapi ini adalah kejadian terpencil.
Butiran lanjut tentang peranti yang serasi boleh didapati di w4bsitXNUMX-dns.com atau XDA-pemaju.

Perbandingan perbezaan bunyi

Saya membuat perkhidmatan web yang mengekod audio kepada SBC (serta aptX dan aptX HD) dalam masa nyata, terus dalam penyemak imbas. Dengan itu, anda boleh membandingkan bunyi profil SBC yang berbeza dan codec lain, tanpa benar-benar menghantar audio melalui Bluetooth, pada mana-mana fon kepala berwayar, pembesar suara dan muzik kegemaran anda, dan juga menukar parameter pengekodan secara langsung semasa memainkan audio.
btcodecs.valdikss.org.ru/sbc-encoder

Hubungi Pembangun Android

Saya menulis kepada banyak pembangun tindanan Bluetooth di Google meminta mereka mempertimbangkan untuk memasukkan patch dalam cawangan Android utama - AOSP, tetapi tidak menerima satu respons. Tampalan saya masuk Sistem tampalan Gerrit untuk Android juga kekal tanpa komen daripada sesiapa yang terlibat.
Saya akan gembira jika saya boleh mendapatkan bantuan untuk berhubung dengan pembangun di Google dan membawa SBC HD ke Android. Tampalan dalam gerrit sudah lapuk (ini adalah salah satu semakan awal), dan saya akan mengemas kininya jika pembangun berminat dengan perubahan saya (tidak mudah untuk saya mengemas kini, saya tidak mempunyai peranti yang serasi dengan Android Q ).

Kesimpulan

Pengguna telefon pintar dengan LineageOS, Resurrection Remix dan perisian tegar crDroid boleh menikmati kualiti bunyi yang lebih baik sekarang, cuma aktifkan pilihan dalam tetapan peranti Bluetooth. Pengguna Linux juga boleh mendapatkan peningkatan kadar bit SBC dengan memasang tampalan dari Pali Rohar, yang, antara lain, menambah sokongan untuk codec aptX, aptX HD dan FastStream.

Sumber: www.habr.com

Tambah komen