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

Sebelum membaca artikel ini, disarankan agar Anda membaca artikel sebelumnya: Audio melalui Bluetooth: detail maksimal tentang profil, codec, dan perangkat

Beberapa pengguna headphone nirkabel melaporkan kualitas suara yang buruk dan kurangnya frekuensi tinggi saat menggunakan codec Bluetooth SBC standar, yang didukung oleh semua perangkat audio. Rekomendasi umum untuk meningkatkan suara adalah dengan membeli perangkat dan headphone yang mendukung codec aptX dan LDAC. Codec ini memerlukan biaya lisensi, sehingga perangkat yang mendukungnya lebih mahal.

Ternyata rendahnya kualitas SBC disebabkan oleh batasan buatan pada tumpukan Bluetooth dan pengaturan headphone, dan batasan ini dapat dilewati pada perangkat apa pun yang ada melalui perubahan perangkat lunak pada ponsel cerdas atau komputer.

Kodek SBC

Codec SBC memiliki banyak parameter berbeda yang dinegosiasikan selama fase pengaturan koneksi. Diantara mereka:

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

Perangkat decoding harus mendukung kombinasi parameter ini. Pembuat enkode mungkin tidak mengimplementasikan semuanya.
Tumpukan Bluetooth yang ada biasanya menyetujui profil berikut: Joint Stereo, 8 band, 16 blok, Loudness, bitpool 2..53. Profil ini mengkodekan audio 44.1 kHz pada bitrate 328 kbps.
Parameter bitpool secara langsung mempengaruhi bitrate dalam satu profil: semakin tinggi, semakin tinggi bitrate, dan karenanya kualitasnya.
Namun, parameter bitpool tidak terikat pada profil tertentu; Kecepatan bit juga sangat dipengaruhi oleh parameter lain: jenis saluran, jumlah pita frekuensi, jumlah blok. Anda dapat meningkatkan bitrate secara tidak langsung, dengan menyetujui profil non-standar, tanpa mengubah bitpool.

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

Rumus untuk menghitung bitrate SBC

Misalnya, mode Saluran Ganda mengkodekan saluran secara terpisah, menggunakan seluruh bitpool untuk setiap saluran. Dengan memaksa perangkat menggunakan Dual Channel alih-alih Joint Stereo, kami mendapatkan bitrate hampir dua kali lipat dengan nilai bitpool maksimum yang sama: 617 kbps.
Menurut pendapat saya, penggunaan nilai bitpool yang tidak terikat dengan profil pada tahap negosiasi adalah kelemahan dalam standar A2DP, yang menyebabkan pembatasan kualitas SBC secara artifisial. Akan lebih masuk akal untuk menegosiasikan bitrate daripada bitpool.

Nilai Bitpool dan Bitrate tetap ini berasal dari tabel dengan nilai yang direkomendasikan untuk digunakan pada audio berkualitas tinggi. Namun rekomendasi bukanlah alasan untuk membatasi diri pada nilai-nilai tersebut.

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

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

Dekoder SNK harus mendukung semua kemungkinan nilai bitpool yang tidak melebihi kecepatan bit maksimum. Profil ini membatasi kecepatan bit maksimum yang tersedia hingga 320kb/s untuk mode mono, dan 512kb/s untuk mode dua saluran.

Pada spesifikasi versi baru tidak ada batasan bitrate. Diperkirakan headphone modern yang dirilis setelah tahun 2015 yang mendukung EDR dapat mendukung bit rate hingga ≈730 kbps.

Untuk beberapa alasan, tumpukan Bluetooth Linux (PulseAudio), Android, Blackberry, dan macOS yang saya uji memiliki batasan buatan pada nilai maksimum parameter bitpool, yang secara langsung memengaruhi bitrate maksimum. Tapi ini bukan masalah terbesar; hampir semua headphone juga membatasi nilai bitpool maksimum hingga 53.
Seperti yang telah saya lihat, sebagian besar perangkat bekerja dengan sempurna pada tumpukan Bluetooth yang dimodifikasi dengan bitrate 551 kbps, tanpa gangguan atau gangguan. Namun bitrate seperti itu tidak akan pernah konsisten dalam kondisi normal, pada tumpukan Bluetooth biasa.

Memodifikasi tumpukan Bluetooth

Tumpukan Bluetooth apa pun yang kompatibel dengan standar A2DP memiliki dukungan untuk mode Saluran Ganda, tetapi tidak mungkin untuk mengaktifkannya dari antarmuka.

Mari tambahkan tombol alih ke antarmuka! Saya telah membuat tambalan untuk Android 8.1 dan Android 9 yang menambahkan dukungan penuh Saluran Ganda ke tumpukan, menambahkan mode ke menu pengalih mode di alat pengembang, dan memperlakukan SBC yang mendukung Saluran Ganda seolah-olah itu adalah codec tambahan seperti aptX , AAC, atau LDAC (Android menyebutnya Audio HD) dengan menambahkan tanda centang ke pengaturan perangkat Bluetooth. Ini adalah tampilannya:

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

