Kleinesfilmröllchen/Quite OK Audio Format
Dateiendung: .qoa
Magische Zahl: qoaf
Entwickelt von: Dominic Szablewski
Erstveröffentlichung: 2. Februar 2023
Aktuelle Version 1.0
(2023-04-24)
Art: Audio
https://qoaformat.org/

Das Quite OK Audio Format (QOA, englisch: Audioformat, das ganz okay ist) ist ein freier Audiocodec zur verlustbehafteten Kompression von Audiodaten. Er wurde 2023 von Dominic Szablewski veröffentlicht. QOA zeichnet sich im Vergleich zu üblichen Formaten wie MP3, AAC und Opus durch eine geringere Qualität, aber wesentlich verringerte Dekodierkomplexität und erhöhte Streambarkeit aus. QOA ist auf die Kompression von Audio in Computerspielen ausgelegt.[1]

Geschichte

Bearbeiten

QOA wurde von Dominic Szablewski, dem Erfinder des Quite OK Image Formats, im Februar 2023 erstmals veröffentlicht.[1] Die Referenzimplementierung[2] ist in C geschrieben und umfasst etwa 600 Zeilen.

Am 17. März 2023[3] veröffentlichte Szablewski einen ersten Entwurf der Spezifikation[4], die in den folgenden Wochen mehrfach überarbeitet wurde. Die Spezifikation wurde schließlich am 24. April veröffentlicht.[5]

Vor und nach der Veröffentlichung des Formats zeigten sich in Randfällen mehrere Probleme mit der Audioqualität. In einer frühen Version des Formats wurden die LMS-Filterdaten (für eine genauere Beschreibung siehe unten) quantisiert in je 8 bit gespeichert, was zu hörbaren Klicks führte.[6] Dieser Quantisierungsschritt wurde daher aufgegeben. In anderen Fällen ergeben sich extreme LMS-Filterparameter, die dann entweder zu unterdefiniertem Verhalten (Bitverschiebung auf negativen Zahlen) oder arithmetischem Überlauf führen, es scheint sich dabei allerdings um ein Problem der vom Format unabhängigen Enkodierverfahren zu handeln.[7]

Eigenschaften

Bearbeiten

Das QOA-Format umfasst gleichzeitig den Codec und das Dateiformat, zwischen denen nicht wesentlich unterschieden wird. QOA ist verlustbehaftet, d. h. bei der Kompression gehen Informationen verloren. Die Kompressionsartefakte äußern sich bei QOA in Form gleichmäßigen Hintergrundrauschens, d.h. Weißen Rauschens. Für Audiodaten im CD-Format, also 44,1 kHz Stereo, weist QOA eine Bitrate von etwa 278 kbit/s auf. Die Kompressionsrate beträgt unabhängig von der Samplerate etwa 3,2 bits pro Sample[1], was einer fünffachen Kompression entspricht. Aufgrund der Formatierung des Datenstroms ergibt sich eine minimale Dekodierlatenz von 20 Samples, was eine hohe Streambarkeit bedeutet.

QOA unterstützt nur ein einziges Sampleformat: 16-bit Ganzzahlen. Theoretisch sind bis zu 255 Audiokanäle möglich, wobei eine Implementierung mindestens 8 unterstützen muss und die Kanalanordnung für 1-8 Kanäle von FLAC übernommen wird. Die unterstützten Sampleraten reichen von 1 Hz bis 16,7 MHz.

Bei QOA kann zwischen statischen Dateien (Samplezahl positiv) und streaming (Samplezahl 0, d.h. unbekannt) unterschieden werden. Für statische Dateien ist das Ändern der beiden wählbaren Audioparameter (Kanalzahl und Samplerate) innerhalb einer Datei nicht erlaubt, für Datenströme allerdings schon. Die Referenzimplementierung kann mit solchen Datenströmen nicht umgehen.

QOA ist nicht in der Lage, Metadaten der Audiodatei zu speichern, abgesehen von den Informationen, die für die Wiedergabe notwendig sind.

Zur Kompression der Audiodaten arbeitet QOA, anders als der große Teil aller verlustbehafteten Formate, nicht in der Frequenzdomäne, d. h. es wird keine Frequenztransformation der Audiodaten durchgeführt. Stattdessen nutzt QOA ein adaptives FIR-Filter, welches spätere Samples als gewichtete Summe früherer Samples vorhersagt und die Gewichtungen nach jedem Dekodier- bzw. Enkodierschritt anpasst. Die Residuen werden quantisiert, d. h. mit Informationsverlust, gespeichert; es findet keine Entropiekodierung statt. Die Ermittlung des Quantisierungsparameters, der scale factor genannt wird, erfolgt mittels der Methode der kleinsten Quadrate, d.h. der quadratisch kleinste durchschnittliche Fehler bestimmt, welcher Parameter gewählt wird. Dementsprechend nennt QOA sein Kompressionsverfahren Least Mean Squares (LMS).

Das Dateiformat beginnt mit einem kurzen Header, der lediglich die magische Zahl „qoaf“ und die Gesamtzahl der Samples (64 bit) enthält. Diese sowie alle Daten in QOA sind in Big-endian-Reihenfolge gespeichert, und die allermeisten Daten liegen in 64-bit-Blöcken vor.

