Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Vor dem Lesen dieses Artikels wird empfohlen, sich mit dem vorherigen Artikel vertraut zu machen: Audio über Bluetooth: alles über Profile, Codecs und Geräte

Einige Benutzer von kabellosen Kopfhörern berichten von einer schlechten Klangqualität und einem Mangel an hohen Frequenzen bei Verwendung des Standard-Bluetooth-Codecs SBC, der von allen Audiogeräten unterstützt wird. Eine häufige Empfehlung zur Verbesserung des Sounds ist der Kauf von Geräten und Kopfhörern, die die Codec aptX und LDAC unterstützen. Diese Codecs erfordern Lizenzgebühren, weshalb Geräte, die sie unterstützen, teurer sind.

Es stellt sich heraus, dass die schlechte SBC-Qualität auf künstliche Einschränkungen der Bluetooth-Stacks und der Einstellungen der Kopfhörer zurückzuführen ist, und diese Einschränkung kann auf allen bestehenden Geräten durch Softwareänderungen am Smartphone oder Computer umgangen werden.

Codec SBC

Der Codec SBC hat viele verschiedene Parameter, die während der Verbindungsherstellung ausgehandelt werden. Dazu gehören:

  • Anzahl und Typ der Kanäle: Joint Stereo, Stereo, Dual Channel, Mono;
  • Anzahl der Frequenzbänder: 4 oder 8;
  • Anzahl der Blöcke im Paket: 4, 8, 12, 16;
  • Algorithmus zur Bitverteilung beim Quantisieren: Loudness, SNR;
  • Maximale und minimale Bitpoolgröße, die beim Quantisieren verwendet wird: in der Regel von 2 bis 53.

Das dekodierende Gerät muss jede Kombination dieser Parameter unterstützen. Das codierende Gerät kann nicht alle umsetzen.
Bestehende Bluetooth-Stacks einigen sich in der Regel auf folgendes Profil: Joint Stereo, 8 Bänder, 16 Blöcke, Loudness, Bitpool 2..53. Dieses Profil codiert 44,1 kHz Audio mit einer Bitrate von 328 kbit/s.
Der Parameter Bitpool beeinflusst direkt die Bitrate innerhalb eines Profils: Je höher er ist, desto höher ist die Bitrate und somit die Qualität.
Der Parameter Bitpool ist jedoch nicht an ein bestimmtes Profil gebunden; auch andere Parameter wie Kanäle, die Anzahl der Frequenzbänder und die Anzahl der Blöcke haben erheblichen Einfluss auf die Bitrate. Die Bitrate kann indirekt erhoben werden, indem nicht standardisierte Profile ausgehandelt werden, ohne den Bitpool zu ändern.

Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Formel zur Berechnung der Bitrate SBC

Im Dual Channel-Modus werden die Kanäle getrennt codiert, wobei der gesamte Bitpool für jeden Kanal verwendet wird. Wenn wir das Gerät dazu bringen, Dual Channel anstelle von Joint Stereo zu verwenden, erhalten wir eine nahezu doppelte Bitrate bei demselben maximalen Bitpool-Wert: 617 kbit/s.
Meiner Meinung nach ist die Verwendung eines nicht profilgebundenen Bitpool-Wertes in der Aushandlungsphase ein Mangel des A2DP-Standards, der zu einer künstlichen Einschränkung der Qualität von SBC geführt hat. Es wäre sinnvoller gewesen, die Bitrate und nicht den Bitpool zu verhandeln.

Solche festen Werte für Bitpool und Bitrate leiten sich aus einer Tabelle mit empfohlenen Werten für qualitativ hochwertigen Audio ab. Aber eine Empfehlung ist kein Grund, sich auf diese Werte zu beschränken.

Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Die Spezifikation A2DP v1.2, die von 2007 bis 2015 aktiv war, schreibt vor, dass alle dekodierenden Geräte korrekt mit Bitraten von bis zu 512 kbit/s arbeiten müssen:

Der Decoder des SNK muss alle möglichen Bitpool-Werte unterstützen, die nicht über die maximale Bitrate hinausgehen. Dieses Profil beschränkt die maximal verfügbare Bitrate auf 320 kbit/s für Mono und 512 kbit/s für Zweikanalmodi.

