เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

ก่อนที่จะอ่านบทความนี้ ขอแนะนำให้คุณอ่านบทความก่อนหน้านี้: เสียงผ่าน Bluetooth: รายละเอียดสูงสุดเกี่ยวกับโปรไฟล์ ตัวแปลงสัญญาณ และอุปกรณ์

ผู้ใช้หูฟังไร้สายบางรายรายงานว่าคุณภาพเสียงไม่ดีและไม่มีความถี่สูงเมื่อใช้ตัวแปลงสัญญาณบลูทูธ SBC มาตรฐาน ซึ่งได้รับการสนับสนุนโดยอุปกรณ์เสียงทั้งหมด คำแนะนำทั่วไปในการปรับปรุงเสียงคือการซื้ออุปกรณ์และหูฟังที่รองรับตัวแปลงสัญญาณ aptX และ LDAC ตัวแปลงสัญญาณเหล่านี้ต้องเสียค่าธรรมเนียมใบอนุญาต ดังนั้นอุปกรณ์ที่รองรับจึงมีราคาแพงกว่า

ปรากฎว่าคุณภาพต่ำของ SBC เกิดจากข้อจำกัดเทียมของสแต็ค Bluetooth และการตั้งค่าหูฟัง และข้อจำกัดนี้สามารถข้ามได้บนอุปกรณ์ที่มีอยู่ผ่านการเปลี่ยนแปลงซอฟต์แวร์ในสมาร์ทโฟนหรือคอมพิวเตอร์

โคเดก SBC

ตัวแปลงสัญญาณ SBC มีพารามิเตอร์ต่างๆ มากมายที่ได้รับการเจรจาระหว่างขั้นตอนการตั้งค่าการเชื่อมต่อ ในหมู่พวกเขา:

  • จำนวนและประเภทช่อง: สเตอริโอร่วม, สเตอริโอ, Dual Channel, โมโน;
  • จำนวนคลื่นความถี่: 4 หรือ 8;
  • จำนวนบล็อกในแพ็คเกจ: 4, 8, 12, 16;
  • อัลกอริทึมสำหรับการกระจายบิตระหว่างการหาปริมาณ: ความดัง, SNR;
  • ค่าสูงสุดและต่ำสุดของกลุ่มบิตที่ใช้ในระหว่างการหาปริมาณ (bitpool): โดยปกติจะอยู่ระหว่าง 2 ถึง 53

อุปกรณ์ถอดรหัสต้องรองรับพารามิเตอร์เหล่านี้รวมกัน ตัวเข้ารหัสอาจใช้ไม่ได้ทุกอย่าง
โดยทั่วไปสแต็ก Bluetooth ที่มีอยู่จะเห็นด้วยกับโปรไฟล์ต่อไปนี้: Joint Stereo, 8 แบนด์, 16 บล็อก, ความดัง, bitpool 2..53 โปรไฟล์นี้เข้ารหัสเสียง 44.1 kHz ที่บิตเรต 328 kbps
พารามิเตอร์ bitpool ส่งผลโดยตรงต่อบิตเรตภายในโปรไฟล์เดียว: ยิ่งสูง บิตเรตก็จะยิ่งสูงขึ้น และคุณภาพก็เช่นกัน
อย่างไรก็ตาม พารามิเตอร์ bitpool ไม่ได้เชื่อมโยงกับโปรไฟล์เฉพาะ บิตเรตยังได้รับอิทธิพลส่วนใหญ่จากพารามิเตอร์อื่นๆ เช่น ประเภทของช่องสัญญาณ จำนวนย่านความถี่ จำนวนบล็อก คุณสามารถเพิ่มบิตเรตทางอ้อมได้โดยยอมรับโปรไฟล์ที่ไม่ได้มาตรฐาน โดยไม่ต้องเปลี่ยนบิตพูล

เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

สูตรคำนวณบิตเรต SBC

ตัวอย่างเช่น โหมด Dual Channel เข้ารหัสช่องแยกกัน โดยใช้บิตพูลทั้งหมดสำหรับแต่ละช่อง ด้วยการบังคับให้อุปกรณ์ใช้ Dual Channel แทน Joint Stereo เราจะได้บิตเรตเกือบสองเท่าโดยมีค่าบิตพูลสูงสุดเท่ากัน: 617 kbps
ในความคิดของฉัน การใช้ค่า bitpool ที่ไม่เชื่อมโยงกับโปรไฟล์ในขั้นตอนการเจรจาถือเป็นข้อบกพร่องในมาตรฐาน A2DP ซึ่งนำไปสู่ข้อจำกัดเทียมของคุณภาพ SBC มันจะสมเหตุสมผลมากกว่าที่จะเจรจาต่อรองบิตเรตมากกว่าบิตพูล