Den Hauptteil des Formats bilden die Frames, welche meist 5120 Samples pro Kanal enthalten. Diese Zahl bildet sich dadurch, dass ein Frame aus 256 Slices besteht, und jeder Slice 20 Samples innerhalb von 64 bit enthält. Die einzige Ausnahme bildet der letzte Frame einer Datei, welcher weniger Slices enthalten kann, aber Slices selbst können nicht verkürzt werden.

Der Frame-Header hat die folgende Form:

Frame-Header
Byte 0 13 45 67
Kanalzahl Samplerate (Hz) Anzahl der Samples (pro Kanal) in diesem Frame Framegröße in Bytes einschließlich des Headers

Auf den Frame-Header folgt der Initialzustand der LMS-Filter. Jeder Kanal hat sein eigenes, unabhängiges Filter der Ordnung 4, deren vorherige Samples und Gewichtungen in 16-bit-Ganzzahlen gespeichert werden:

LMS-Zustand (1 pro Kanal)
Byte 01 23 45 67 89 1011 1213 1415
               

Während der Kodierung und Dekodierung sollten wesentlich größere Ganzzahlformate verwendet werden, um Probleme wie arithmetischen Überlauf zu vermeiden.

Darauf folgen Slices; die Anzahl der Slices lässt sich aus der Anzahl der Samples berechnen. Die Slices sind für bessere Streambarkeit kanalweise verschachtelt, zum Beispiel folgt in einem Stereo-Frame auf den dritten Slice des ersten Kanals der dritte Slice des zweiten Kanals.

Ein Slice hat die folgende grobe Form (Bits vom MSB zum LSB gezählt, d. h. erstes bis letztes Bit):

Slice (64 bit)
Bit 63–60 59–57 56-54 ... 2–0
scale factor Residuum 0 Residuum 1 Residuen 2-18 Residuum 19

Dementsprechend hat der Skalierungsfaktor 4 bit und alle Residuen 3 bit. All diese Werte werden mit festen Formeln in nützlichere Werte umgerechnet. Beispielsweise wird der Skalierungsfaktor als   berechnet, wobei   der 4-Bit-Wert aus dem Slice ist. In der Praxis werden für die Umrechnungen feste Lookup-Tabellen[8] definiert.

In jedem Enkodierschritt wird pro Sample der folgende Prozess durchlaufen:

sample = x[i]
predicted = lmsState.predict() # Wird auch vom Dekodierer durchgeführt
residual = sample - predicted
# Spezielle Divisionsfunktion, siehe unten
scaled = residual / scalefactor
clamped = scaled.clamp(-8, 8)
quantized = quantizationTable[clamped]

# Die folgenden zwei Berechnungsschritte werden auch genauso vom Dekodierer durchgeführt
dequantized = dequantizationTable[scalefactor][quantized]
reconstructed = (predicted + dequantized).clamp(-32768, 32767)

error = sample - reconstructed
lmsState.update(reconstructed, dequantized)
storeInSlice(quantized)

Dabei wird entsprechend dem Enkodierfehler der optimale Skalierungsfaktor gewählt.

Um Hardwaredivisionen zu vermeiden, benutzt QOA eine spezielle Divisionsfunktion, die ebenso wie andere Umrechnungen mit Lookup-Tabellen und Bitverschiebungen auskommt.

Die Vorhersage des nächsten Samples geschieht entsprechend einem üblichen FIR-Filter, d.h.

 

Die Aktualisierung des Filters hat zum Ziel, das Residuum zu minimieren:

function lmsState.update(reconstructed, dequantized):
    delta = dequantized >> 4
    for i from 1 to 4:
        lmsState.w(i) += if lmsState.y(k-i) < 0 then -delta else delta

Die   werden mit den rekonstruierten Samples aktualisiert, wobei das Filter eben nur die letzten 4 Samples speichern muss.

Implementierung und Verbreitung

Bearbeiten

Neben der Referenzimplementierung, die in etwa 700 Zeilen C geschrieben ist[2], existieren wenige Alternativimplementierungen, unter anderem für JavaScript, C#, R und SerenityOS.

QOA wird aktuell (Stand August 2023) von keinem verbreiteten Abspielprogramm unterstützt.

Einzelnachweise

Bearbeiten
  1. a b c Time Domain Audio Compression at 3.2 bits per Sample. Abgerufen am 25. Februar 2023.
  2. a b Dominic Szablewski: QOA - The “Quite OK Audio Format” for fast, lossy audio compression. 23. Februar 2023, abgerufen am 25. Februar 2023.
  3. Specification Draft · Issue #18 · phoboslab/qoa. Abgerufen am 6. April 2023 (englisch).
  4. Dominic Szablewski: THE QUITE OK AUDIO FORMAT Specification Draft 0.1. In: qoaformat.org. 17. März 2023, abgerufen am 6. April 2023 (englisch).
  5. Dominic Szablewski: The Quite OK Audio Format Specification Version 1.0. 24. April 2023 (qoaformat.org [PDF; 24 kB]).
  6. Nice, but if 24_tuba_arpegio_melodious_phrase_stereo on the samples page is not ... | Hacker News. 2. Februar 2023, abgerufen am 8. August 2023.
  7. Some audio data seems to trigger a bug in the encoder/decoder · Issue #25 · phoboslab/qoa. Abgerufen am 8. August 2023 (englisch).
  8. Dominic Szablewski: QOA - qoa.h. 5. April 2023, abgerufen am 6. April 2023.