In der neuen Version der Spezifikation gibt es keine Einschränkungen für die Bitrate. Es wird angenommen, dass moderne Kopfhörer, die nach 2015 hergestellt wurden und EDR unterstützen, Bitraten von bis zu etwa 730 kbit/s unterstützen können.

Aus irgendeinem Grund gibt es bei den von mir überprüften Bluetooth-Stacks unter Linux (PulseAudio), Android, Blackberry und macOS künstliche Einschränkungen des maximalen Bitpool-Wertes, der direkt die maximale Bitrate beeinflusst. Aber das ist nicht das größte Problem; fast alle Kopfhörer beschränken ebenfalls den maximalen Bitpool auf die Zahl 53.
Wie ich bereits festgestellt habe, funktionieren die meisten Geräte hervorragend mit einem modifizierten Bluetooth-Stack bei einer Bitrate von 551 kbit/s, ohne Unterbrechungen oder Knacken. Aber eine solche Bitrate wird unter normalen Bedingungen niemals ausgehandelt, bei normalen Bluetooth-Stacks.

Modifizieren Sie den Bluetooth-Stack

In jedem Bluetooth-Stack, der mit dem A2DP-Standard kompatibel ist, wird der Dual-Channel-Modus unterstützt, aber er kann nicht über die Benutzeroberfläche aktiviert werden.

Lassen Sie uns einen Schalter in die Benutzeroberfläche einfügen! Ich habe Patches für Android 8.1 und Android 9 erstellt, die die vollständige Unterstützung für Dual Channel im Stack hinzufügen, den Modus zum Umschaltmenü in den Entwicklertools hinzufügen und SBC mit Unterstützung für Dual Channel so verarbeiten, als wäre es ein zusätzlicher Codec wie aptX, AAC oder LDAC (Android nennt das HD Audio), und ein Häkchen in den Bluetooth-Geräteeinstellungen hinzufügen. So sieht das aus:

Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Patch für Android 9
Patch für Android 8.1

Bei Aktivierung des Häckchens wird Bluetooth-Audio mit einer Bitrate von 551 kbit/s, übertragen, wenn die Kopfhörer eine Verbindung mit 3 Mbit/s unterstützen, oder 452 kbit/s, wenn die Kopfhörer nur 2 Mbit/s unterstützen.

Dieser Patch ist in den folgenden alternativen Firmware-Versionen enthalten:

  • LineageOS
  • Resurrection Remix
  • crDroid

Woher stammen die 551 und 452 kbit/s?

Die Technologie der Air-Partitionierung in Bluetooth ist für die effektive Übertragung großer Pakete fester Größe vorgesehen. Die Datenübertragung erfolgt in Slots, die maximale Anzahl an Slots, die in einer Übertragung gesendet werden, ist 5. Es gibt auch Übertragungsmodi, die 1 oder 3 Slots verwenden, jedoch keine 2 oder 4. In 5 Slots können bis zu 679 Bytes bei einer Verbindungsgeschwindigkeit von 2 Mbit/s und bis zu 1021 Bytes bei einer Geschwindigkeit von 3 Mbit/s übertragen werden, und bei 3 jeweils 367 und 552 Bytes.

Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Wenn wir weniger Daten als 679 oder 1021 Bytes, aber mehr als 367 oder 552 Bytes übertragen möchten, nimmt die Übertragung dennoch 5 Slots in Anspruch, und die Daten werden in derselben Zeit übertragen, was die Effizienz der Übertragung verringert.

Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

SBC im Dual-Channel-Modus, bei 44100 Hz-Audio mit den Parametern Bitpool 38, 16 Blöcken pro Frame, 8 Frequenzbereichen, codiert Audio in Frames von 164 Bytes mit einer Bitrate von 452 kbit/s.
Audio muss in die L2CAP- und AVDTP-Übertragungsprotokolle gekapselt werden, die 16 Bytes von der nützlichen Audiodatenlast abziehen.

Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Somit können in einer Bluetooth-Übertragung mit 5 Slots 4 Audioframes untergebracht werden:

