Grenzwerte sinc(x) bei float, bzw. double
-
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
-
krümelkacker schrieb:
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.
Jo, da hätte ich auch drauf kommen können, dass er die Ordnung der Besselfunktion meint.
@TO:
Wenn Du keinen Bock hast, die Besselfunktion selbst zu schreiben:
Die gibt z.B. fertig in boost. Hier kannst Du das mal nachlesen. Wenn man die Besselfunktion fertig hat, ist die Berechnung der Fensterkoeffizienten ein Klacks.Edit:
Oder libsamplerate :p
-
krümelkacker schrieb:
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.
Habe ich mir fast gedacht, okay. Jetzt wenn ich mir die Grafik reinpress
http://en.wikipedia.org/wiki/File:Window_function_(comparsion).png habe ich die einzelnen Sperrbanddämpfungen. Sollte ich nicht ein Fenster nehmen, welches direkt nach 1 steil nach unten geht? Bzw. was ist die normalisierte Frequenz in dem Zusammenhang?Ich hätte schon Bock alles selber zu machen, aber es wird Bestandteil einer Bachelorarbeit und ich will nicht alles herleiten, also würde ich gerne auch den Bessel rauslassen. Ich schreibe nicht über Filterdesign, aber in meinem Bachelorarbeitbeispiel möchte ich einen Faltungshall mit VST einbauen und da wäre die Theorie ganz gut. Als kleines Beispiel davor wollte ich mir eben erst einen Resampler bauen.
Boost wäre da für mich wieder so ein großer Klotz am Bein und ich habe keine Erfahrung damit. Lieber möchte ich alles selber implementieren. Auch andere Bibliotheken sind eher tabu, weil alles von mir implementiert sein soll.
-
PhilippHToner schrieb:
reinpress
http://en.wikipedia.org/wiki/File:Window_function_(comparsion).png habe ich die einzelnen Sperrbanddämpfungen. Sollte ich nicht ein Fenster nehmen, welches direkt nach 1 steil nach unten geht? Bzw. was ist die normalisierte Frequenz in dem Zusammenhang?Die Grafik zeigt den Zusammenhang zwischen der Verminderung des Leckeffektes (verbessert die Sperrdämpfung) und der Breite des Transitionsbandes (Flanke). Wenn Du eine Fensterfunktion wählst, mit der Du eine hohe Sperrdämpfung erzielst, dann geht das, bei gleichbleibender Ordnung des Filters, auf Kosten der Breite des Transitionsbandes (das wird dann breiter wodurch Du mehr von Deiner Nutzbandbreite "verschwendest").
Das "Rechteckfenster" (also die pure Si-Funktion) hat das schmalste Transitionsband, jedoch auch die geringste Sperrdämpfung.
Willst Du bei größer werdender Sperrdämpfung das Transitionsband schmal halten, dann musst Du die Ordnung (also die Koeffizientenzahl) Deines Filters erhöhren (=mehr Rechenaufwand).
Der Trick beim Filterdesign ist es, einen guten Kompomiss zwischen Güte (=hohe Sperrdämpfung und schmales Transitionsband) und dem nötigen Rechenaufwand zu finden. Das Kaiserfenster hat den Vorteil, dass man relativ einfach eine variable Sperrdämpfung erhält. Außerdem gibt es relativ einfache, empirische Formeln, mit denen man die Filterparameter durch Vorgabe von Wunschsperrdämfpung und Transitionsbandbreite ermitteln kann.PhilippHToner schrieb:
Ich hätte schon Bock alles selber zu machen, aber es wird Bestandteil einer Bachelorarbeit und ich will nicht alles herleiten, also würde ich gerne auch den Bessel rauslassen. Ich schreibe nicht über Filterdesign, aber in meinem Bachelorarbeitbeispiel möchte ich einen Faltungshall mit VST einbauen und da wäre die Theorie ganz gut. Als kleines Beispiel davor wollte ich mir eben erst einen Resampler bauen.
Dann musst Du entweder ein einfacheres Fenster nehmen, oder selbst die Besselfunktion implementieren. Du könntest z.B. das Blackman-Nuttal-Fenster nehmen. Das ist recht einfach zu berechnen und hat für Audio-Anwendungen hinreichend gute Sperrdämpfung.
-
Ich berichtige, ich brauche für Faltungshall keine Fensterung (nur so nebenbei):
y[n] = x[n] * h[n] \ \stackrel{\mathrm{def}}{=} \ \sum_{m=-\infty}^{\infty} h[m] \cdot x[n-m] = \sum_{m=1}^{M} h[m] \cdot x[n-m], \,=> 'cicular convolution theorem'
y\_k[n] = \textrm{IFFT}\left(\textrm{FFT}\left(x\_k[n]\right)\cdot\textrm{FFT}\left(h[n]\right)\right), s. http://en.wikipedia.org/wiki/Overlap-save_method#Extending_Overlap-Save
-
PhilippHToner schrieb:
Ich berichtige, ich brauche für Faltungshall keine Fensterung (nur so nebenbei):
y[n] = x[n] * h[n] \ \stackrel{\mathrm{def}}{=} \ \sum_{m=-\infty}^{\infty} h[m] \cdot x[n-m] = \sum_{m=1}^{M} h[m] \cdot x[n-m], \,=> 'cicular convolution theorem'
y\_k[n] = \textrm{IFFT}\left(\textrm{FFT}\left(x\_k[n]\right)\cdot\textrm{FFT}\left(h[n]\right)\right), s. http://en.wikipedia.org/wiki/Overlap-save_method#Extending_Overlap-Save
Ob Du im Freqzenzbereich oder im Zeitbereich arbeitest ist völlig egal, da beides identisch ist. Du kannst das auch ganz wunderbar hin- und her transformieren.