Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Bago basahin ang artikulong ito, inirerekomenda na basahin mo ang nakaraang artikulo: Audio sa pamamagitan ng Bluetooth: maximum na mga detalye tungkol sa mga profile, codec at device

Ang ilang mga gumagamit ng wireless headphone ay nag-uulat ng mahinang kalidad ng tunog at kakulangan ng mataas na frequency kapag ginagamit ang karaniwang SBC Bluetooth codec, na sinusuportahan ng lahat ng mga audio device. Ang isang karaniwang rekomendasyon para sa pagpapahusay ng tunog ay ang pagbili ng mga device at headphone na sumusuporta sa mga aptX at LDAC codec. Ang mga codec na ito ay nangangailangan ng mga bayarin sa paglilisensya, kaya ang mga device na sumusuporta sa kanila ay mas mahal.

Lumalabas na ang mababang kalidad ng SBC ay dahil sa mga artipisyal na limitasyon ng Bluetooth stack at mga setting ng headphone, at ang limitasyong ito ay maaaring lampasan sa anumang umiiral na mga device sa pamamagitan ng mga pagbabago sa software sa isang smartphone o computer.

Codec SBC

Ang SBC codec ay may maraming iba't ibang mga parameter na pinag-uusapan sa panahon ng yugto ng pag-setup ng koneksyon. Sa kanila:

  • Bilang at uri ng mga channel: Pinagsanib na Stereo, Stereo, Dual Channel, Mono;
  • Bilang ng mga frequency band: 4 o 8;
  • Bilang ng mga bloke sa pakete: 4, 8, 12, 16;
  • Algorithm para sa pamamahagi ng mga bit sa panahon ng quantization: Loudness, SNR;
  • Ang maximum at minimum na halaga ng pool ng mga bit na ginamit sa quantization (bitpool): karaniwang mula 2 hanggang 53.

Dapat suportahan ng decoding device ang anumang kumbinasyon ng mga parameter na ito. Maaaring hindi ipatupad ng encoder ang lahat.
Ang mga umiiral na Bluetooth stack ay karaniwang sumasang-ayon sa sumusunod na profile: Joint Stereo, 8 bands, 16 blocks, Loudness, bitpool 2..53. Ang profile na ito ay nag-encode ng 44.1 kHz audio sa bitrate na 328 kbps.
Ang parameter ng bitpool ay direktang nakakaapekto sa bitrate sa loob ng isang profile: kung mas mataas ito, mas mataas ang bitrate, at samakatuwid ay ang kalidad.
Gayunpaman, ang parameter ng bitpool ay hindi nakatali sa isang partikular na profile; Ang bitrate ay higit na naiimpluwensyahan ng iba pang mga parameter: uri ng mga channel, bilang ng mga frequency band, bilang ng mga bloke. Maaari mong taasan ang bitrate nang hindi direkta, sa pamamagitan ng pagsang-ayon sa mga hindi karaniwang profile, nang hindi binabago ang bitpool.

Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Formula para sa pagkalkula ng SBC bitrate

Halimbawa, ang Dual Channel mode ay nag-e-encode ng mga channel nang hiwalay, gamit ang buong bitpool para sa bawat channel. Sa pamamagitan ng pagpilit sa device na gumamit ng Dual Channel sa halip na Joint Stereo, halos doble ang bitrate namin na may parehong maximum na halaga ng bitpool: 617 kbps.
Sa palagay ko, ang paggamit ng halaga ng bitpool na hindi nakatali sa isang profile sa yugto ng negosasyon ay isang depekto sa pamantayan ng A2DP, na humantong sa isang artipisyal na limitasyon ng kalidad ng SBC. Mas makatuwirang makipag-ayos sa bitrate kaysa sa bitpool.

Ang mga nakapirming halaga ng Bitpool at Bitrate na ito ay nagmula sa isang talahanayan na may mga inirerekomendang halaga para magamit para sa mataas na kalidad na audio. Ngunit ang isang rekomendasyon ay hindi isang dahilan upang limitahan ang iyong sarili sa mga halagang ito.

Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Ang detalye ng A2DP v1.2, na naging aktibo mula 2007 hanggang 2015, ay nangangailangan ng lahat ng mga decoding device na gumana nang tama sa mga bitrate hanggang 512 kbps:

Dapat suportahan ng decoder ng SNK ang lahat ng posibleng halaga ng bitpool na hindi nagreresulta sa labis sa maximum na bit rate. Nililimitahan ng profile na ito ang available na maximum na bit rate sa 320kb/s para sa mono, at 512kb/s para sa mga two-channel mode.

Sa bagong bersyon ng detalye ay walang limitasyon sa bitrate. Tinatantya na ang mga modernong headphone na inilabas pagkatapos ng 2015 na sumusuporta sa EDR ay maaaring suportahan ang mga bit rate hanggang β‰ˆ730 kbps.

Para sa ilang kadahilanan, ang Linux (PulseAudio), Android, Blackberry at macOS Bluetooth stack na sinubukan ko ay may mga artipisyal na limitasyon sa maximum na halaga ng parameter ng bitpool, na direktang nakakaapekto sa maximum na bitrate. Ngunit hindi ito ang pinakamalaking problema; halos lahat ng mga headphone ay nililimitahan din ang maximum na halaga ng bitpool sa 53.
Gaya ng nakita ko na, karamihan sa mga device ay gumagana nang perpekto sa isang binagong Bluetooth stack na may bitrate na 551 kbps, nang walang mga pagkaantala o kaluskos. Ngunit ang ganitong bitrate ay hindi kailanman magiging pare-pareho sa ilalim ng normal na mga kondisyon, sa mga regular na Bluetooth stack.

Pagbabago sa Bluetooth stack

Ang anumang Bluetooth stack na katugma sa A2DP standard ay may suporta para sa Dual Channel mode, ngunit hindi ito posible na i-activate ito mula sa interface.

Magdagdag tayo ng toggle sa interface! Gumawa ako ng mga patch para sa Android 8.1 at Android 9 na nagdaragdag ng ganap na suporta sa Dual Channel sa stack, nagdaragdag ng mode sa mode na toggle menu sa mga dev tool, at tinatrato ang mga Dual Channel-enabled na SBC na parang isang karagdagang codec tulad ng aptX , AAC, o LDAC ( Android ang tawag sa HD Audio na ito) sa pamamagitan ng pagdaragdag ng checkmark sa mga setting ng Bluetooth device. Ito ang hitsura nito:

Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Patch para sa Android 9
Patch para sa Android 8.1

Kapag na-activate na ang checkbox, magsisimulang ipadala ang Bluetooth audio sa bitrate 551 kbps, kung sinusuportahan ng mga headphone ang bilis ng koneksyon na 3 Mbit/s, o 452 kbps, kung sinusuportahan lamang ng mga headphone ang 2 Mbit/s.

Ang patch na ito ay kasama sa mga sumusunod na alternatibong firmware:

  • LineageOS
  • Pagkabuhay na Remix
  • crDroid

Saan nagmula ang 551 at 452 kbit/s?

Ang Bluetooth air-sharing technology ay idinisenyo upang mahusay na magpadala ng malalaking fixed-size na packet. Ang paglilipat ng data ay nangyayari sa mga slot, ang pinakamalaking bilang ng mga slot na ipinadala sa isang paglipat ay 5. Mayroon ding mga mode ng paglilipat na gumagamit ng 1 o 3 mga puwang, ngunit hindi 2 o 4. Sa 5 mga puwang maaari kang maglipat ng hanggang 679 byte sa bilis ng koneksyon ng 2 Mbit/s at hanggang 1021 bytes sa bilis na 3 Mbit/s, at sa 3 - 367 at 552 bytes, ayon sa pagkakabanggit.

Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Kung gusto naming maglipat ng mas kaunting data kaysa sa 679 o 1021 bytes, ngunit higit sa 367 o 552 byte, aabutin pa rin ng 5 slot ang paglipat at ililipat ang data sa parehong oras, na nagpapababa sa kahusayan ng paglilipat.

Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Ang SBC sa Dual Channel mode, sa 44100 Hz audio na may mga parameter ng Bitpool 38, 16 na bloke bawat frame, 8 frequency range, nag-encode ng audio sa 164 byte na frame, na may bitrate na 452 kbps.
Ang audio ay dapat na naka-encapsulated sa L2CAP at AVDTP transfer protocol, na kumukuha ng 16 byte mula sa audio payload.

Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Kaya, ang isang Bluetooth transmission na may 5 slot ay kayang tumanggap ng 4 na audio frame:

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