679 (EDR 2 Mbit/s DH5) - 4 (L2CAP) - 12 (AVDTP/RTP) - 1 (SBC-Header) - (164*4) = 6

Wir haben 11,7 ms Audiodaten in das gesendete Paket eingefügt, das in 3,75 ms übertragen wird, und wir haben 6 ungenutzte Bytes im Paket zurückgelassen.
Wenn wir den Bitpool ein wenig erhöhen, können bereits 4 Audioframes nicht mehr in ein einziges Paket gepackt werden. Wir müssen dann 3 Frames auf einmal senden, was die Effizienz der Übertragung verringert, die Menge des übertragenen Audios pro Paket reduziert und schneller zu Störungen des Audios bei schlechten Funkbedingungen führt.

Auf die gleiche Weise wurde eine Bitrate von 551 kbit/s für EDR 3 Mbit/s gewählt: Mit Bitpool 47, 16 Blöcken pro Frame, 8 Frequenzbereichen ergibt sich eine Frame-Größe von 200 Bytes bei einer Bitrate von 551 kbit/s. In ein Paket passen 5 Frames oder 14.6 ms Musik.

Der Algorithmus zur Berechnung aller SBC-Parameter ist ziemlich komplex, man kann leicht durcheinanderkommen, wenn man manuell rechnet, deshalb habe ich einen interaktiven Rechner zur Unterstützung der Interessierten erstellt: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Warum ist das alles nötig?

Entgegen der gängigen Meinung über die Klangqualität des aptX-Codecs kann er bei einigen Dateien schlechtere Ergebnisse liefern als SBC mit einer Standard-Bitrate von 328 kbit/s.

SBC weist die Quantisierungsbits dynamisch auf die Frequenzbänder zu, wobei er nach dem Prinzip „von unten nach oben“ arbeitet. Wenn die gesamte Bitrate für tiefe und mittlere Frequenzen verwendet wird, werden hohe Frequenzen „abgeschnitten“ (stattdessen gibt es Stille).
aptX quantisiert die Frequenzbänder konstant mit der gleichen Anzahl an Bits, was zu einer konstanten Bitrate führt: 352 kbit/s für 44,1 kHz, 384 kbit/s für 48 kHz, und es kann die Bits nicht auf die Frequenzen übertragen, die sie am meisten benötigen. Im Gegensatz zu SBC wird aptX keine Frequenzen „abschneiden“, sondern Geräusche durch Quantisierung hinzufügen, wodurch der Dynamikbereich des Audios verringert wird und gelegentlich charakteristische Knackgeräusche entstehen. SBC hingegen „frisst Details“ – es lässt die leisesten Abschnitte weg.
Im Durchschnitt führt aptX im Vergleich zu SBC 328k zu weniger Verzerrungen in Musik mit einem breiten Frequenzbereich, aber bei Musik mit einem engen Frequenzbereich und einem weiten Dynamikbereich kann SBC 328k manchmal überlegen sein.

Betrachten wir einen speziellen Fall. Das Spektrogramm einer Aufnahme eines Klavierspiels:
Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Die Hauptenergie liegt im Frequenzbereich von 0 bis 4 kHz und reicht bis 10 kHz.
Das Spektrogramm der Datei, die in aptX komprimiert wurde, sieht folgendermaßen aus:
Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

So sieht SBC 328k aus.
Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Es ist deutlich zu sehen, dass SBC 328k den Frequenzbereich oberhalb von 16 kHz gelegentlich vollständig abgeschaltet hat und die gesamte verfügbare Bitrate auf die darunter liegenden Bereiche verwendet hat. Allerdings hat aptX mehr Verzerrungen im für das menschliche Ohr hörbaren Frequenzspektrum verursacht, was auf dem abgezogenen Originalspektrum vom aptX-Spektrogramm zu erkennen ist (je heller, desto mehr Verzerrungen):
Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Während SBC 328k das Signal im Frequenzbereich von 0 bis 10 kHz weniger beeinträchtigt hat, hat es den Rest abgeschnitten:
Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Die Bitrate von 485k SBC reichte aus, um den gesamten Frequenzbereich zu erhalten, ohne die Bänder abzuschalten.
Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

