Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Bevor Sie diesen Artikel lesen, empfehlen wir Ihnen, den vorherigen Artikel zu lesen: Audio über Bluetooth: Möglichst viele Details zu Profilen, Codecs und Geräten

Einige Benutzer von drahtlosen Kopfhörern berichten über eine schlechte Klangqualität und einen Mangel an hohen Frequenzen, wenn sie den standardmäßigen SBC-Bluetooth-Codec verwenden, der von allen Audiogeräten unterstützt wird. Eine gängige Empfehlung zur Klangverbesserung ist der Kauf von Geräten und Kopfhörern, die aptX- und LDAC-Codecs unterstützen. Für diese Codecs fallen Lizenzgebühren an, sodass Geräte, die sie unterstützen, teurer sind.

Es stellt sich heraus, dass die geringe Qualität von SBC auf künstliche Einschränkungen von Bluetooth-Stacks und Kopfhörereinstellungen zurückzuführen ist und diese Einschränkung auf allen vorhandenen Geräten durch Softwareänderungen an einem Smartphone oder Computer umgangen werden kann.

Codec SBC

Der SBC-Codec verfügt über viele verschiedene Parameter, die während der Verbindungsaufbauphase ausgehandelt werden. Unter ihnen:

  • Anzahl und Art 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 bei der Quantisierung: Lautstärke, SNR;
  • Der maximale und minimale Wert des bei der Quantisierung verwendeten Bitpools (Bitpool): normalerweise zwischen 2 und 53.

Das Dekodiergerät muss jede Kombination dieser Parameter unterstützen. Der Encoder implementiert möglicherweise nicht alles.
Bestehende Bluetooth-Stacks einigen sich typischerweise auf das folgende Profil: Joint Stereo, 8 Bänder, 16 Blöcke, Loudness, Bitpool 2..53. Dieses Profil kodiert 44.1-kHz-Audio mit einer Bitrate von 328 kbps.
Der Bitpool-Parameter wirkt sich direkt auf die Bitrate innerhalb eines Profils aus: Je höher er ist, desto höher ist die Bitrate und damit die Qualität.
Der Bitpool-Parameter ist jedoch nicht an ein bestimmtes Profil gebunden; Die Bitrate wird auch maßgeblich von anderen Parametern beeinflusst: Art der Kanäle, Anzahl der Frequenzbänder, Anzahl der Blöcke. Sie können die Bitrate indirekt erhöhen, indem Sie sich auf nicht standardmäßige Profile einigen, ohne den Bitpool zu ändern.

Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Formel zur Berechnung der SBC-Bitrate

Im Dual-Channel-Modus werden beispielsweise Kanäle separat codiert, wobei der gesamte Bitpool für jeden Kanal verwendet wird. Indem wir das Gerät dazu zwingen, Dual Channel anstelle von Joint Stereo zu verwenden, erhalten wir fast die doppelte Bitrate bei demselben maximalen Bitpool-Wert: 617 kbps.
Meiner Meinung nach ist die Verwendung eines Bitpool-Werts, der in der Verhandlungsphase nicht an ein Profil gebunden ist, ein Fehler im A2DP-Standard, der zu einer künstlichen Einschränkung der SBC-Qualität geführt hat. Es wäre sinnvoller, die Bitrate auszuhandeln als den Bitpool.

Diese festen Bitpool- und Bitrate-Werte stammen aus einer Tabelle mit empfohlenen Werten für die Verwendung für hochwertiges Audio. Doch eine Empfehlung ist kein Grund, sich auf diese Werte zu beschränken.

Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Die A2DP v1.2-Spezifikation, die von 2007 bis 2015 aktiv war, erfordert, dass alle Dekodierungsgeräte mit Bitraten von bis zu 512 kbps korrekt funktionieren:

Der Decoder des SNK muss alle möglichen Bitpoolwerte unterstützen, die nicht zu einer Überschreitung der maximalen Bitrate führen. Dieses Profil begrenzt die verfügbare maximale Bitrate auf 320 kb/s für Mono und 512 kb/s für Zweikanalmodi.

In der neuen Version der Spezifikation gibt es keine Begrenzung der Bitrate. Es wird geschätzt, dass moderne Kopfhörer, die nach 2015 auf den Markt kamen und EDR unterstützen, Bitraten von bis zu ≈730 kbps unterstützen können.

Aus irgendeinem Grund haben die von mir getesteten Bluetooth-Stacks für Linux (PulseAudio), Android, Blackberry und macOS künstliche Grenzen für den Maximalwert des Bitpool-Parameters, was sich direkt auf die maximale Bitrate auswirkt. Das ist aber nicht das größte Problem, denn fast alle Kopfhörer begrenzen auch den maximalen Bitpool-Wert auf 53.
Wie ich bereits gesehen habe, funktionieren die meisten Geräte auf einem modifizierten Bluetooth-Stack mit einer Bitrate von 551 kbps einwandfrei, ohne Unterbrechungen oder Knistern. Eine solche Bitrate wird jedoch unter normalen Bedingungen auf normalen Bluetooth-Stacks niemals konstant sein.

Ändern des Bluetooth-Stacks

