Audioaufnahme

Ab Android 5.0 (Lollipop) basieren die Audio-Resampler vollständig auf FIR-Filtern, die aus einer Kaiser-Windowed-Sinc-Funktion abgeleitet werden. Das Windowed-Sinc-Fenster „Kaiser“ bietet folgende Eigenschaften:

  • Die Berechnung der Designparameter (Stoppbandwellen, Übergangsbandbreite, Grenzfrequenz, Filterlänge) ist einfach.
  • Sie ist für die Reduzierung der Stoppbandenergie im Vergleich zur Gesamtenergie fast optimal.

Vaidyanathan, Multirate Systems and Filter Banks, S. 50 enthält Erläuterungen zum Kaiser-Fenster und seiner Optimität und Beziehung zu Prolate Spheroidal Windows.

Die Designparameter werden automatisch anhand der internen Qualitätsbestimmung und der gewünschten Stichprobenverhältnisse berechnet. Basierend auf den Designparametern wird der Windowed-Sinc-Filter generiert. Bei der Verwendung von Musik wird der Resampler für 44,1 bis 48 kHz und umgekehrt mit einer höheren Qualität als bei der Umwandlung mit beliebiger Frequenz generiert.

Die Audio-Resampler bieten eine höhere Qualität und Geschwindigkeit, um diese Qualität zu erreichen. Resampler können jedoch geringe Mengen von Passbandwellen und Aliasing des harmonischen Rauschens verursachen und zu einem hohen Frequenzverlust im Übergangsband führen. Daher sollten sie nicht unnötig verwendet werden.

Best Practices für Stichproben und Resampling

In diesem Abschnitt werden einige Best Practices beschrieben, mit denen Sie Probleme mit Stichprobenraten vermeiden können.

Abtastrate für das Gerät auswählen

Im Allgemeinen ist es am besten, die für das Gerät geeignete Abtastrate zu wählen, in der Regel 44,1 kHz oder 48 kHz. Die Verwendung einer Abtastrate von mehr als 48 kHz führt in der Regel zu einer geringeren Qualität, da für die Wiedergabe der Datei ein Resampler verwendet werden muss.

Einfache Resampling-Verhältnisse verwenden (feste vs. interpolierte Polyphasen)

Der Resampler kann in einem der folgenden Modi ausgeführt werden:

  • Fester Polyphasenmodus. Die Filterkoeffizienten für jede Polyphase werden vorausberechnet.
  • Interpolierter Polyphasenmodus. Die Filterkoeffizienten für jede Polyphase müssen von den nächsten beiden vorab berechneten Polyphasen interpoliert werden.

Der Resampler ist im festen Polyphasenmodus am schnellsten, wenn das Verhältnis der Eingaberate zur Ausgaberate L/M (unter Verwendung des größten gemeinsamen Teilers) M kleiner als 256 ist. Beispiel: Für eine Conversion von 44.100 bis 48.000 gilt L = 147, M = 160.

Im Modus mit fester Polyphase ist die Abtastrate gesperrt und ändert sich nicht. Im interpolierten Polyphasenmodus ist die Abtastrate eine ungefähre Angabe. Beim Abspielen auf einem 48-kHz-Gerät beträgt die Abtastraten-Drift in der Regel ein Sample über mehrere Stunden. Dies ist in der Regel kein Problem, da der Näherungsfehler viel geringer ist als der Frequenzfehler, der durch interne Quarzoszillatoren, Wärmedrift oder Jitter (normalerweise mehrere zehn ppm) verursacht wird.

Wählen Sie für die Wiedergabe auf einem Gerät mit 48 kHz einfache Abtastraten wie 24 kHz (1:2) und 32 kHz (2:3) aus, auch wenn andere Abtastraten und -verhältnisse über AudioTrack zulässig sein können.

Zum Ändern von Abtastraten Upsampling statt Downsampling verwenden

Abtastraten können spontan geändert werden. Der Detaillierungsgrad solcher Änderungen basiert auf der internen Pufferung (in der Regel einige hundert Stichproben) und nicht auf Basis einzelner Stichproben. Dies kann für Effekte verwendet werden.

Ändern Sie die Abtastraten beim Downsampling nicht dynamisch. Wenn Sie die Abtastraten nach der Erstellung eines Audiotracks ändern, können Unterschiede von etwa 5 bis 10 % gegenüber der ursprünglichen Rate beim Downsampling eine Neuberechnung des Filters auslösen, um das Aliasing korrekt zu unterdrücken. Dies kann Rechenressourcen verbrauchen und einen akustischen Klick auslösen, wenn der Filter in Echtzeit ersetzt wird.

Reduzieren Sie das Downsampling auf maximal 6:1.