SBC 485k schneidet bei dieser Komposition im Frequenzbereich 0-15 kHz deutlich besser ab als aptX, und mit einem geringeren, aber dennoch bemerkbaren Unterschied im Bereich von 15-22 kHz (je dunkler, desto weniger Verzerrungen):
Modifizieren des Bluetooth-Stacks zur Verbesserung der Audioqualität bei Kopfhörern ohne die Codecs AAC, aptX und LDAC

Archiv des Originalaudios, SBC und aptX.

Durch den Wechsel zu hochbitratigem SBC erhalten Sie oft einen Klang, der aptX übertrifft, auf jedem Kopfhörer. Bei Kopfhörern, die eine EDR-Verbindung mit 3 Mbit/s unterstützen, liefert eine Bitrate von 551 kbit/s einen Klang, der mit aptX HD vergleichbar ist.

Kann es noch mehr sein?

Im Patch für Android gibt es auch eine Option zur weiteren Erhöhung der Bitrate für EDR Geräte auf 2 Mbit/s. Die Bitrate kann von 452 kbit/s auf 595 kbit/s erhöht werden, was allerdings die Stabilität der Übertragung unter schwierigen Funkbedingungen beeinträchtigt.
Es genügt, die Variable persist.bluetooth.sbc_hd_higher_bitrate auf den Wert 1 zu setzen:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Der Patch für die extreme Bitrate wurde bisher nur in LineageOS 15.1 akzeptiert, jedoch nicht in 16.0.

Kompatibilität mit Geräten

SBC Dual Channel wird von nahezu allen Kopfhörern, Lautsprechern und Fahrzeug-Audiosystemen unterstützt. Das ist nicht überraschend, da der Standard seine Unterstützung in allen decodierenden Geräten vorschreibt. Es gibt nur eine geringe Anzahl von Geräten, bei denen dieser Modus Probleme verursacht, aber das sind Einzelfälle.
Eine detailliertere Übersicht über kompatible Geräte finden Sie auf 4pda oder xda-developers.

Vergleich der Klangunterschiede

Ich habe einen Webdienst geschaffen, der Audio in Echtzeit im SBC (sowie aptX und aptX HD) direkt im Browser codiert. Mit ihm können Sie den Klang verschiedener SBC-Profile und anderer Codecs vergleichen, ohne tatsächlich Audio über Bluetooth zu übertragen, und zwar an beliebigen kabelgebundenen Kopfhörern, Lautsprechern und Ihrer Lieblingsmusik, sowie die Codierungsparameter während der Audiowiedergabe ändern.
btcodecs.valdikss.org.ru/sbc-encoder

Kontakt zu den Android-Entwicklern

Ich habe vielen Entwicklern des Bluetooth-Stacks von Google geschrieben und sie gebeten, die Patches in den Hauptzweig von Android — AOSP — aufzunehmen, aber ich habe keine Rückmeldung erhalten. Meine Patches in dem Patch-System Gerrit für Android blieben ebenfalls ohne Kommentare von jemandem, der damit zu tun hat.
Ich würde mich freuen, wenn ich Unterstützung im Kontakt mit den Entwicklern von Google und der Implementierung von SBC HD in Android erhalten könnte. Der Patch in Gerrit ist bereits veraltet (das ist eine der frühen Revisionen), und ich werde ihn aktualisieren, wenn die Entwickler an meinen Änderungen interessiert sind (es ist nicht einfach für mich, da ich keine mit Android Q kompatiblen Geräte habe).

Fazit

Benutzer von Smartphones mit LineageOS-, Resurrection Remix- und crDroid-Firmware können bereits jetzt von verbessertem Klang profitieren, indem sie die Option in den Bluetooth-Geräteeinstellungen aktivieren. Auch Benutzer von Linux können eine erhöhte SBC-Bitrate erhalten, indem sie den Patch von Pali Rohár installieren, der unter anderem die Unterstützung für die Codecs aptX, aptX HD und FastStream hinzufügt.

Quelle: habr.com

60GB SSD 8Gb DDR4