Tambalan untuk Android 9
Tambalan untuk Android 8.1

Saat kotak centang diaktifkan, audio Bluetooth mulai dikirim dengan kecepatan bit 551 kbps, jika headphone mendukung kecepatan koneksi 3 Mbit/s, atau 452 kbps, jika headphone hanya mendukung 2 Mbit/s.

Patch ini disertakan dalam firmware alternatif berikut:

  • LineageOS
  • Remix Kebangkitan
  • crDroid

Dari mana asal 551 dan 452 kbit/s?

Teknologi berbagi udara Bluetooth dirancang untuk mengirimkan paket berukuran besar secara efisien. Transfer data terjadi di slot, jumlah slot terbesar yang dikirim dalam satu transfer adalah 5. Ada juga mode transfer yang menggunakan 1 atau 3 slot, tetapi tidak 2 atau 4. Dalam 5 slot Anda dapat mentransfer hingga 679 byte dengan kecepatan koneksi dari 2 Mbit/s dan hingga 1021 byte pada kecepatan 3 Mbit/s, dan pada 3 - 367 dan 552 byte, masing-masing.

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

Jika kita ingin mentransfer data kurang dari 679 atau 1021 byte, tetapi lebih dari 367 atau 552 byte, transfer akan tetap memakan 5 slot dan data akan ditransfer dalam waktu yang bersamaan, sehingga mengurangi efisiensi transfer.

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

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

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

Jadi, satu transmisi Bluetooth dengan 5 slot dapat menampung 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 yang dikirim, yang akan ditransmisikan dalam 3.75 ms, dan kami memiliki sisa 6 byte yang tidak terpakai dalam paket.
Jika Anda menaikkan bitpool sedikit, tidak mungkin lagi mengemas 4 frame audio ke dalam satu paket. Anda harus mengirim 3 frame sekaligus, sehingga mengurangi efisiensi transmisi, mengurangi jumlah audio yang ditransmisikan per frame, dan akan lebih cepat menyebabkan audio tersendat dalam kondisi radio yang buruk.

Dengan cara yang sama, bitrate 551 kbit/s dipilih untuk EDR 3 Mbit/s: dengan Bitpool 47, 16 blok per frame, 8 rentang frekuensi, ukuran frame 200 byte, dengan bitrate 551 kbit/s. Satu paket berisi 5 frame atau 14.6 ms musik.

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

Mengapa semua ini diperlukan?

Bertentangan dengan kepercayaan populer tentang kualitas suara codec aptX, pada beberapa file dapat memberikan hasil yang lebih buruk daripada SBC dengan bitrate standar 328 kbps.

SBC secara dinamis mengalokasikan bit kuantisasi ke pita frekuensi dari rendah ke tinggi. Jika semua bitrate digunakan untuk frekuensi rendah dan menengah, frekuensi tinggi akan “terputus” (sebagai gantinya akan ada keheningan).
aptX mengkuantisasi pita frekuensi dengan jumlah bit yang sama sepanjang waktu, itulah sebabnya ia memiliki bitrate yang konstan: 352 kbps untuk 44.1 kHz, 384 kbps untuk 48 kHz, dan tidak dapat “menggeser bit” ke frekuensi yang paling membutuhkannya . Tidak seperti SBC, aptX tidak akan "memotong" frekuensi, tetapi akan menambahkan noise kuantisasi ke frekuensi tersebut, mengurangi rentang dinamis audio, dan terkadang menimbulkan suara berderak yang khas. SBC “memakan detail” - membuang area yang paling sepi.
Rata-rata, dibandingkan dengan SBC 328k, aptX menimbulkan lebih sedikit distorsi pada musik dengan rentang frekuensi lebar, tetapi pada musik dengan rentang frekuensi sempit dan rentang dinamis lebar, SBC 328k terkadang menang.

Mari kita pertimbangkan kasus khusus. Spektogram rekaman permainan piano:
Kami memodifikasi tumpukan Bluetooth untuk meningkatkan suara pada headphone tanpa codec AAC, aptX, dan LDAC

Energi utama terletak pada frekuensi dari 0 hingga 4 kHz, dan berlanjut hingga 10 kHz.
Spektogram file yang dikompresi dalam aptX terlihat seperti ini:
Kami memodifikasi tumpukan Bluetooth untuk meningkatkan suara pada headphone tanpa codec AAC, aptX, dan LDAC

Dan seperti inilah tampilan SBC 328k.
Kami memodifikasi tumpukan Bluetooth untuk meningkatkan suara pada headphone tanpa codec AAC, aptX, dan LDAC

