Grenzwerte sinc(x) bei float, bzw. double
-
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.
-
PhilippHToner schrieb:
Aber ich habe ehrlich gesagt keine Ahnung, was für Kriterien ein "guter" Resampler eingebaut bekommt.
Das ist auch ein bisschen Geschmackssache. Wie gesagt, die Sperrdämpfung sollte mindestens 100dB sein, wobei ich 180dB wieder als Overkill bezeichnen würde. Im Durchlassbereich sollten die Übertragungsamplituden von 1 nicht mehr als 0,1 dB abweichen. Je weniger desto besser. Bei windowed-sinc-Filtern ergibt sich diese Abweichung aber aus der Sperrdämpfung (aufgrund von Symmetrien) und ist bei einer Sperrdämfung von 100dB echt schon winzig klein, also kleiner als 0,0001 dB -- wenn ich mich nicht verrechnet habe. Dann bleibt eigentlich nur noch die Position und die Breite der Flanke, welche Du jeweils über die Grenzfrequenz und die Fensterlänge kontrollieren kannst.
Andere Filter-Design-Methoden lassen dich Sperrdämpfung und Durchlassband-Abweichungen getrennt voneinander regeln. Das erlaubt dir noch eine weitere Verkürzung der Impulsantwort des Filters. Es wird nur leider sehr schnell kompliziert (weighted least squares oder mini-max-Optimierung im Spektrum)...
PhilippHToner schrieb:
Ich finde das Gespräch gerade sehr interessant, obwohl wir jenseits von C++ gelandet sind
! Danke
Meiner Meinung nach, eine wilkommene Abwechselung zu "wie übergebe ich ein 2D array an eine Funktion?".
Vielleicht ist der Thread besser in "Rund um die Programmierung" oder im Mathe-Forum besser aufgehoben... (?)
-
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)Die schnelle Faltung ist im "DSP guide"-Buch auch schön erklärt. Du hast recht: die "FFT-Blöcke fenstert man da nicht". Aber Du fensterst immer noch deinen sinc wie gehabt!
Allerdings ist die schnelle Faltung für Resampling nur bedingt interessant, da man ggf viele Samples berechnet, die man hinterher eh wieder wegschmeißt. Für einen Hall-Effekt ist das aber prima.
-
OT: Was muss ich eigentlich machen, damit das TeX-Gemüse bei mir richtig angezeigt wird?
-
Tachyon schrieb:
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 sehe schon, mir fehlt noch ein wenig Theorie, aber ich hab mir gerade ein Buch gekauft.
Nochmal allgemein:
Ich möchte von x Hz nach y Hz samplen. Dann brauche ich einen LPF bei y/2 oder? Der Sinc cutted doch automatisch bei der halben Abtastfrequenz. Wie kann ich das beeinflussen? AUch auf Wiki wird immer vom idealen LPF gesprochen, aber bei welcher Frequenz ist dieser denn angelegt?
Wie realisiere ich einen LPF bei 120Hz für das Subwoofer Signal und einen HPF bei 120 Hz für die anderen Boxen zum Beispiel?Ich habe meine Samples "in" und meine ausgehenden Samples "out".
Ich kann also das Filter so darstellen als Faltung:
[in]*[filter]=[out]Ist [filter] die gefensterte sinc Funktion habe ich eine LPF bei der Nyquist-Frequenz?
-
Tachyon schrieb:
OT: Was muss ich eigentlich machen, damit das TeX-Gemüse bei mir richtig angezeigt wird?
Schau Dir mal Browser-Compatibility-Charts an: http://www.mathjax.org/help/user/ Vielleicht geht da etwas nicht!