Wann sollte man beim Synthetisieren und Verarbeiten von Audio auf modernen Prozessoren etwas anderes als Gleitkomma mit einfacher Genauigkeit (32 Bit) verwenden? Offensichtlich ist das Audio, das in die reale Welt ein- und ausgeht, 16/24 Bit, also spreche ich nur über die Präzision der Signale (sowohl das Audio selbst als auch Dinge wie Filterkoeffizienten) in der Software.
Annehmen, dass:
- Die CPU / DSP bietet Hardware-Gleitkomma-Unterstützung für einfache und doppelte Genauigkeit
- Die Priorität ist Audioqualität, nicht hohe Leistung. Zum Beispiel würde doppelte Präzision in Betracht gezogen, wenn sie eine bessere (Wahrnehmungs-) Qualität bietet.
quelle
Es hängt wirklich davon ab, über welche Art von Unterstützung Sie sprechen. Unter x86 erhalten Sie bei Verwendung der Gleitkommaanweisungen im x87-Stil die volle interne Genauigkeit von 80 Bit und die gleiche Verarbeitungszeit - unabhängig davon, ob Sie mit einfacher oder doppelter Genauigkeit arbeiten.
Wenn Sie jedoch die SIMD-Anweisungen verwenden, können Sie mit 32-Bit-Floats doppelt so viel Arbeit erledigen wie mit 64-Bit-Floats. Das ist eine große Sache.
Eine andere zu berücksichtigende Sache ist der Speicher - durch doppelte Genauigkeit wird die Datenmenge, die in die schnellsten Ebenen des Cache-Speichers passt, durch zwei geteilt.
Es kommt darauf an, welche Art von Synthese und Verarbeitung Sie durchführen. Wenn es sich um IIR-Filter handelt (oder allgemein um irgendetwas mit Zustandsvariablen und / oder Rückkopplung), können Sie sich mit 32-Bit leichter in den Fuß schießen (Instabilitäten oder Ungenauigkeiten mit niedrigem Cutoff aufgrund von Koeffizientenabschneidung), wenn Sie dies nicht tun Denken Sie zu viel darüber nach, was Sie tun. Einige Filtertopologien funktionieren einwandfrei mit 32-Bit.
In jedem Fall handelt es sich um ein numerisches Präzisionsproblem - in Bezug auf die Qualität gibt es keinen Wahrnehmungsunterschied. Denken Sie daran, dass es ziemlich lächerlich ist, von einer Hardware-Audiokette eine Genauigkeit von mehr als 20 Bit zu erwarten (vorausgesetzt, die Platine ist einwandfrei geroutet und alle Teile sind ideal, stoßen wir immer noch an die Grenze des Johnson-Rauschens!) - und Diese Präzision wird weitgehend durch Schwimmer mit einfacher Genauigkeit abgedeckt. Der Signalpfad auf einem High-End-Mischpult verfügt über 50 Operationsverstärker, die einzeln mehrere Größenordnungen stärker verzerrt sind als das Quantisierungsrauschen von arithmetischen Operationen auf Floats mit einfacher Genauigkeit.
quelle
Sie müssen die numerischen Anforderungen Ihres Algorithmus kennen und die Genauigkeit entsprechend auswählen.
Lassen Sie uns hier also rechnen: Ein 32-Bit-Gleitkomma hat eine 24-Bit-Mantisse und einen 8-Bit-Exponenten. Dies ergibt ein Signal-Rausch-Verhältnis von ca. 150 dB über einen Dynamikbereich von ca. 1540 dB. Das ist genug für die meisten Audio-Dinge. Doppelte Präzision gibt Ihnen ungefähr doppelt so viel.
Jeder Algorithmus hat bestimmte Anforderungen an die numerische Genauigkeit. Wenn alle Audioalgorithmen, die ich kenne, richtig entworfen wurden, funktionieren sie mit 32-Bit-Gleitkomma nur einwandfrei. "richtig gestaltet" ist hier das Schlüsselwort. Beispielsweise weist ein Bandpass 6. Ordnung von 40 bis 200 Hz, der bei 44,1 kHz abgetastet wird und als direktes II IIR-Bi-Quad-Filter implementiert ist, tatsächlich einige Rauschprobleme bei 32 Bit auf. Es funktioniert jedoch einwandfrei als transponiertes Form II- oder direktes Form I-Filter.
Wenn Sie versuchen, eine Teilfraktion des gleichen Bandpassfilters teilweise mit der Residuez () -Funktion von Matlab zu erweitern, erhalten Sie selbst bei doppelter Genauigkeit schlechte Ergebnisse. Wiederum übersteigen die numerischen Anforderungen des Algorithmus für diese spezifischen Eingabedaten das, was doppelte Genauigkeit zu bieten hat. Der Schlüssel zur Behebung dieses Problems besteht nicht darin, die Genauigkeit blind zu erhöhen, sondern stattdessen einen besseren Algorithmus zu verwenden.
Schauen wir uns zum Schluss an, was Floating (32 Bit oder 64 Bit) anfällig macht: Sie haben einen enormen Dynamikbereich, dh Sie können das Signal um 200 dB verkleinern, um 500 dB verstärken, erneut um 300 dB reduzieren und landen genau dort, wo Sie begonnen haben mit fast keinem Präzisionsverlust. Das ist es also nicht. Gleitkomma hat Probleme beim Hinzufügen von Zahlen, die sich in ihrer Größe stark unterscheiden. Es gibt einen Punkt, an dem das Hinzufügen einer kleinen Zahl keinen Unterschied macht, dh Sie erhalten 1 + dx = 1. Diese Zahl "dx" beträgt ungefähr 1,2e-7 für 32-Bit-Gleitkomma und 2,2e-16 für 64-Bit. Wenn Ihr Algorithmus das Addieren oder Subtrahieren von Zahlen umfasst, deren Größe so weit voneinander entfernt ist, können Probleme auftreten.
Ein gutes Beispiel hierfür ist der bereits erwähnte Direct Form II-Filter: Der Direct From II-Filter (siehe z. B. https://ccrma.stanford.edu/~jos/fp/Direct_Form_II.html) ) berechnet die Statusvariablen im Wesentlichen durch Filtern der Eingabe zuerst mit der Nur-Pol-Übertragungsfunktion und dann mit den Nullen filtern, um den Ausgang zu erzeugen. Wenn sich die Pole nun in der Nähe des Einheitskreises befinden, wird die Nur-Pol-Übertragungsfunktion sehr, sehr groß. Die Zustandsvariable kann also viel größer sein als der Eingang (80 dB bis 100 dB größer), und das Summieren von Zustandsvariablen mit dem Eingang erzeugt viel Rauschen.
Die Lösung besteht darin, zu einem transponierten Form II- oder direkten Form I-Filter zu wechseln. Die Analyse zeigt, dass die Zustandsvariablen nicht größer als die Eingabe / Ausgabe sein können, dann vielleicht 12 dB oder so, so dass die Fehlanpassung der Problemgröße überhaupt nicht auftritt.
quelle
Die doppelte Genauigkeit gegenüber der einfachen Genauigkeit bietet zwei Vorteile: größere Reichweite und bessere Auflösung. Ich wäre sehr überrascht, wenn die vergrößerte Reichweite einen Unterschied in Ihrer Anwendung bewirken würde. Wenn dies der Fall ist, stimmt wahrscheinlich etwas mit Ihrer Skalierung nicht.
Wenn es eine Verbesserung gibt, wäre es in der Auflösung. Bessere Auflösung bedeutet weniger Quantisierungsrauschen . Wenn das Quantisierungsrauschen nicht in der Nähe des gleichen Pegels wie alle anderen Rauschquellen liegt, wird es wahrscheinlich keinen Unterschied machen. Sie können einige Analysen Ihres Rauschens und Signalpegels durchführen, um eine Vorstellung davon zu erhalten, wie viel des Rauschens durch Quantisierungsfehler verursacht wird. Sie werden jedoch nicht genau wissen, ob es einen Unterschied macht oder nicht, bis Sie es mit beiden und implementieren sehen, ob es einen Unterschied macht.
quelle
Wenn Sie mit synthetisiertem Audio arbeiten, das zwischen Generierung und Rendering viel verarbeitet wird (Konvertierung in 16/24-Bit-Ganzzahl), profitieren Sie von der Arbeit mit der besten numerischen Präzision, die Ihre Maschine hat.
Es ist auch wichtig, eine grundlegende Unterscheidung zwischen ganzen Zahlen und Gleitkommazahlen zu treffen. Ein Gleitkomma mit doppelter Genauigkeit (64 Bit) unterscheidet sich von einer 64-Bit-Ganzzahl. Abhängig von den von Ihnen verwendeten Softwaretools können Sie in der Software sogar mit Ganzzahlen mit beliebiger Genauigkeit arbeiten. Das wäre wichtig, wenn Sie Sounds aufnehmen müssten, anstatt sie zu generieren (soweit ich weiß, speichert die AD-Konvertierung gesampelte Sounds immer im Integer-Format).
Ich kann mir nicht ganz sicher sein, aber wenn Sie Ihren Sound bereits im Gleitkomma erzeugen, sind die häufigsten Artefakte per Definition höchstwahrscheinlich nicht vorhanden, und Sie können ihn mit viel mehr "Audioqualität" verarbeiten. Vielleicht können Sie die Sound-Samples sogar erst erzeugen, nachdem Sie bereits einige Effekte auf den Generator selbst angewendet haben. Der einzige Moment, in dem Sie tatsächlich potenzielle Artefakte einführen, ist die Konvertierung für die Ausgabe in ein ganzzahliges Dateiformat, z. B. .WAV.
Da die meisten Maschinen heutzutage eine native "doppelte" Genauigkeit (64 Bit) haben, sehe ich keinen Grund mehr, mit 32 Bit zu arbeiten ...
Ich hoffe, das hilft!
quelle