Dapat dilihat bahwa SBC 328k secara berkala mematikan rentang di atas 16 kHz, dan menghabiskan semua bitrate yang tersedia pada rentang di bawah nilai ini. Namun, aptX menimbulkan lebih banyak distorsi ke dalam spektrum frekuensi yang dapat didengar oleh telinga manusia, seperti yang dapat dilihat pada spektogram asli yang dikurangi dari spektogram aptX (semakin terang, semakin banyak distorsi):
Kami memodifikasi tumpukan Bluetooth untuk meningkatkan suara pada headphone tanpa codec AAC, aptX, dan LDAC

Sedangkan SBC 328k kurang merusak sinyal dalam kisaran 0 hingga 10 kHz, dan memutus sisanya:
Kami memodifikasi tumpukan Bluetooth untuk meningkatkan suara pada headphone tanpa codec AAC, aptX, dan LDAC

Bitrate SBC 485k sudah cukup untuk mempertahankan seluruh rentang frekuensi, tanpa menonaktifkan pita.
Kami memodifikasi tumpukan Bluetooth untuk meningkatkan suara pada headphone tanpa codec AAC, aptX, dan LDAC

SBC 485k secara signifikan mengungguli aptX di trek ini dalam rentang 0-15 kHz, dengan perbedaan yang lebih kecil namun tetap mencolok yaitu 15-22 kHz (semakin gelap semakin sedikit distorsi):
Kami memodifikasi tumpukan Bluetooth untuk meningkatkan suara pada headphone tanpa codec AAC, aptX, dan LDAC

Arsip audio asli, SBC dan aptX.

Dengan beralih ke SBC dengan kecepatan bit tinggi, Anda akan mendapatkan audio yang sering kali mengalahkan aptX di headphone apa pun. Pada headphone yang mendukung konektivitas EDR 3 Mbps, bitrate 551 kbps menghasilkan suara sebanding dengan aptX HD.

Bisakah Anda berbuat lebih banyak lagi?

Patch Android juga menyertakan opsi untuk lebih meningkatkan bitrate untuk perangkat EDR 2 Mbps. Anda dapat meningkatkan bitrate dari 452 kbit/s menjadi 595 kbit/s, dengan mengorbankan stabilitas transmisi dalam kondisi radio yang sulit.
Cukup dengan menyetel variabel persist.bluetooth.sbc_hd_higher_bitrate ke 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

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

Kompatibilitas Perangkat

SBC Dual Channel didukung oleh hampir semua headphone, speaker, dan head unit mobil. Hal ini tidak mengherankan - standar ini memerlukan dukungannya di perangkat decoding apa pun. Ada sejumlah kecil perangkat yang mode ini menyebabkan masalah, namun ini adalah contoh yang terisolasi.
Detail lebih lanjut tentang perangkat yang kompatibel dapat ditemukan di W4bsitXNUMX-dns.com или xda-developer.

Perbandingan perbedaan suara

Saya membuat layanan web yang mengkodekan audio ke SBC (serta aptX dan aptX HD) secara real time, langsung di browser. Dengannya, Anda dapat membandingkan suara berbagai profil SBC dan codec lainnya, tanpa benar-benar mengirimkan audio melalui Bluetooth, pada headphone berkabel, speaker, dan musik favorit Anda, dan juga mengubah parameter pengkodean secara langsung saat memutar audio.
btcodecs.valdikss.org.ru/sbc-encoder

Hubungi Pengembang Android

Saya menulis kepada banyak pengembang tumpukan Bluetooth di Google meminta mereka untuk mempertimbangkan penyertaan tambalan di cabang utama Android - AOSP, tetapi tidak menerima satu tanggapan pun. Tambalan saya masuk Sistem patch Gerrit untuk Android juga tetap tanpa komentar dari siapa pun yang terlibat.
Saya akan senang jika bisa mendapatkan bantuan untuk menghubungi para pengembang di Google dan menghadirkan SBC HD ke Android. Patch di gerrit sudah usang (ini adalah salah satu revisi awal), dan saya akan memperbaruinya jika pengembang tertarik dengan perubahan saya (tidak mudah bagi saya untuk memperbaruinya, saya tidak memiliki perangkat yang kompatibel dengan Android Q ).

Kesimpulan

Pengguna ponsel cerdas dengan firmware LineageOS, Resurrection Remix, dan crDroid dapat menikmati peningkatan kualitas suara sekarang, cukup aktifkan opsi di pengaturan perangkat Bluetooth. Pengguna Linux juga bisa mendapatkan peningkatan bitrate SBC dengan menginstal tambalan dari Pali Rohar, yang antara lain menambahkan dukungan untuk codec aptX, aptX HD, dan FastStream.

Sumber: www.habr.com

Tambah komentar