Das Downsampling wird in der Regel durch Anforderungen an Hardwaregeräte ausgelöst. Wenn der Abtastratenkonverter für das Downsampling verwendet wird, versuchen Sie, das Downsampling-Verhältnis für eine gute Aliasing-Unterdrückung auf maximal 6:1 zu begrenzen (z. B. nicht größer als 48.000 bis 8.000). Die Filterlängen werden an das Downsampling-Verhältnis angepasst. Bei höheren Downsampling-Verhältnissen aber mehr Übergangsbandbreite reduzieren, um eine übermäßige Erhöhung der Filterlänge zu vermeiden. Beim Upsampling gibt es keine ähnlichen Aliasing-Probleme. Beachten Sie, dass einige Teile der Audiopipeline ein Downsampling von mehr als 2:1 verhindern können.

Wenn Sie Bedenken in Bezug auf die Latenz haben, führen Sie keine erneute Stichprobenerhebung durch.

Resampling verhindert, dass der Track im FastMixer-Pfad platziert wird. Dies bedeutet, dass aufgrund des zusätzlichen, größeren Puffers im gewöhnlichen Mixer-Pfad eine deutlich höhere Latenz auftritt. Außerdem gibt es eine implizite Verzögerung hinsichtlich der Filterlänge des Resamplers, die jedoch in der Regel im Bereich von einer Millisekunde oder weniger liegt, was nicht so groß ist wie die zusätzliche Zwischenspeicherung für den normalen Mixer-Pfad (in der Regel 20 Millisekunden).

Gleitkomma-Audio verwenden

Die Verwendung von Gleitkommazahlen zur Darstellung von Audiodaten kann die Audioqualität in Hochleistungs-Audioanwendungen erheblich verbessern. Ein Gleitkommawert bietet folgende Vorteile:

  • Breiterer Dynamikumfang
  • Konsistente Genauigkeit über den gesamten dynamischen Bereich hinweg.
  • Mehr Toleranzbereich, um Probleme bei Zwischenberechnungen und Transienten zu vermeiden.

Gleitkommawerte können zwar die Audioqualität verbessern, haben aber bestimmte Nachteile:

  • Gleitkommazahlen benötigen mehr Arbeitsspeicher.
  • Bei Gleitkommavorgängen werden unerwartete Eigenschaften verwendet, beispielsweise ist das Hinzufügen nicht assoziativ.
  • Bei Gleitkommaberechnungen kann die arithmetische Genauigkeit aufgrund von Rundungen oder numerisch instabilen Algorithmen verloren gehen.
  • Die effektive Verwendung von Gleitkommazahlen erfordert ein besseres Verständnis, um genaue und reproduzierbare Ergebnisse zu erzielen.

Früher war Gleitkommazahl bekannt, weil es nicht verfügbar oder langsam war. Dies gilt weiterhin für Low-End- und eingebettete Prozessoren. Prozessoren auf modernen Mobilgeräten haben jetzt jedoch Hardware-Gleitkommazahlen mit einer Leistung, die ähnlich (oder in einigen Fällen sogar noch schneller) als Ganzzahl ist. Moderne CPUs unterstützen auch SIMD (einzelne Anweisung, mehrere Daten), wodurch die Leistung weiter verbessert werden kann.

Best Practices für Gleitkomma-Audioinhalte

Mit den folgenden Best Practices können Sie Probleme mit Gleitkommaberechnungen vermeiden:

  • Verwenden Sie Gleitkommawerte mit doppelter Genauigkeit für seltene Berechnungen, z. B. für die Berechnung von Filterkoeffizienten.
  • Achten Sie auf die Reihenfolge der Vorgänge.
  • Deklarieren Sie explizite Variablen für Zwischenwerte.
  • Verwenden Sie freizügige Klammern.
  • Wenn Sie ein NaN- oder unendliches Ergebnis erhalten, verwenden Sie die binäre Suche, um herauszufinden, wo sie eingeführt wurde.

Bei Gleitkomma-Audiodaten wird die Audioformatcodierung AudioFormat.ENCODING_PCM_FLOAT ähnlich wie ENCODING_PCM_16_BIT oder ENCODING_PCM_8_BIT verwendet, um AudioTrack-Datenformate anzugeben. Die entsprechende überlastete Methode AudioTrack.write() verwendet ein Gleitkommazahl-Array, um Daten zu liefern.

Kotlin

fun write(
        audioData: FloatArray,
        offsetInFloats: Int,
        sizeInFloats: Int,
        writeMode: Int
): Int

Java

public int write(float[] audioData,
        int offsetInFloats,
        int sizeInFloats,
        int writeMode)

Weitere Informationen

In diesem Abschnitt finden Sie einige zusätzliche Ressourcen zu Stichproben und Gleitkommazahlen.

Abtastung

Abtastraten

Resampling

Die Kontroverse bezüglich hoher Bittiefe und hoher kHz

Gleitkommawert

Die folgenden Wikipedia-Seiten sind hilfreich für das Verständnis von Gleitkomma-Audio:

Der folgende Artikel enthält Informationen zu den Aspekten von Gleitkommazahlen, die direkte Auswirkungen auf die Designer von Computersystemen haben: