Sebelum membaca artikel ini, disarankan untuk membaca yang sebelumnya: Audio melalui Bluetooth: informasi paling rinci tentang profil, codec, dan perangkat /Beberapa pengguna headphone nirkabel mencatat kualitas suara yang rendah dan kurangnya frekuensi tinggi ketika menggunakan codec SBC Bluetooth standar, yang didukung oleh semua headphone dan perangkat audio Bluetooth lainnya. Rekomendasi umum untuk mendapatkan kualitas suara yang lebih baik adalah membeli perangkat dan headphone dengan dukungan codec aptX atau LDAC. Codec ini memerlukan biaya lisensi, itu sebabnya perangkat dengan mereka lebih mahal.
Ternyata rendahnya kualitas SBC disebabkan oleh keterbatasan artifisial dari semua susunan Bluetooth saat ini dan konfigurasi headphone, dan batasan ini dapat dielakkan pada perangkat yang ada dengan hanya modifikasi perangkat lunak.
Sbc codec
SBC memiliki banyak parameter berbeda yang dinegosiasikan selama fase pengaturan koneksi:
- Jenis dan nomor saluran audio: Stereo Bersama, Stereo, Dual Channel, Mono;
- Jumlah pita frekuensi: 4 atau 8;
- Jumlah blok audio dalam satu paket: 4, 8, 12, 16;
- Algoritma alokasi bit kuantisasi: Loudness, SNR;
- Kumpulan bit maksimum dan minimum yang digunakan dalam proses kuantisasi: biasanya 2-53.
Dekoder diperlukan untuk mendukung kombinasi parameter ini. Encoder hanya dapat mengimplementasikan sebagian dari mereka.
Tumpukan Bluetooth yang ada biasanya menegosiasikan set opsi berikut yang saya sebut "profil": Joint Stereo, 8 band, 16 blok, Loudness, bitpool 2..53. Profil ini mengkodekan audio stereo 44,1 kHz dengan bitrate 328 kbps.
Bitpool adalah parameter yang mengubah bitrate encoding: semakin tinggi, semakin tinggi bitrate, dan karenanya kualitasnya. Tetapi nilai bitpool yang tepat hanya sesuai dengan bitrate dalam profil yang tepat.
Bitrate juga dipengaruhi secara signifikan oleh parameter lain: jenis saluran audio, jumlah pita frekuensi, jumlah blok audio. Anda dapat meningkatkan bitrate secara tidak langsung dengan menegosiasikan profil non-standar, tanpa mengubah bitpool.
Rumus perhitungan bitrateMisalnya, mode Dual Channel mengkodekan saluran secara terpisah, menggunakan bitpool individu untuk setiap saluran, tidak seperti Stereo atau Joint Stereo, yang menggunakan bitpool untuk kedua saluran. Memaksa perangkat untuk menggunakan Dual Channel sebagai ganti Joint Stereo akan membuat kita mendapatkan bitrate hampir dua kali lipat 617 kbps, dengan nilai bitpool yang sama yaitu 53.
Bagi saya rasanya bitpool harus menjadi variabel internal. Saya berasumsi bahwa ini adalah kesalahan desain spesifikasi A2DP yang nilai bitpool tidak terikat pada parameter codec lainnya dan hanya didefinisikan sebagai variabel negosiasi independen.
Memperbaiki bitpool dan nilai bitrate yang berasal dari profil yang disarankan untuk audio berkualitas tinggi. Namun rekomendasi tersebut seharusnya tidak menjadi alasan untuk menetapkan batas pada parameter ini.