Jeder Bluetooth-Stack, der mit dem A2DP-Standard kompatibel ist, unterstützt den Dual-Channel-Modus, eine Aktivierung über die Schnittstelle ist jedoch nicht möglich.

Fügen wir der Benutzeroberfläche einen Schalter hinzu! Ich habe Patches für Android 8.1 und Android 9 erstellt, die dem Stack vollständige Dual-Channel-Unterstützung hinzufügen, einen Modus zum Modus-Umschaltmenü in den Entwicklungstools hinzufügen und Dual-Channel-fähige SBCs so behandeln, als wären sie ein zusätzlicher Codec wie aptX , AAC oder LDAC (Android nennt dies HD Audio), indem Sie ein Häkchen in den Bluetooth-Geräteeinstellungen hinzufügen. So sieht es aus:

Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

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

Wenn das Kontrollkästchen aktiviert ist, beginnt die Übertragung von Bluetooth-Audio mit einer bestimmten Bitrate 551 kbit/s, wenn der Kopfhörer eine Verbindungsgeschwindigkeit von 3 Mbit/s unterstützt, oder 452 kbit/s, wenn der Kopfhörer nur 2 Mbit/s unterstützt.

Dieser Patch ist in den folgenden alternativen Firmwares enthalten:

  • LineageOS
  • Auferstehungs-Remix
  • CrDroid

Woher kommen 551 und 452 kbit/s?

Die Bluetooth-Air-Sharing-Technologie ist darauf ausgelegt, große Pakete fester Größe effizient zu übertragen. Die Datenübertragung erfolgt in Slots, die größte Anzahl an Slots, die bei einer Übertragung gesendet werden, beträgt 5. Es gibt auch Übertragungsmodi, die 1 oder 3 Slots verwenden, jedoch nicht 2 oder 4. In 5 Slots können Sie bis zu 679 Bytes mit einer Verbindungsgeschwindigkeit übertragen von 2 Mbit/s und bis zu 1021 Byte bei einer Geschwindigkeit von 3 Mbit/s und bei 3 - 367 bzw. 552 Byte.

Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Wenn wir weniger Daten als 679 oder 1021 Bytes, aber mehr als 367 oder 552 Bytes übertragen möchten, benötigt die Übertragung immer noch 5 Slots und die Daten werden gleichzeitig übertragen, was die Übertragungseffizienz verringert.

Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

SBC im Dual-Channel-Modus, bei 44100 Hz Audio mit Bitpool 38 Parametern, 16 Blöcken pro Frame, 8 Frequenzbereichen, kodiert Audio in 164-Byte-Frames, mit einer Bitrate von 452 kbps.
Audio muss in den Übertragungsprotokollen L2CAP und AVDTP gekapselt werden, die 16 Byte von der Audio-Nutzlast beanspruchen.

Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Somit kann eine Bluetooth-Übertragung mit 5 Slots 4 Audio-Frames aufnehmen:

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

Wir fügen 11.7 ms Audiodaten in das gesendete Paket ein, die in 3.75 ms übertragen werden, und es sind noch 6 ungenutzte Bytes im Paket übrig.
Wenn Sie den Bitpool etwas erhöhen, ist es nicht mehr möglich, 4 Audioframes in ein Paket zu packen. Sie müssen 3 Frames gleichzeitig senden, was die Übertragungseffizienz verringert, die pro Frame übertragene Audiomenge verringert und bei schlechten Funkbedingungen schneller zu Audiostottern führt.

Ebenso wurde für EDR 551 Mbit/s eine Bitrate von 3 kbit/s gewählt: Bei Bitpool 47, 16 Blöcke pro Frame, 8 Frequenzbereiche beträgt die Framegröße 200 Byte, bei einer Bitrate von 551 kbit/s. Ein Paket enthält 5 Frames oder 14.6 ms Musik.

Der Algorithmus zur Berechnung aller SBC-Parameter ist ziemlich komplex. Wenn Sie manuell zählen, kann es leicht zu Verwirrung kommen. Deshalb habe ich einen interaktiven Rechner erstellt, um Interessierten zu helfen: btcodecs.valdikss.org.ru/sbc-bitrate-calculator

Warum ist das alles nötig?

Entgegen der landläufigen Meinung über die Klangqualität des aptX-Codecs kann er bei einigen Dateien zu schlechteren Ergebnissen führen als SBC mit einer Standardbitrate von 328 kbps.

Der SBC weist Quantisierungsbits dynamisch von niedrig nach hoch den Frequenzbändern zu. Wenn die gesamte Bitrate für die niedrigen und mittleren Frequenzen verwendet wurde, werden die hohen Frequenzen „abgeschnitten“ (stattdessen herrscht Stille).
aptX quantisiert Frequenzbänder immer mit der gleichen Anzahl von Bits, weshalb es eine konstante Bitrate hat: 352 kbps für 44.1 kHz, 384 kbps für 48 kHz, und es kann nicht zu den Frequenzen „bitverschieben“, die sie am meisten benötigen . Im Gegensatz zu SBC „schneidet“ aptX die Frequenzen nicht ab, sondern fügt ihnen Quantisierungsrauschen hinzu, wodurch der Dynamikbereich des Audios verringert wird und manchmal ein charakteristisches Knistern entsteht. SBC „frisst Details“ – verwirft die ruhigsten Bereiche.
Im Vergleich zum SBC 328k verursacht aptX im Durchschnitt weniger Verzerrungen bei Musik mit einem breiten Frequenzbereich, aber bei Musik mit einem schmalen Frequenzbereich und einem großen Dynamikbereich gewinnt der SBC 328k manchmal.