Nagkasya kami ng 11.7 ms ng audio data sa packet na ipinapadala, na ipapadala sa 3.75 ms, at mayroon kaming 6 na hindi nagamit na byte na natitira sa packet.
Kung itataas mo ng kaunti ang bitpool, hindi na posibleng mag-pack ng 4 na audio frame sa isang pakete. Kakailanganin mong magpadala ng 3 mga frame sa isang pagkakataon, na nagpapababa ng kahusayan sa paghahatid, binabawasan ang dami ng audio na ipinadala sa bawat frame, at mas mabilis na hahantong sa audio na nauutal sa mahihirap na kondisyon ng radyo.

Sa parehong paraan, napili ang bitrate na 551 kbit/s para sa EDR 3 Mbit/s: na may Bitpool 47, 16 na bloke bawat frame, 8 frequency range, ang laki ng frame ay 200 bytes, na may bitrate na 551 kbit/s. Ang isang pakete ay naglalaman ng 5 frame o 14.6 ms ng musika.

Ang algorithm para sa pagkalkula ng lahat ng mga parameter ng SBC ay medyo kumplikado, madali kang malito kung manu-mano kang magbibilang, kaya gumawa ako ng isang interactive na calculator upang matulungan ang mga interesado: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Bakit kailangan ang lahat ng ito?

Taliwas sa popular na paniniwala tungkol sa kalidad ng tunog ng aptX codec, sa ilang mga file ay maaari itong makagawa ng mga resulta na mas malala kaysa sa SBC na may karaniwang bitrate na 328 kbps.

Ang SBC ay dynamic na naglalaan ng mga quantization bit sa mga frequency band sa mababang-hanggang-mataas na batayan. Kung ang lahat ng bitrate ay ginamit para sa mababa at katamtamang mga frequency, ang matataas na frequency ay "puputol" (magkakaroon ng katahimikan sa halip).
Sinusukat ng aptX ang mga frequency band na may parehong bilang ng mga bit sa lahat ng oras, kaya naman mayroon itong pare-parehong bitrate: 352 kbps para sa 44.1 kHz, 384 kbps para sa 48 kHz, at hindi ito maaaring "bit-shift" sa mga frequency na higit na nangangailangan ng mga ito. . Hindi tulad ng SBC, ang aptX ay hindi "magpuputol" ng mga frequency, ngunit magdaragdag ng ingay ng quantization sa mga ito, na binabawasan ang dynamic na hanay ng audio, at kung minsan ay nagpapakilala ng katangiang pagkaluskos. SBC "kumakain ng mga detalye" - itinatapon ang mga pinakatahimik na lugar.
Sa karaniwan, kumpara sa SBC 328k, ang aptX ay nagpapakilala ng mas kaunting pagbaluktot sa musika na may malawak na hanay ng dalas, ngunit sa musikang may makitid na hanay ng dalas at malawak na hanay ng dinamika, ang SBC 328k minsan ay nananalo.

Isaalang-alang natin ang isang espesyal na kaso. Spectrogram ng isang piano playing recording:
Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Ang pangunahing enerhiya ay nasa mga frequency mula 0 hanggang 4 kHz, at nagpapatuloy hanggang 10 kHz.
Ang spectrogram ng isang file na naka-compress sa aptX ay ganito ang hitsura:
Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

At ito ang hitsura ng SBC 328k.
Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Makikita na pana-panahong ganap na pinatay ng SBC 328k ang hanay na higit sa 16 kHz, at ginugol ang lahat ng available na bitrate sa mga saklaw na mas mababa sa halagang ito. Gayunpaman, ipinakilala ng aptX ang higit pang pagbaluktot sa frequency spectrum na naririnig ng tainga ng tao, gaya ng makikita sa ibinawas na orihinal na spectrogram mula sa aptX spectrogram (mas maliwanag, mas maraming pagbaluktot):
Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Habang ang SBC 328k ay nasira ang signal nang mas kaunti sa saklaw mula 0 hanggang 10 kHz, at pinutol ang natitira:
Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Ang 485k bitrate ng SBC ay sapat na upang mapanatili ang buong saklaw ng dalas, nang hindi pinapagana ang mga banda.
Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Ang SBC 485k ay higit na nauuna sa aptX sa track na ito sa hanay na 0-15 kHz, na may mas maliit ngunit kapansin-pansing pagkakaiba na 15-22 kHz (mas madidilim, mas mababa ang pagbaluktot):
Binabago namin ang Bluetooth stack para mapahusay ang tunog sa mga headphone na walang AAC, aptX at LDAC codec