Spesifikasi A2DP v1.2, yang aktif sejak 2007 hingga 2015, mengharuskan semua decoder bekerja 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 yang dinyatakan dalam versi spesifikasi yang baru. Diasumsikan bahwa headphone modern dengan dukungan EDR yang dirilis setelah 2015 dapat mendukung bitrate hingga 730 kbps.
Untuk beberapa alasan, semua tumpukan Bluetooth saat ini diuji (Linux (PulseAudio), Android, Blackberry dan macOS) memiliki batasan buatan parameter bitpool maksimum, yang secara langsung mempengaruhi bitrate maksimum. Tapi ini bukan masalah terbesar, hampir semua headphone juga membatasi nilai bitpool maksimum menjadi 53.
Seperti yang telah saya lihat dalam pengujian saya, sebagian besar perangkat berfungsi dengan baik pada tumpukan Bluetooth yang dimodifikasi dengan bitrate 551 kbps, tanpa gangguan dan keretakan. Tetapi bitrate semacam itu tidak akan pernah dinegosiasikan dalam kondisi normal, dengan tumpukan Bluetooth stock.
Modifikasi tumpukan Bluetooth
Setiap tumpukan Bluetooth yang kompatibel dengan A2DP harus mendukung mode Dual Channel, tetapi tidak ada cara untuk memaksa penggunaan mode ini.
Mari tambahkan saklar ke antarmuka pengguna! Saya membuat tambalan untuk Android 8.1 dan Android 9, yang menambahkan dukungan penuh untuk Dual Channel ke dalam stack dan ke menu pengembang, dan menangani mode Dual Channel sebagai codec "HD Audio" tambahan seperti aptX, AAC atau LDAC dengan menambahkan tanda centang pada Pengaturan perangkat Bluetooth Begini tampilannya:
Patch Android 9Android 8.1 patchKotak centang ini mengaktifkan mode Dual Channel yang dikonfigurasi untuk menggunakan
551 kbps untuk perangkat EDR 3 Mb / s dan
452 kbps untuk perangkat EDR 2 Mb / s.
Patchset ini telah digabungkan ke dalam firmware alternatif berikut:
- LineageOS 15.1 (sejak 31 Maret, 2019) dan 16.0 (sejak 13 Mei 2019)
- Remix Kebangkitan (sejak 14 Mei 2019)
- crDroid (sejak 13 Mei 2019)
Dari mana datangnya 551 dan 452 kbps?
Teknologi pembagian waktu Bluetooth dirancang untuk secara efisien mentransmisikan paket berukuran besar. Transfer data terjadi dalam slot, jumlah slot terbesar yang dikirim dalam satu transmisi adalah 5. Ada juga mode transfer menggunakan 1 atau 3 slot, tetapi bukan 2 atau 4. Anda dapat mentransfer hingga 679 byte dalam 5 slot, pada kecepatan koneksi 2 Mbps, dan hingga 1021 byte pada kecepatan 3 Mbps. Dalam 3 slot, jumlah maksimum data masing-masing adalah 367 dan 552 byte.

Jika kita ingin mentransfer lebih sedikit data dari 679 atau 1021 byte tetapi lebih dari 367 atau 552 byte, transfer masih akan memakan waktu 5 slot, dan transmisi akan mengambil jumlah waktu yang sama, yang mengurangi efisiensi transmisi.

Audio 44100 Hz yang dikodekan menggunakan SBC dalam mode Dual Channel dengan bitpool = 38, 16 blok dalam bingkai, 8 pita frekuensi, menghasilkan bingkai audio 164 byte, dengan bitrate 452 kb / s.
Payload audio harus dienkapsulasi ke dalam protokol transmisi L2CAP dan AVDTP, yang mengurangi 16 byte overhead dari payload 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 *}
Satu transmisi audio 5-slot dapat memuat hingga 4 frame audio:
679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (SBC header) - (164*4) = 6
Sebuah paket tunggal mentransmisikan hingga 11,7 ms data audio, yang akan ditransmisikan dalam 3,75 ms, dan kami memiliki 6 byte yang tidak terpakai tersisa dalam paket.
Jika Anda sedikit meningkatkan bitpool, 4 frame audio tidak lagi dapat dimasukkan ke dalam satu transmisi. Anda harus mengirim 3 frame sekaligus, yang mengurangi efisiensi transmisi, mengurangi jumlah audio yang ditransmisikan dalam satu paket, dan akan meningkatkan peluang gagap audio dalam kondisi radio yang buruk.
Bitrate 551 kbps untuk EDR 3 Mbps dipilih menggunakan prinsip yang sama: dengan Bitpool 47, 16 blok per frame, 8 band frekuensi, ukuran frame adalah 200 byte, dengan bit rate 551 kbps. Transmisi tunggal dapat mengikat hingga 5 frame atau 14,6 ms musik.
Algoritma untuk menghitung semua parameter SBC cukup rumit, Anda dapat dengan mudah membuat kesalahan jika Anda mencoba menghitung semuanya secara manual, jadi saya membuat kalkulator interaktif untuk membantu mereka yang tertarik:
btcodecs.valdikss.org.ru/sbc-bitrate-calculatorUntuk apa semua itu?
Berlawanan dengan kepercayaan umum kualitas suara aptX, dalam beberapa kasus dapat menghasilkan kualitas audio yang lebih buruk daripada SBC dengan bitrate 328k standar.
SBC secara dinamis mengalokasikan bit kuantisasi untuk pita frekuensi, bertindak berdasarkan "bottom-to-top". Jika seluruh bitrate digunakan untuk frekuensi bawah dan menengah, frekuensi atas adalah "terputus" (dibungkam).
aptX menghitung pita frekuensi dengan jumlah bit yang sama secara konstan, yang membuatnya menjadi codec bitrate konstan: 352 kbps untuk 44,1 kHz, 384 kbps untuk 48 kHz. Itu tidak bisa "mentransfer bit" ke frekuensi yang paling membutuhkannya. Tidak seperti SBC, aptX tidak akan "memotong" frekuensi, tetapi akan menambah derau kuantisasi pada mereka, mengurangi rentang dinamis audio, dan kadang-kadang menyebabkan suara berderak. SBC, sebaliknya, "makan detail" - membuang daerah paling sunyi.
Rata-rata, dibandingkan dengan SBC 328k, aptX membuat lebih sedikit distorsi dalam musik dengan rentang frekuensi yang luas, tetapi pada musik dengan rentang frekuensi yang sempit dan rentang dinamis yang luas, SBC 328k terkadang menang.
Mari kita perhatikan kasus khusus, rekaman piano. Inilah spektogram:

