Grenzwerte sinc(x) bei float, bzw. double
-
Das bringt dir doch nicht magisch mehr signifikante Stellen. Du hast beispielsweise (wir tun mal so, als wären Fließkommazahlen in Radix 10 gespeichert)
x = 1234567890123.456 fmod(x, 1.) = 0.4560000000000000
Das ist natürlich in der Praxis binär und sieht nur in Binärdarstellung so aus, aber alles, was hier nach der dritten Nachkommastelle kommt, ist auch nach fmod reiner Zufall.
Wenn du x vorher in der Berechnung klein halten kannst, dann mag das was anderes sein, aber das kann ich dir ohne Kenntnis der Materie natürlich nicht sagen.
-
PhilippHToner schrieb:
Ich hatte halt gedacht, wenn der sin(a) zuerst zu fehleranfällig wird, rechne ich halt mit sin( fmod(a, 2*M_PI)). Somit ist die math. Reihe doch genauer?
Das Problem ist aber (auch), wie genau der Ursprungswert ist. Die Fließkommazahlen liegen bei großen Zahlen immer weiter auseinander. Wenn das a nur noch auf +-10 genau ist, dann nützt dir auch ein fmod nichts.
-
Erstmal eine Frage: Ist das Umtastverhätnis konstant?
Außerdem: Was Du vorhast, mag in der Theorie ganz toll klingen, praktisch wird da aber kein Nutzwert drin liegen. Du solltest Deine Filterordnung sinnvoll den Anforderungen entsprechend begrenzen. Der Ansatz "Viel hilft viel" ist hier nicht sinnvoll. Auch sehr hohe Ordnungen verhindern nicht, dass Du Dir bei jeder Faltung neben Deinem SI auch noch ein Rechteck mit in Dein Signal faltest. Selbst mit Ordnungen im Bereich von 10000 und mit double-Präzision wirst Du kaum mehr als 30 dB Sperrdämpfung erreichen. Vom Rechenaufwand pro Sample rede ich mal gar nciht erst. Fensterfunktionen oder andere Designmethoden sind hier eher das Mittel der Wahl.
-
Okay, das stimmt natürlich auch wieder.
Ich habe ja jetzt das, was ich wollte. Ich fenstere sinc. Je nach Belieben kann man die Breite des Fensters anpassen. Diese wird beim der Faltung berücksichtigt, sodass keine unnötigen Operationen ausgeführt werden. Höhere Genauigkeiten sind aufgrund der vorhandenen Daten eh nicht möglich.Die Optimierung daher:
Die Berechnungszeit von 1sec*192000Samples/s auf 1sec*44100Samples/s ohne Optimierung(keinere Fensterung, keine Threads, kein Sinc-Table) würde auf meinem Rechner pro 1 Sample von den 44,1k Samples ~2sec brauchen. Das wären 44100*2 sec = 1 Tag.Deshalb implementiere ist das massivparallel mit OpenCL. Neben der diskreten Implementierung werde ich das Ganze auch für die spektrale Seite implementieren, denn eine Faltung im Ortsbereich ist eine Multiplikation im Frequenzbereich.
-
Tachyon schrieb:
Erstmal eine Frage: Ist das Umtastverhätnis konstant?
Also ich taste nicht wie in dem ersten Beispiel von x kHz nach x kHz ab, weil ich mir das sonst sparen könnte. Es sind die gängigen Raten aus der Audiowelt denkbar:
48kHz Studioqualität => 44,1kHz Audio-CD.
-
PhilippHToner schrieb:
Okay, das stimmt natürlich auch wieder.
Ich habe ja jetzt das, was ich wollte. Ich fenstere sinc. Je nach Belieben kann man die Breite des Fensters anpassen. Diese wird beim der Faltung berücksichtigt, sodass keine unnötigen Operationen ausgeführt werden. Höhere Genauigkeiten sind aufgrund der vorhandenen Daten eh nicht möglich.Die Optimierung daher:
Die Berechnungszeit von 1sec*192000Samples/s auf 1sec*44100Samples/s ohne Optimierung(keinere Fensterung, keine Threads, kein Sinc-Table) würde auf meinem Rechner pro 1 Sample von den 44,1k Samples ~2sec brauchen. Das wären 44100*2 sec = 1 Tag.Deshalb implementiere ist das massivparallel mit OpenCL. Neben der diskreten Implementierung werde ich das Ganze auch für die spektrale Seite implementieren, denn eine Faltung im Ortsbereich ist eine Multiplikation im Frequenzbereich.
Hmm, eigentlich ist sowas ohne Optimierungen in vielfacher Echtzeit möglich.
Ich arbeite hier mit einem adaptiven Umtastfilter (das Umtastverhätnis ist Zeitvariant), und das Ding braucht um von 6kHz-50kHz variabel auf 44,1 kHz Fix zu kommen auf relativ alter Hardware (Pentium M, 1.8 GHz) ca. 3% CPU. Und Artefakte sind hier selbst mit schwachsinnig hoch aufgelösten Spektralschätzern nicht zu finden.Was Du da tust ist aus meiner Sicht ist völlig unpraktikabel. Was willst Du erreichen?
-
Ich habe schon etliche Mal von Tonstudiogurus gehört, dass man die Finger von den billigen Echtzeit-Resamplern lassen soll und ich kann akustisch bestätigen, dass der Resampler von Cubase 5 von 48kHz auf 44,1kHz Artefakte produziert und diese hörbar sind. Zu jedem Bassdrumkick in dem Song bekomme ich eine hohe Pfeiffrequenz, die ich im Studio ohne resampling nicht bekomme.
Jetzt ist die Frage: Ist der Resampler billig-Software oder ist echtzeit-resampling einfach viel ungenauer als post-resampling?
-
Mal ne doofe Frage nebenbei: macht es überhaupt Sinn Audio-Daten mit einem sinc Kernel zu resampeln?
Das müsste doch zu massivem Ringing führen.Ich hatte eigentlich den Eindruck, dass bei Audio eher Filter mit weniger steiler Flanke verwendet werden.
-
PhilippHToner schrieb:
Ich hatte halt gedacht, wenn der sin(a) zuerst zu fehleranfällig wird, rechne ich halt mit sin( fmod(a, 2*M_PI)). Somit ist die math. Reihe doch genauer?
Wenn, dann bitte so: sin(fmod(x,2)*M_PI)
Mit steigendem x wird aber trotzdem die Genauigkeit von fmod(x,2) zunehmend schlechter; denn der absolute Fehler von x bleibt bei fmod(x,2) ungefähr erhalten.
Ich verstehe, dass es Dir um eine "möglichst fehlerfreie" Bandbeschränkung geht. Das Wort "fehlerfrei" ist aber schon unglücklich gewählt in diesem Kontext. Die Länge des "optimalen" Faltungskerns ist ein Zielkonflikt zwischen
- steiler Flanke im Spektrum
- kurzen "Ringing" in der Zeitdomäne.
- hoher "stopband rejection" (Stärke der Dämpfung im Frequenzband, was man rausfiltern will)
In der Praxis sollte man einfach genug "headroom" im begrenzten Spektrum haben. Das heißt, man wählt eine Abtastrate, die meinetwegen 2,5 mal so hoch ist wie die höchste Frequenz die einen noch interessiert (statt 2,0+epsilon). Und dieser "headroom" erlaubt es dir, Tiefpassfilter mit kurzer Impulsantwort und dementsprechend einer flacheren Flanke zu nutzen.
Wenn man z.B. ein digitales Audiosignal von 96 kHz zu 44.1 kHz konvertiert, würde man einen Tiefpassfilter mit einem Passband bis 20 kHz und einer Flanke zwische 20-22.05 kHz nehmen. Länge und Art des optimalen Fensters hängt ein bißchen davon ab, was Du genau machen willst. Im Audiobereich sollte man bei Filtern mit einer Sperrdämpfung von mit mindestens 100 dB arbeiten. => Kaiser-Fenster mit entsprechendem Parameter.
Rezept zur Fensterfindung:
- sich überlegen, was für eine "stopband rejection" man braucht und sich dementsprechend ein Fenster raussuchen, was dies bietet.
- entsprechende Fensterlänge in Abhängigkeit der gewünschten Flankensteilheit wählen, Fensterlänge und Flankenbreite sind umgekehrt proportional zueinander
Super finde ich die Übersicht bei Wikipedia:
http://en.wikipedia.org/wiki/Window_functionEdit: Wieder etwas gelernt: stopband rejection nennt man im Deutschen Sperrdämpfung. Danke Tachyon!
-
PhilippHToner schrieb:
Ich habe schon etliche Mal von Tonstudiogurus gehört, dass man die Finger von den billigen Echtzeit-Resamplern lassen soll und ich kann akustisch bestätigen, dass der Resampler von Cubase 5 von 48kHz auf 44,1kHz Artefakte produziert und diese hörbar sind. Zu jedem Bassdrumkick in dem Song bekomme ich eine hohe Pfeiffrequenz, die ich im Studio ohne resampling nicht bekomme.
Jetzt ist die Frage: Ist der Resampler billig-Software oder ist echtzeit-resampling einfach viel ungenauer als post-resampling?
Das ist keine Billigsoftware, sondern ein selbstgeschriebener Algorithmus für HiFi-Audiostreaming für eine Kundengruppe die hier recht hohe Anforderungen hat. Preislich dürfte die Zielsysteme deutlich über professionellen Tontechniksystemen liegen.
-
krümelkacker schrieb:
Wenn man z.B. ein digitales Audiosignal von 96 kHz zu 44.1 kHz konvertiert, würde man einen Tiefpassfilter mit einem Passband bis 20 kHz und einer Flanke zwische 20-22.05 kHz nehmen. Länge und Art des optimalen Fensters hängt ein bißchen davon ab, was Du genau machen willst. Im Audiobereich sollte man bei Filtern mit einem Stopband mit mindestens 100 dB arbeiten. => Kaiser-Fenster mit entsprechendem Parameter.
Jo, das ist sinnvoll. Wobei sich die Fensterlänge aus dem gewünschten Transitionsband und der gewünschten Sperrdämpfung ergibt.
-
heheh, genau. Habe mein Vorgänger Post noch um ein "Rezept" ergänzt. Ich bin nur nicht mit den deutschen Fachwörtern vertraut. Ich nehme mal an, dass Sperrdämpfung das ist, was ich vorhin "stopband rejection" nannte.
-
krümelkacker schrieb:
heheh, genau. Habe mein Vorgänger Post noch um ein "Rezept" ergänzt. Ich bin nur nicht mit den deutschen Fachwörtern vertraut. Ich nehme mal an, dass Sperrdämpfung im Englischen "stopband rejection" heißt.
Das kann man 1:1 mit "stopband attenuation" übersetzen.
-
Für die von krümelkacker genannten Randbedingungen brauchst Du mit der Fenstermethode und einem Kaiser-Fenster übrigens eine Ordnung von ca. 140. Damit solltest Du dann auch "etwas" schneller umtasten können als 1 Sample/2 s.
-
Man kann sogar "wild" sein und etwas Aliasing zulassen, sofern es oberhalb von 20 kHz bleibt und "leise" ist. Dann kann man die Länge der Impulsantwort des Filters von 3 auf 2 Millisekunden drücken oder so...
-
krümelkacker schrieb:
PhilippHToner schrieb:
Ich hatte halt gedacht, wenn der sin(a) zuerst zu fehleranfällig wird, rechne ich halt mit sin( fmod(a, 2*M_PI)). Somit ist die math. Reihe doch genauer?
Wenn, dann bitte so: sin(fmod(x,2)*M_PI)
deswegen schrieb ich "a" und nicht "x", aber nebensächlich.
krümelkacker schrieb:
Mit steigendem x wird aber trotzdem die Genauigkeit von fmod(x,2) zunehmend schlechter; denn der absolute Fehler von x bleibt bei fmod(x,2) ungefähr erhalten.
Ich verstehe, dass es Dir um eine "möglichst fehlerfreie" Bandbeschränkung geht. Das Wort "fehlerfrei" ist aber schon unglücklich gewählt in diesem Kontext. Die Länge des "optimalen" Faltungskerns ist ein Zielkonflikt zwischen
- steiler Flanke im Spektrum
- kurzen "Ringing" in der Zeitdomäne.
- hoher "stopband rejection" (Stärke der Dämpfung im Frequenzband, was man rausfiltern will)
Ja, das wäre ideal aber nicht machbar xD
krümelkacker schrieb:
In der Praxis sollte man einfach genug "headroom" im begrenzten Spektrum haben. Das heißt, man wählt eine Abtastrate, die meinetwegen 2,5 mal so hoch ist wie die höchste Frequenz die einen noch interessiert (statt 2,0+epsilon). Und dieser "headroom" erlaubt es dir, Tiefpassfilter mit kurzer Impulsantwort und dementsprechend einer flacheren Flanke zu nutzen.
Wenn man z.B. ein digitales Audiosignal von 96 kHz zu 44.1 kHz konvertiert, würde man einen Tiefpassfilter mit einem Passband bis 20 kHz und einer Flanke zwische 20-22.05 kHz nehmen. Länge und Art des optimalen Fensters hängt ein bißchen davon ab, was Du genau machen willst. Im Audiobereich sollte man bei Filtern mit einer Sperrdämpfung von mit mindestens 100 dB arbeiten. => Kaiser-Fenster mit entsprechendem Parameter.
Gut das ich alle Fenster von wiki, bis auf das Kaiser-Fenster implementiert habe xD, weil das die Besselfunktion braucht, die wiederum die Gammafunktion 0. Ordnung braucht und ich nicht verstehe, wie ich die implementieren soll mit Integralen etc.. funktioniert ein Kaiser mit Big-O(1) oder muss ich das Integral wirklich iterativ berechnen?
krümelkacker schrieb:
Rezept zur Fensterfindung:
- sich überlegen, was für eine "stopband rejection" man braucht und sich dementsprechend ein Fenster raussuchen, was dies bietet.
- entsprechende Fensterlänge in Abhängigkeit der gewünschten Flankensteilheit wählen, Fensterlänge und Flankenbreite sind umgekehrt proportional zueinander
Okay, das check ich. Aber ich habe ehrlich gesagt keine Ahnung, was für Kriterien ein "guter" Resampler eingebaut bekommt.
krümelkacker schrieb:
Super finde ich die Übersicht bei Wikipedia:
http://en.wikipedia.org/wiki/Window_functionEdit: Wieder etwas gelernt: stopband rejection nennt man im Deutschen Sperrdämpfung. Danke Tachyon!
Jo an diese Fenster habe ich mich gehalten. Ich sehe schon, dass es nicht das optimale Fenster gibt, sondern ein Optimierungsproblem mit mehreren Parameter ist, die abhängig voneinander sind und gegeneinander arbeiten.
Tachyon schrieb:
Das ist keine Billigsoftware, sondern ein selbstgeschriebener Algorithmus für HiFi-Audiostreaming für eine Kundengruppe die hier recht hohe Anforderungen hat. Preislich dürfte die Zielsysteme deutlich über professionellen Tontechniksystemen liegen.
Um Gottes Willen, ich meinte damit nicht Ihre Software, sondern so die eingebauten gängigen Resampler wie in Cubase.
Tachyon schrieb:
Für die von krümelkacker genannten Randbedingungen brauchst Du mit der Fenstermethode und einem Kaiser-Fenster übrigens eine Ordnung von ca. 140. Damit solltest Du dann auch "etwas" schneller umtasten können als 1 Sample/2 s.
Ich weiß nicht mal, wie ich die 0. Ordnung bekomme, weil ich nicht weiß, ob ich das Gamma-Integral auflösen kann oder iterativ berechnen muss.
Ich finde das Gespräch gerade sehr interessant, obwohl wir jenseits von C++ gelandet sind
! Danke
-
Wir reden hier von diskreter Faltung. Da gibt es keine Integrale sondern Summen. Und da wir mit realen System arbeiten, sind die Laufindizes an den Summenzeichen typischerweise keine um 90° gedreht 8, sondern etwas sehr viel greifbareres.
Hier mal etwas Fast-Food zu den Themen:
Diskrete Faltung
FIR-FilterPhilippHToner schrieb:
Jetzt ist die Frage: Ist der Resampler billig-Software oder ist echtzeit-resampling einfach viel ungenauer als post-resampling?
Nicht direkt. Wenn aber bei einer gegebenen Qualität das Echtzeitverhalten nicht mehr gewährleistet werden kann, dann musst Du entweder die Qualität reduzieren, oder mehr Rechenleistung zur Verfügung stellen.
-
Nee, er meint die Berechnung des Kaiser-Fensters. Das ist schon ekelig. Wenn man danach googelt, findet man hier und da ein paar Polynome für Approximationen der entsprechenden Besselfunktion.
Aber Kaiser brauchst du auch nicht. Nuttall wär ja auch okay. Das ist auch viel leichter zu berechnen
http://en.wikipedia.org/wiki/Window_function#Nuttall_window.2C_continuous_first_derivativeMit Ordnung meinte Tachyon die Länge des FIR filters in Samples (ggf minus eins). Ihr redet also gerade aneinander vorbei.
-
Tachyon schrieb:
Wir reden hier von diskreter Faltung. Da gibt es keine Integrale sondern Summen. Und da wir mit realen System arbeiten, sind die Laufindizes an den Summenzeichen typischerweise keine um 90° gedreht 8, sondern etwas sehr viel greifbareres.
Hier mal etwas Fast-Food zu den Themen:
Diskrete Faltung
FIR-FilterDas Fast-Food habe ich mir schon reingefressen :-). Allerdings haben wir für den Kaiser
w_n = \left\{ \begin{matrix} \frac{I\_0\left(\pi \alpha \sqrt{1 - \left(\frac{2n}{M}-1\right)^2}\right)} {I\_0(\pi \alpha)}, & 0 \leq n \leq M \\ \\ 0 & \mbox{otherwise} \\ \end{matrix} \right.Für die Besselfunktion 0. Ordnung:
Die Gammefunktion ist:
Was darf ich für die liegende Acht denn nun eintragen? 1000? 100? oder langen 10?
-
Man muss das Rad aber auch nicht neu erfinden:
libsamplerate