ค่า Bitpool และ Bitrate คงที่เหล่านี้มาจากตารางที่มีค่าที่แนะนำสำหรับใช้กับเสียงคุณภาพสูง แต่คำแนะนำไม่ใช่เหตุผลที่จะจำกัดตัวเองอยู่แค่ค่านิยมเหล่านี้

เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

ข้อกำหนด A2DP v1.2 ซึ่งเปิดใช้งานตั้งแต่ปี 2007 ถึง 2015 กำหนดให้อุปกรณ์ถอดรหัสทั้งหมดทำงานอย่างถูกต้องด้วยบิตเรตสูงสุด 512 kbps:

ตัวถอดรหัสของ SNK จะต้องรองรับค่าบิตพูลที่เป็นไปได้ทั้งหมดซึ่งไม่ส่งผลให้เกินอัตราบิตสูงสุด โปรไฟล์นี้จำกัดอัตราบิตสูงสุดที่มีอยู่ไว้ที่ 320kb/s สำหรับโมโน และ 512kb/s สำหรับโหมดสองแชนเนล

ในข้อกำหนดเวอร์ชันใหม่ ไม่มีการจำกัดบิตเรต เป็นที่คาดกันว่าหูฟังสมัยใหม่ที่ออกหลังปี 2015 ที่รองรับ EDR สามารถรองรับอัตราบิตสูงถึง 730 kbps

ด้วยเหตุผลบางประการ สแต็คบลูทูธของ Linux (PulseAudio), Android, Blackberry และ macOS ที่ฉันทดสอบมีขีดจำกัดปลอมเกี่ยวกับค่าสูงสุดของพารามิเตอร์ bitpool ซึ่งส่งผลโดยตรงต่อบิตเรตสูงสุด แต่นี่ไม่ใช่ปัญหาที่ใหญ่ที่สุด หูฟังเกือบทั้งหมดยังจำกัดค่าบิตพูลสูงสุดไว้ที่ 53
อย่างที่ฉันเคยเห็นไปแล้ว อุปกรณ์ส่วนใหญ่ทำงานได้อย่างสมบูรณ์แบบบนสแต็ก Bluetooth ที่ได้รับการแก้ไขด้วยบิตเรต 551 kbps โดยไม่มีการหยุดชะงักหรือเสียงแตก แต่บิตเรตดังกล่าวจะไม่สอดคล้องกันภายใต้สภาวะปกติบนสแต็ค Bluetooth ทั่วไป

การปรับเปลี่ยนสแต็ค Bluetooth

Bluetooth Stack ใดๆ ที่เข้ากันได้กับมาตรฐาน A2DP นั้นรองรับโหมด Dual Channel แต่ไม่สามารถเปิดใช้งานได้จากอินเทอร์เฟซ

มาเพิ่มการสลับไปยังอินเทอร์เฟซกันเถอะ! ฉันได้สร้างแพตช์สำหรับ Android 8.1 และ Android 9 ที่เพิ่มการรองรับ Dual Channel เต็มรูปแบบให้กับสแต็ก เพิ่มโหมดให้กับเมนูสลับโหมดในเครื่องมือ dev และปฏิบัติต่อ SBC ที่เปิดใช้งาน Dual Channel ราวกับว่ามันเป็นตัวแปลงสัญญาณเพิ่มเติม เช่น aptX , AAC หรือ LDAC (Android เรียกสิ่งนี้ว่า HD Audio) โดยการเพิ่มเครื่องหมายถูกในการตั้งค่าอุปกรณ์ Bluetooth นี่คือสิ่งที่ดูเหมือน:

เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

แพทช์สำหรับ Android 9
แพทช์สำหรับ Android 8.1

เมื่อเปิดใช้งานช่องทำเครื่องหมาย เสียง Bluetooth จะเริ่มส่งสัญญาณที่บิตเรต 551 กิโลบิตต่อวินาทีหากหูฟังรองรับความเร็วการเชื่อมต่อ 3 Mbit/s หรือ 452 กิโลบิตต่อวินาทีหากหูฟังรองรับเพียง 2 Mbit/s