Sebagian besar energi ditempatkan pada frekuensi 0-4 kHz, dan berlangsung hingga 10 kHz.
Spectrogram dari file aptX terlihat seperti ini:

Inilah SBC 328k:

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

SBC 328k telah menyebabkan lebih sedikit distorsi pada sinyal dalam rentang dari 0 hingga 10 kHz, dan frekuensi sisanya telah terpotong:

Bitrate 485k cukup untuk SBC untuk menyimpan seluruh rentang frekuensi, tanpa memotong band.

SBC 485k menghasilkan hasil yang jauh lebih baik dalam kisaran 0-15 kHz pada sampel ini daripada aptX, dan perbedaan yang lebih kecil namun masih terlihat pada 15-22 kHz (semakin gelap, semakin sedikit distorsi):
Arsipkan dengan audio asli dan file yang disandikan SBC / aptX .
Dengan beralih ke SBC bitrate tinggi Anda akan mendapatkan suara yang lebih unggul daripada aptX sebagian besar waktu, pada headphone apa pun. Pada headphone dengan dukungan EDR 3 Mb / s, SBC 551 kb / s menghasilkan suara yang sangat dekat dengan aptX HD.
Bisakah kita melangkah lebih jauh?
Android patchset memiliki opsi tambahan untuk meningkatkan bitrate untuk perangkat EDR 2 mbps lebih jauh. Anda dapat meningkatkan bitrate dari 452 kbps menjadi 595 kbps, dengan biaya mengurangi stabilitas transmisi jika terjadi kondisi radio yang padat.
Cukup atur variabel persist.bluetooth.sbc_hd_higher_bitrate menjadi 1:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1
Patch laju bit ekstrim saat ini digabungkan hanya di LineageOS 15.1, tetapi tidak di 16.0.
Kompatibilitas dengan perangkat
SBC Dual Channel didukung oleh hampir semua headphone, speaker, dan unit kepala mobil. Ini tidak mengherankan - standar mengamanatkan dukungannya dalam perangkat decoding apa pun. Ada sejumlah kecil perangkat yang mode ini menyebabkan masalah, tetapi ini adalah kasus yang sangat jarang.
Rincian lebih lanjut tentang perangkat yang kompatibel dapat ditemukan di
w3bsit3-dns.com dan
xda-developer .
Perbandingan perbedaan suara
Saya membuat layanan web yang mengkodekan audio ke SBC (serta ke aptX dan aptX HD) secara real time, tepat di browser. Anda dapat membandingkan suara berbagai profil SBC dan codec lainnya tanpa benar-benar mentransmisikan audio melalui Bluetooth menggunakan layanan ini, pada headphone kabel apa pun, speaker, dan pada musik favorit Anda. Anda juga dapat mengubah parameter enkode secara langsung selama pemutaran audio.
btcodecs.valdikss.org.ru/sbc-encoderMenghubungi pengembang Android
Saya mencoba menghubungi banyak pengembang tumpukan Bluetooth dari Google, meminta mereka untuk mempertimbangkan untuk memasukkan tambalan saya ke cabang Android utama - AOSP, tetapi tidak menerima satu jawaban pun. Tambalan saya dalam
sistem ulasan kode Gerrit untuk Android belum menerima komentar dari siapa pun yang terlibat dalam pengembangan juga.
Saya akan senang jika ada yang bisa memberi tahu pengembang Google tentang penerapan SBC HD untuk Android ini. Gerrit patchset sudah kedaluwarsa (ini adalah salah satu revisi paling awal), tetapi 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 LineageOS, Resurrection Remix dan crDroid Firmwares dapat meningkatkan kualitas audio Bluetooth dengan mencentang kotak centang di pengaturan perangkat Bluetooth. Pengguna Linux juga bisa mendapatkan bitrate SBC yang lebih tinggi dengan menginstal
patch dari Pali RohΓ‘r , yang antara lain, menambahkan dukungan untuk codec aptX, aptX HD dan FastStream.