Vor dem Lesen dieses Artikels wird empfohlen, den vorherigen Artikel zu lesen:
Einige Nutzer von drahtlosen Kopfhörern berichten von einer niedrigen Klangqualität und einem Mangel an hohen Frequenzen bei Verwendung des standardmäßigen Bluetooth-Codecs SBC, der von allen Audiogeräten unterstützt wird. Häufig wird empfohlen, Geräte und Kopfhörer mit Unterstützung für die Codecs aptX und LDAC zu erwerben. Diese Codecs erfordern Lizenzgebühren, weshalb Geräte mit deren Unterstützung teurer sind.
Es stellt sich heraus, dass die niedrige Qualität von SBC auf künstliche Einschränkungen der Bluetooth-Stacks und der Einstellungen der Kopfhörer zurückzuführen ist, und dieses Limit kann auf jedem bestehenden Gerät durch Softwareänderungen am Smartphone oder Computer umgangen werden.
SBC-Codec
Der SBC-Codec 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 bei der Quantisierung: Loudness, SNR;
- Der maximale und minimale Wert des Bit-Pools, der bei der Quantisierung verwendet wird (Bitpool): normalerweise zwischen 2 und 53.
Das Dekodierungsgerät muss jede Kombination dieser Parameter unterstützen. Das Codierungsgerät kann möglicherweise nicht alle implementieren.
Vorhandene Bluetooth-Stacks stimmen in der Regel folgendem Profil zu: Joint Stereo, 8 Bänder, 16 Blöcke, Loudness, Bitpool 2 bis 53. Dieses Profil codiert 44,1 kHz Audio mit einer Bitrate von 328 kbit/s.
Der Bitpool-Parameter hat direkten Einfluss auf die Bitrate innerhalb eines Profils: 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; auch andere Parameter wie Kanaltyp, Anzahl der Frequenzbänder und Anzahl der Blöcke haben erheblichen Einfluss auf die Bitrate. Die Bitrate kann indirekt durch die Abstimmung auf nicht standardisierte Profile erhöht werden, ohne den Bitpool zu ändern.
Formel zur Berechnung der SBC-Bitrate
Im Dual-Channel-Modus werden die Kanäle separat codiert, wobei der gesamte Bitpool für jeden der Kanäle verwendet wird. Wenn man das Gerät zwingt, Dual Channel anstelle von Joint Stereo zu verwenden, erhalten wir eine fast doppelte Bitrate bei demselben maximalen Bitpool-Wert: 617 kbit/s.
Meiner Meinung nach ist die Verwendung eines nicht profilibasierten Bitpool-Wertes während der Aushandlung ein Mangel des A2DP-Standards, der zu einer künstlichen Einschränkung der SBC-Qualität geführt hat. Es wäre sinnvoller gewesen, die Bitrate und nicht den Bitpool zu verhandeln.
Solche festen Werte für Bitpool und Bitrate stammen aus einer Tabelle mit empfohlenen Werten für hochwertige Audioübertragungen. Aber eine Empfehlung ist kein Grund, sich auf diese Werte zu beschränken.
Die Spezifikation A2DP v1.2, die von 2007 bis 2015 aktiv war, schreibt vor, dass alle dekodierenden Geräte Bitraten von bis zu 512 kb/s korrekt verarbeiten müssen:
Der Decoder des SNK muss alle möglichen Bitpool-Werte 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 Bitratenbeschränkung mehr. Es wird davon ausgegangen, dass moderne Kopfhörer, die nach 2015 hergestellt wurden und EDR unterstützen, Bitraten von bis zu ≈730 kb/s unterstützen können.
Aus irgendeinem Grund weisen die von mir überprüften Bluetooth-Stacks für Linux (PulseAudio), Android, Blackberry und macOS künstliche Begrenzungen des maximalen bitpool-Wertes auf, die direkt den maximalen Bitrateneinfluss haben. Doch das ist nicht das größte Problem; fast alle Kopfhörer begrenzen ebenfalls den maximalen bitpool-Wert auf 53.
Wie ich bereits erfahren habe, funktionieren die meisten Geräte hervorragend mit einem modifizierten Bluetooth-Stack bei einer Bitrate von 551 kbit/s, ohne Unterbrechungen und Störungen. Allerdings wird eine solche Bitrate unter normalen Bedingungen nie in standardisierten Bluetooth-Stacks erreicht.
Modifizieren des Bluetooth-Stacks
In jedem Bluetooth-Stack, der mit dem A2DP-Standard kompatibel ist, gibt es Unterstützung für den Dual-Channel-Modus, aber es ist nicht möglich, ihn über die Benutzeroberfläche zu aktivieren.
Lassen Sie uns einen Schalter in die Benutzeroberfläche einfügen! Ich habe Patches für Android 8.1 und Android 9 erstellt, die vollständige Unterstützung für Dual Channel im Stack hinzufügen, einen Modus im Menü zum Umschalten in den Entwicklertools integrieren und SBC mit Unterstützung für Dual Channel so behandeln, als wäre es ein zusätzlicher Codec wie aptX, AAC oder LDAC (Android bezeichnet dies als HD Audio), indem ein Häkchen in den Bluetooth-Geräteeinstellungen hinzugefügt wird. So sieht das aus:
Wenn das Häkchen aktiviert ist, beginnt die Übertragung von Bluetooth-Audio mit einer Bitrate von 551 kbit/s, wenn die Kopfhörer eine Verbindungsgeschwindigkeit von 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 551 und 452 kbit/s?
Die Ether-Split-Technologie in Bluetooth ist für die effiziente Übertragung großer Pakete mit fester Größe konzipiert. Die Datenübertragung erfolgt in Slots, wobei die maximale Anzahl der Slots, die in einer Übertragung gesendet werden, fünf beträgt. Es gibt auch Übertragungsmodi, die einen oder drei Slots nutzen, aber keine zwei oder vier. In fünf Slots können bis zu 679 Byte bei einer Verbindungsgeschwindigkeit von 2 Mbit/s und bis zu 1021 Byte bei 3 Mbit/s übertragen werden; in drei Slots sind es 367 und 552 Byte entsprechend.
Wenn wir weniger Daten übertragen möchten als 679 oder 1021 Byte, aber mehr als 367 oder 552 Byte, benötigt die Übertragung dennoch fünf Slots, und die Daten werden in derselben Zeit gesendet, was die Effizienz der Übertragung verringert.
SBC im Dual Channel-Modus, bei 44100 Hz-Audio mit den Parametern Bitpool 38, 16 Blöcke pro Frame, 8 Frequenzbänder, kodiert Audio in Frames von 164 Byte mit einer Bitrate von 452 kbit/s.
Das Audio muss in die L2CAP- und AVDTP-Übertragungsprotokolle eingekapselt werden, die 16 Byte von der nutzbaren Audio-last abziehen.
Auf diese Weise 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 ein gesendetes Paket integriert, das in 3,75 ms übertragen wird, und es bleiben 6 ungenutzte Bytes im Paket.
Wenn man den Bitpool etwas erhöht, können 4 Audioframes nicht mehr in ein Paket gepackt werden. Es müssen dann 3 Frames gleichzeitig gesendet werden, was die Übertragungseffizienz verringert, die Menge an übertragendem Audio pro Paket reduziert und schneller zu Audioaussetzern bei schlechten Funkbedingungen führt.
Ähnlich wurde eine Bitrate von 551 kbit/s für EDR 3 mbit/s gewählt: mit einem Bitpool von 47, 16 Blöcken im Frame und 8 Frequenzbändern ergibt sich eine Framegröß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 Parameter des SBC ist ziemlich komplex, man kann leicht den Überblick verlieren, wenn man manuell zählt. Daher habe ich einen interaktiven Rechner zur Unterstützung Interessierter erstellt:
Wozu ist das alles gut?
Entgegen der weit verbreiteten Meinung über die Klangqualität des Codecs aptX kann er bei einigen Dateien schlechtere Ergebnisse liefern als SBC mit einer Standard-Bitrate von 328 kbit/s.
SBC weist quantisierte Bits für Frequenzbänder dynamisch zu und arbeitet nach dem Prinzip "von unten nach oben". Wenn die gesamte Bitrate für die tiefen und mittleren Frequenzen verwendet wird, werden die hohen Frequenzen "abgeschnitten" (stattdessen wird es still).
aptX quantisiert die Frequenzbänder konstant mit der gleichen Anzahl an Bits, weshalb es eine konstante Bitrate hat: 352 kbit/s für 44,1 kHz, 384 kbit/s für 48 kHz, und es kann keine Bits auf die Frequenzen verlagern, die am meisten darauf angewiesen sind. Im Gegensatz zu SBC wird aptX keine Frequenzen "abschneiden", sondern quantisierungsbedingtes Rauschen hinzufügen, wodurch der Dynamikbereich der Audioaufnahme verringert wird, und manchmal charakteristische Knackgeräusche erzeugt. SBC "verliert Details" – es lässt die leisesten Bereiche weg.
Im Durchschnitt erzeugt aptX im Vergleich zu SBC 328k weniger Verzerrungen in Musik mit einem breiten Frequenzbereich, aber bei Musik mit einem engen Frequenzbereich und breitem Dynamikbereich gewinnt SBC 328k manchmal.
Betrachten wir einen speziellen Fall. Das Spektrum einer Klavieraufnahme:
Die Hauptenergie liegt im Frequenzbereich von 0 bis 4 kHz und reicht bis zu 10 kHz.
Das Spektrum einer Datei, die in aptX komprimiert wurde, sieht folgendermaßen aus:
So sieht SBC 328k aus.
Es ist ersichtlich, dass SBC 328k den Frequenzbereich über 16 kHz gelegentlich vollständig abgeschaltet hat und die gesamte verfügbare Bitrate für die Bereiche unterhalb dieses Wertes verwendet wurde. Allerdings führte aptX zu mehr Verzerrungen im für das menschliche Ohr hörbaren Frequenzspektrum, was auf der subtrahierten Originalspektrumanalyse aus dem aptX-Spektrum zu erkennen ist (je heller, desto mehr Verzerrungen):
Während SBC 328k das Signal im Bereich von 0 bis 10 kHz weniger verschlechterte, schnitt es den Rest ab:
Die Bitrate von 485k SBC genügte, um den gesamten Frequenzbereich zu erhalten, ohne Bereiche abzuschalten.
SBC 485k übertrifft in diesem Stück aptX erheblich im Bereich von 0-15 kHz und zeigt eine geringere, aber immer noch spürbare Differenz im Bereich von 15-22 kHz (je dunkler, desto weniger Verzerrungen):
.
Durch den Wechsel zu hochbitratigem SBC erhalten Sie einen Klang, der oft aptX übertrifft, auf jedem Kopfhörer. Bei Kopfhörern, die EDR 3 Mbit/s unterstützen, liefert eine Bitrate von 551 kbit/s einen Klang, der mit aptX HD vergleichbar ist.
Kann man noch mehr erreichen?
Im Patch für Android gibt es auch die Möglichkeit, die Bitrate für EDR-Geräte auf 2 Mbit/s weiter zu erhöhen. Die Bitrate kann von 452 kbit/s auf 595 kbit/s angehoben werden, was jedoch die Stabilität der Übertragung bei schwierigen Funkbedingungen beeinträchtigen kann.
Es reicht aus, die Variable persist.bluetooth.sbc_hd_higher_bitrate auf den Wert 1 zu setzen:
# setprop persist.bluetooth.sbc_hd_higher_bitrate 1Der Patch für die extreme Bitrate wurde bisher nur in LineageOS 15.1 akzeptiert, nicht jedoch in 16.0.
Kompatibilität mit Geräten
SBC Dual Channel wird von fast allen Kopfhörern, Lautsprechern und Autoradios unterstützt. Dies ist nicht überraschend — der Standard schreibt die Unterstützung in allen dekodierenden Geräten vor. Es gibt jedoch einige wenige Geräte, bei denen dieser Modus Probleme verursacht, aber das sind Ausnahmefälle.
Eine detaillierte Übersicht über kompatible Geräte finden Sie unter oder .
Vergleich der Klangunterschiede
Ich habe einen Web-Service entwickelt, der Audio in SBC (sowie aptX und aptX HD) in Echtzeit direkt im Browser codiert. Damit können Sie den Klang verschiedener SBC-Profile und anderer Codecs vergleichen, ohne Audio tatsächlich über Bluetooth zu übertragen, mit beliebigen kabelgebundenen Kopfhörern, Lautsprechern und Ihrer Lieblingsmusik sowie die Codierungsparameter während der Audio-Wiedergabe ändern.
Kontakt zu den Android-Entwicklern
Ich habe viele Entwickler des Bluetooth-Stacks von Google kontaktiert und um die Berücksichtigung meiner Patches für die Hauptversion von Android — AOSP gebeten, aber keine Antwort erhalten. Gerrit-Patch-System für Android
blieben ebenfalls ohne Kommentare von Seiten der Verantwortlichen. Ich wäre dankbar, wenn mir jemand helfen könnte, Kontakt zu den Entwicklern von Google herzustellen und SBC HD in Android zu implementieren. Der Patch in Gerrit ist bereits veraltet (es handelt sich um eine der frühen Revisionen), und ich werde ihn aktualisieren, wenn die Entwickler an meinen Änderungen interessiert sind (es fällt mir schwer, ihn zu aktualisieren, da ich keine mit Android Q kompatiblen Geräte habe).
Fazit
Smartphone-Nutzer mit LineageOS-, Resurrection Remix- und crDroid-Firmwares können sich jetzt über eine verbesserte Klangqualität freuen, indem sie einfach die Option in den Bluetooth-Geräteeinstellungen aktivieren. Auch Linux-Nutzer können durch die Installation , der unter anderem die Unterstützung für die Codecs aptX, aptX HD und FastStream hinzufügt, profitieren.
Quelle: habr.com