Betrachten wir einen Sonderfall. Spektrogramm einer Klavierspielaufnahme:
Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Die Hauptenergie liegt in Frequenzen von 0 bis 4 kHz und reicht bis 10 kHz.
Das Spektrogramm einer in aptX komprimierten Datei sieht folgendermaßen aus:
Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Und so sieht SBC 328k aus.
Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Es ist ersichtlich, dass der SBC 328k den Bereich oberhalb von 16 kHz regelmäßig vollständig abschaltete und die gesamte verfügbare Bitrate für Bereiche unterhalb dieses Werts ausgab. Allerdings führte aptX zu mehr Verzerrung in das für das menschliche Ohr hörbare Frequenzspektrum, wie aus dem subtrahierten Originalspektrogramm vom aptX-Spektrogramm ersichtlich ist (je heller, desto mehr Verzerrung):
Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Während der SBC 328k das Signal im Bereich von 0 bis 10 kHz weniger verfälscht und den Rest abschneidet:
Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Die 485k-Bitrate des SBC reichte aus, um den gesamten Frequenzbereich zu erhalten, ohne Bänder zu deaktivieren.
Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Der SBC 485k liegt auf diesem Track im Bereich von 0-15 kHz deutlich vor aptX, mit einem kleineren, aber immer noch spürbaren Unterschied von 15-22 kHz (je dunkler, desto weniger Verzerrung):
Wir modifizieren den Bluetooth-Stack, um den Klang auf Kopfhörern ohne AAC-, aptX- und LDAC-Codecs zu verbessern

Archiv von Original-Audio, SBC und aptX.

Durch den Wechsel zu einem SBC mit hoher Bitrate erhalten Sie Audio, das auf jedem Kopfhörer oft besser ist als aptX. Bei Kopfhörern, die 3 Mbit/s EDR-Konnektivität unterstützen, erzeugt eine Bitrate von 551 Kbit/s einen Klang, der mit aptX HD vergleichbar ist.

Können Sie noch mehr tun?

Der Android-Patch enthält außerdem eine Option zur weiteren Erhöhung der Bitrate für 2-Mbps-EDR-Geräte. Sie können die Bitrate von 452 kbit/s auf 595 kbit/s erhöhen, allerdings auf Kosten der Übertragungsstabilität bei schwierigen Funkbedingungen.
Es reicht aus, die Variable persist.bluetooth.sbc_hd_higher_bitrate auf 1 zu setzen:

# setprop persist.bluetooth.sbc_hd_higher_bitrate 1

Der Extreme-Bitrate-Patch wurde bisher nur in LineageOS 15.1 übernommen, nicht jedoch in 16.0.

Gerätekompatibilität

SBC Dual Channel wird von fast allen Kopfhörern, Lautsprechern und Auto-Headunits unterstützt. Das ist kein Wunder – der Standard erfordert seine Unterstützung in allen Decodierungsgeräten. Es gibt eine kleine Anzahl von Geräten, bei denen dieser Modus Probleme verursacht, es handelt sich jedoch um Einzelfälle.
Weitere Details zu kompatiblen Geräten finden Sie unter 4pda oder xda-developers.

Vergleich der Klangunterschiede

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

Kontaktieren Sie Android-Entwickler

Ich habe an viele Bluetooth-Stack-Entwickler bei Google geschrieben und sie gebeten, die Aufnahme von Patches in den Hauptzweig von Android – AOSP – in Betracht zu ziehen, habe aber keine einzige Antwort erhalten. Meine Patches sind drin Gerrit-Patch-System für Android blieb ebenfalls ohne Kommentar aller Beteiligten.
Ich würde mich freuen, wenn ich Hilfe dabei bekäme, mit den Entwicklern bei Google in Kontakt zu treten und SBC HD auf Android zu bringen. Der Patch in Gerrit ist bereits veraltet (dies ist eine der ersten Revisionen) und ich werde ihn aktualisieren, wenn die Entwickler an meinen Änderungen interessiert sind (es ist für mich nicht einfach, ihn zu aktualisieren, ich habe keine mit Android Q kompatiblen Geräte). ).

Abschluss

Nutzer von Smartphones mit LineageOS, Resurrection Remix und crDroid-Firmware können sich ab sofort über eine verbesserte Klangqualität freuen, indem sie einfach die Option in den Bluetooth-Geräteeinstellungen aktivieren. Linux-Benutzer können durch die Installation auch eine höhere SBC-Bitrate erhalten Patch von Pali Rohar, das unter anderem Unterstützung für die Codecs aptX, aptX HD und FastStream bietet.

Source: habr.com

Kommentar hinzufügen