Archive ng orihinal na audio, SBC at aptX.

Sa pamamagitan ng paglipat sa isang high-bitrate na SBC, makakakuha ka ng audio na kadalasang nakakatalo sa aptX sa anumang headphone. Sa mga headphone na sumusuporta sa 3 Mbps EDR connectivity, ang bitrate na 551 kbps ay gumagawa ng tunog na maihahambing sa aptX HD.

May magagawa ka pa ba?

Kasama rin sa Android patch ang isang opsyon para higit pang taasan ang bitrate para sa 2 Mbps EDR device. Maaari mong taasan ang bitrate mula 452 kbit/s hanggang 595 kbit/s, sa halaga ng pagbabawas ng katatagan ng transmission sa mahihirap na kondisyon ng radyo.
Sapat na upang itakda ang variable na persist.bluetooth.sbc_hd_higher_bitrate sa 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Ang matinding bitrate patch sa ngayon ay pinagtibay lamang sa LineageOS 15.1, ngunit hindi sa 16.0.

Compatibility ng Device

Ang SBC Dual Channel ay sinusuportahan ng halos lahat ng headphones, speakers at car head units. Ito ay hindi nakakagulat - ang pamantayan ay nangangailangan ng suporta nito sa anumang mga decoding device. Mayroong isang maliit na bilang ng mga aparato kung saan ang mode na ito ay nagdudulot ng mga problema, ngunit ang mga ito ay mga hiwalay na pagkakataon.
Higit pang mga detalye tungkol sa mga katugmang device ay matatagpuan sa 4pda o Xda-developer.

Paghahambing ng mga pagkakaiba ng tunog

Gumawa ako ng web service na nag-encode ng audio sa SBC (pati na rin sa aptX at aptX HD) nang real time, sa browser mismo. Sa pamamagitan nito, maaari mong ihambing ang tunog ng iba't ibang mga profile ng SBC at iba pang mga codec, nang hindi aktwal na nagpapadala ng audio sa pamamagitan ng Bluetooth, sa anumang mga wired na headphone, speaker, at iyong paboritong musika, at direktang baguhin ang mga parameter ng pag-encode habang nagpe-play ng audio.
btcodecs.valdikss.org.ru/sbc-encoder

Makipag-ugnayan sa Mga Developer ng Android

Sumulat ako sa maraming Bluetooth stack developer sa Google na humihiling sa kanila na isaalang-alang ang pagsasama ng mga patch sa pangunahing sangay ng Android - AOSP, ngunit hindi nakatanggap ng isang tugon. Ang aking mga patch sa Gerrit patch system para sa Android nanatili rin nang walang komento mula sa sinumang kasangkot.
Magiging masaya ako kung makakakuha ako ng tulong sa pakikipag-ugnayan sa mga developer sa Google at pagdadala ng SBC HD sa Android. Luma na ang patch sa gerrit (isa ito sa mga unang rebisyon), at ia-update ko ito kung interesado ang mga developer sa aking mga pagbabago (hindi madali para sa akin na i-update ito, wala akong mga device na tugma sa Android Q ).

Konklusyon

Mae-enjoy ng mga user ng mga smartphone na may LineageOS, Resurrection Remix at crDroid firmware ang pinahusay na kalidad ng tunog ngayon, i-activate lang ang opsyon sa mga setting ng Bluetooth device. Ang mga gumagamit ng Linux ay maaari ding makakuha ng mas mataas na bitrate ng SBC sa pamamagitan ng pag-install patch mula sa Pali Rohar, na, bukod sa iba pang mga bagay, ay nagdaragdag ng suporta para sa aptX, aptX HD at FastStream codec.

Pinagmulan: www.habr.com

Magdagdag ng komento