โปรแกรมปรับปรุงนี้รวมอยู่ในเฟิร์มแวร์ทางเลือกต่อไปนี้:

  • LineageOS
  • รีมิกซ์การคืนชีพ
  • CrDroid

551 และ 452 kbit/s มาจากไหน

เทคโนโลยีการแบ่งปันอากาศ Bluetooth ได้รับการออกแบบมาเพื่อส่งแพ็กเก็ตขนาดคงที่ขนาดใหญ่ได้อย่างมีประสิทธิภาพ การถ่ายโอนข้อมูลเกิดขึ้นในสล็อต จำนวนสล็อตที่ใหญ่ที่สุดที่ส่งในการถ่ายโอนหนึ่งครั้งคือ 5 นอกจากนี้ยังมีโหมดการถ่ายโอนที่ใช้ 1 หรือ 3 สล็อต แต่ไม่ใช่ 2 หรือ 4 ใน 5 สล็อต คุณสามารถถ่ายโอนได้สูงสุด 679 ไบต์ที่ความเร็วการเชื่อมต่อ 2 Mbit/s และสูงสุด 1021 ไบต์ที่ความเร็ว 3 Mbit/s และที่ 3 - 367 และ 552 ไบต์ ตามลำดับ

เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

หากเราต้องการถ่ายโอนข้อมูลน้อยกว่า 679 หรือ 1021 ไบต์ แต่มากกว่า 367 หรือ 552 ไบต์ การถ่ายโอนจะยังคงใช้เวลา 5 ช่อง และข้อมูลจะถูกถ่ายโอนในเวลาเดียวกันซึ่งจะทำให้ประสิทธิภาพการถ่ายโอนลดลง

เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

SBC ในโหมด Dual Channel ที่เสียง 44100 Hz พร้อมพารามิเตอร์ Bitpool 38, 16 บล็อกต่อเฟรม, 8 ช่วงความถี่, เข้ารหัสเสียงเป็นเฟรม 164 ไบต์ ด้วยบิตเรต 452 kbps
เสียงจะต้องถูกห่อหุ้มไว้ในโปรโตคอลการถ่ายโอน L2CAP และ AVDTP ซึ่งใช้พื้นที่ 16 ไบต์จากเพย์โหลดเสียง

เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

ดังนั้น การส่งผ่าน Bluetooth หนึ่งช่องที่มี 5 ช่องจึงสามารถรองรับเฟรมเสียงได้ 4 เฟรม:

679 (EDR 2 mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (заголовок SBC) - (164*4) = 6

เราใส่ข้อมูลเสียงขนาด 11.7 มิลลิวินาทีลงในแพ็กเก็ตที่กำลังส่ง ซึ่งจะถูกส่งใน 3.75 มิลลิวินาที และเรามีไบต์ที่ไม่ได้ใช้เหลืออยู่ในแพ็กเก็ต 6 ไบต์
หากคุณเพิ่มบิตพูลเล็กน้อย จะไม่สามารถบรรจุเฟรมเสียง 4 เฟรมเป็นแพ็คเกจเดียวได้อีกต่อไป คุณจะต้องส่งครั้งละ 3 เฟรม ซึ่งจะลดประสิทธิภาพในการรับส่งข้อมูล ลดปริมาณเสียงที่ส่งต่อเฟรม และจะทำให้เสียงติดขัดได้เร็วขึ้นในสภาพวิทยุที่ไม่ดี

ในทำนองเดียวกัน บิตเรต 551 kbit/s ถูกเลือกสำหรับ EDR 3 Mbit/s: ด้วย Bitpool 47, 16 บล็อกต่อเฟรม, 8 ช่วงความถี่, ขนาดเฟรมคือ 200 ไบต์ ด้วยบิตเรต 551 kbit/s หนึ่งแพ็คเกจประกอบด้วยเพลง 5 เฟรมหรือ 14.6 มิลลิวินาที

อัลกอริธึมสำหรับการคำนวณพารามิเตอร์ SBC ทั้งหมดค่อนข้างซับซ้อน คุณอาจสับสนได้ง่ายหากคุณนับด้วยตนเอง ดังนั้นฉันจึงสร้างเครื่องคิดเลขแบบโต้ตอบเพื่อช่วยผู้ที่สนใจ: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

ทำไมทั้งหมดนี้ถึงจำเป็น?

ตรงกันข้ามกับความเชื่อที่นิยมเกี่ยวกับคุณภาพเสียงของตัวแปลงสัญญาณ aptX ในบางไฟล์ ตัวแปลงสัญญาณนี้อาจให้ผลลัพธ์ที่แย่กว่า SBC ด้วยบิตเรตมาตรฐานที่ 328 kbps

SBC จัดสรรบิตเชิงปริมาณแบบไดนามิกให้กับแถบความถี่จากต่ำไปสูง หากใช้บิตเรตทั้งหมดสำหรับความถี่ต่ำและกลาง ความถี่สูงจะถูก "ตัดออก" (จะมีความเงียบแทน)
aptX หาปริมาณย่านความถี่ด้วยจำนวนบิตเท่ากันตลอดเวลา ซึ่งเป็นเหตุผลว่าทำไมจึงมีบิตเรตคงที่: 352 kbps สำหรับ 44.1 kHz, 384 kbps สำหรับ 48 kHz และไม่สามารถ “เปลี่ยนบิต” ไปยังความถี่ที่ต้องการมากที่สุดได้ . ต่างจาก SBC ตรงที่ aptX จะไม่ "ตัด" ความถี่ แต่จะเพิ่มสัญญาณรบกวนเชิงปริมาณให้กับความถี่ดังกล่าว ลดช่วงไดนามิกของเสียง และบางครั้งก็ทำให้เกิดเสียงแตกที่มีลักษณะเฉพาะ SBC “กินรายละเอียด” - ทิ้งพื้นที่ที่เงียบที่สุด
โดยเฉลี่ยแล้ว เมื่อเปรียบเทียบกับ SBC 328k แล้ว aptX จะมีการบิดเบือนน้อยกว่าในเพลงที่มีช่วงความถี่กว้าง แต่ในเพลงที่มีช่วงความถี่แคบและช่วงไดนามิกกว้าง บางครั้ง SBC 328k ก็ชนะ

ลองพิจารณาเป็นกรณีพิเศษ Spectrogram ของการบันทึกการเล่นเปียโน:
เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

พลังงานหลักอยู่ที่ความถี่ตั้งแต่ 0 ถึง 4 kHz และต่อเนื่องไปจนถึง 10 kHz
สเปกโตรแกรมของไฟล์ที่บีบอัดใน aptX มีลักษณะดังนี้:
เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

และนี่คือลักษณะของ SBC 328k
เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

จะเห็นได้ว่า SBC 328k ปิดช่วงที่สูงกว่า 16 kHz โดยสมบูรณ์เป็นระยะๆ และใช้บิตเรตที่มีอยู่ทั้งหมดในช่วงที่ต่ำกว่าค่านี้ อย่างไรก็ตาม aptX ทำให้เกิดการบิดเบือนมากขึ้นในสเปกตรัมความถี่ที่หูของมนุษย์ได้ยิน ดังที่เห็นได้ในสเปกโตรแกรมดั้งเดิมที่ถูกลบออกจากสเปกโตรแกรม aptX (ยิ่งสว่างมาก ความบิดเบี้ยวก็จะมากขึ้น):
เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

ในขณะที่ SBC 328k ทำให้สัญญาณเสียน้อยลงในช่วงตั้งแต่ 0 ถึง 10 kHz และตัดส่วนที่เหลือออก:
เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

บิตเรต 485k ของ SBC เพียงพอที่จะรักษาช่วงความถี่ทั้งหมดไว้ โดยไม่ต้องปิดย่านความถี่
เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

SBC 485k นำหน้า aptX อย่างมากในแทร็กนี้ในช่วง 0-15 kHz โดยมีความแตกต่างน้อยกว่าแต่ยังคงสังเกตเห็นได้ชัดเจนที่ 15-22 kHz (ยิ่งมืดความบิดเบี้ยวก็จะน้อยลง):
เราปรับเปลี่ยนสแต็ค Bluetooth เพื่อปรับปรุงเสียงบนหูฟังที่ไม่มีตัวแปลงสัญญาณ AAC, aptX และ LDAC

เก็บถาวรเสียงต้นฉบับ SBC และ aptX.

เมื่อเปลี่ยนไปใช้ SBC บิตเรตสูง คุณจะได้รับเสียงที่มักจะเต้นเหนือกว่า aptX บนหูฟังทุกรุ่น สำหรับหูฟังที่รองรับการเชื่อมต่อ EDR 3 Mbps บิตเรต 551 kbps จะสร้างเสียงที่เทียบเท่ากับ aptX HD

คุณสามารถทำอะไรมากกว่านี้ได้ไหม?

แพทช์ Android ยังมีตัวเลือกในการเพิ่มบิตเรตสำหรับอุปกรณ์ EDR 2 Mbps คุณสามารถเพิ่มบิตเรตจาก 452 kbit/s เป็น 595 kbit/s โดยมีค่าใช้จ่ายในการลดความเสถียรในการส่งสัญญาณในสภาวะวิทยุที่ยากลำบาก
ก็เพียงพอที่จะตั้งค่าตัวแปรpersist.bluetooth.sbc_hd_higher_bitrateเป็น 1:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

จนถึงขณะนี้แพตช์อัตราบิตสูงสุดถูกนำมาใช้ใน LineageOS 15.1 เท่านั้น แต่ไม่ใช่ใน 16.0

ความเข้ากันได้ของอุปกรณ์

SBC Dual Channel รองรับหูฟัง ลำโพง และเครื่องเสียงติดรถยนต์เกือบทั้งหมด ไม่น่าแปลกใจเลย - มาตรฐานต้องการการสนับสนุนในอุปกรณ์ถอดรหัสใด ๆ มีอุปกรณ์จำนวนเล็กน้อยที่โหมดนี้ทำให้เกิดปัญหา แต่เป็นอินสแตนซ์ที่แยกได้
ดูรายละเอียดเพิ่มเติมเกี่ยวกับอุปกรณ์ที่รองรับได้ที่ 4pda หรือ XDA-พัฒนา.

การเปรียบเทียบความแตกต่างของเสียง

ฉันสร้างบริการเว็บที่เข้ารหัสเสียงเป็น SBC (รวมถึง aptX และ aptX HD) แบบเรียลไทม์ในเบราว์เซอร์ ด้วยเครื่องมือนี้ คุณสามารถเปรียบเทียบเสียงของโปรไฟล์ SBC ต่างๆ และตัวแปลงสัญญาณอื่นๆ โดยไม่ต้องส่งสัญญาณเสียงผ่าน Bluetooth จริงๆ บนหูฟังแบบมีสาย ลำโพง และเพลงโปรดของคุณ และยังเปลี่ยนพารามิเตอร์การเข้ารหัสได้โดยตรงขณะเล่นเสียงอีกด้วย
btcodecs.valdikss.org.ru/sbc-encoder

ติดต่อนักพัฒนา Android

ฉันเขียนถึงนักพัฒนา Bluetooth Stack จำนวนมากที่ Google เพื่อขอให้พวกเขาพิจารณารวมแพตช์ในสาขา Android หลัก - AOSP แต่ไม่ได้รับการตอบกลับแม้แต่ครั้งเดียว แพทช์ของฉันใน ระบบแพทช์ Gerrit สำหรับ Android ยังไม่มีความเห็นจากใครก็ตามที่เกี่ยวข้อง
ฉันจะดีใจมากหากได้รับความช่วยเหลือในการติดต่อกับนักพัฒนาซอฟต์แวร์ที่ Google และนำ SBC HD มาสู่ Android แพทช์ใน gerrit ล้าสมัยแล้ว (นี่เป็นหนึ่งในการแก้ไขเบื้องต้น) และฉันจะอัปเดตหากนักพัฒนาสนใจในการเปลี่ยนแปลงของฉัน (ไม่ใช่เรื่องง่ายสำหรับฉันที่จะอัปเดต ฉันไม่มีอุปกรณ์ที่รองรับ Android Q ).

ข้อสรุป

ผู้ใช้สมาร์ทโฟนที่มี LineageOS, Resurrection Remix และเฟิร์มแวร์ crDroid สามารถเพลิดเพลินกับคุณภาพเสียงที่ได้รับการปรับปรุงได้ในขณะนี้ เพียงเปิดใช้งานตัวเลือกในการตั้งค่าอุปกรณ์ Bluetooth ผู้ใช้ Linux ยังสามารถรับบิตเรต SBC เพิ่มขึ้นโดยการติดตั้ง แพทช์จาก Pali Roharซึ่งเหนือสิ่งอื่นใดคือเพิ่มการรองรับตัวแปลงสัญญาณ aptX, aptX HD และ FastStream

ที่มา: will.com

เพิ่มความคิดเห็น