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.