Gerade wird hier diskutiert, wie ein Blackman-Fenster einzusetzen wäre.
Beitrag "Re: Ergebnisse einer FFT zusammen fassen"
Dazu habe ich eine Frage zur Nummerierung:
In der WP wird von der Zahl der digitalen Samples 'M' gesprochen und der
Index einmal von 0 ... M-1 und einmal von -M/2 ... M/2 - 1 laufen
lassen.
https://de.wikipedia.org/wiki/Fensterfunktion
In beiden Fällen ergibt sich mit den COS-Funktionen der Fenster z.B.
Hamming und Blackman ein gleicher Verlauf. Allerdings sehe ich ein
Problem mit den Indizes:
Benutze ich das Beispiel aus der WP mit "M = 16" dann ergibt sich die
Tabelle, die ich angehängt habe. Ich habe die Formel aus dem Beitrag von
oben genommen, sie sind aber mit denen aus der WP gleich. Wie jeder
sieht, schließt die Cosinusfunktionen bei 0 und 16 genau auf der Achse
ab. Die Vielfachen von 2*PI*n tun das logischweise auch.
Das sind aber 17 Werte!!!
In der WP wird davon gesprochen, dass bei allen diesen Funktionen der
erste Wert n=0 wegzulassen wäre(?), bzw. zu "0" wird und deshalb in den
Darstellungen nicht vorhanden sei.
Abgesehen davon, dass der Finalwert nicht exakt 0 gibt, sondern 0.001
ergibt sich dann ein Symmetrieproblem, wenn 16 Koeffizientenwerte für 16
samples genutzt werden, weil der letzte denselben Wert wird der 0te hat,
aber drin bleibt. Das gleiche hat man, wenn 0 ... M-1 genutzt werden.
Wie passt das zusammen?
Bei einer großen Zahl von Audiosamples, z.B. 1024 ist es wahrscheinlich
egal, wenn es einen shift, gibt, aber ich hätte totale Symmetrie
erwartet.
Welche Koeffizienten wären bei 16 samples zu benutzen?
Audiologe schrieb:> Das sind aber 17 Werte!!!> ...> Welche Koeffizienten wären bei 16 samples zu benutzen?
Bedenke mal, daß eine Filterfunktion, wenn sie denn Signale symmetrisch
darstellen soll, ein Sample haben, was in der Ergebnis-Gegenwart liegt.
Im Prinzip geht deine Verarbeitung immer so:
- vom ADC kommt ein Sample, das wird an das fernste Ende der Zukunft
gelegt und alle bisherigen Samples rutschen einen Platz in Richtung
Vergangenheit. Das letzte Sample verschwindet im Nirwana.
- Das Filter betrachtet die Samples als zu gleicher Zahl in der Zukunft
liegend und in der Vergangenheit liegend. Und ein Sample (das in der
Mitte) liegt direkt in der Gegenwart.
Folglich: Filterkernel sollten immer eine ungerade Anzahl von Samples
groß sein. Natürlich gehen auch Filterkernel mit gerader Anzahl, aber
dann liegt die Gegenwart in der Mitte zwischen den beiden mittleren
Samples.
Für Speicherobliegenheiten ist sicherlich eine Zählung 0..16 in Ordnung,
aber zur Berechnung der Taps zählt man besser -8..0..+8.
W.S.
W.S. schrieb:> Für Speicherobliegenheiten ist sicherlich eine Zählung 0..16 in Ordnung,> aber zur Berechnung der Taps zählt man besser -8..0..+8.
Das ist an der Stelle ja gleichwertig und macht noch keinen Unterschied
für die Werte. Ich sehe aber nicht, wie das stimmen soll:
Muss ich dann immer 17 Werte reinwerfen?
Audiologe schrieb:> Muss ich dann immer 17 Werte reinwerfen?
Nein, natürlich nicht. Du kannst (sofern du es kannst) Filterkernel
beliebiger Größe berechnen. Ist eben abhängig von deiner Anwendung. Man
kann auch asysmmetrische Filter berechnen, die haben dann eben
Eigenarten, die ich nicht weiter betrachten will.
Aber weswegen "17 Werte reinwerfen"? Das verstehe ich nicht. Wenn du
deinen ADC eine Weile arbeiten läßt, dann kriegst du Abertausende von
Samples - und die wollen alle verarbeitet sein. Sowas kostet Rechenzeit
und du wirst wohl immer einen Kompromiß eingehen müssen zwischen
Rechenzeit bzw. Takte zwischen 2 Samples und dem Filterergebnis, was man
damit erzielen kann.
W.S.
Audiologe schrieb:> Muss ich dann immer 17 Werte reinwerfen?
I.d.R. ist es deutlich einfacher, bei der gegebenen Zahl Samples zu
bleiben und statt dessen das Fenster um ein halbes Sample zu
"verschieben", es also auf diese Weise symmetrisch zu machen.
Im Verlaufe dieses Threads:
Beitrag "Audio Spektrum Analyzer mit ATtiny85"
Habe ich genau das getan. Die dadurch bewirkte Verbesserung kann man
hier sehen:
Beitrag "Re: Audio Spektrum Analyzer mit ATtiny85"
Ist kein sehr großer Sprung in der Qualität, aber doch eine deutlich
nachweisbare Verbesserung.
Bei dem Thread ging es zwar um eine Sache mit Goertzels, das
funktioniert aber bei einer FFT ganz genauso.
Die Formulierung in der WP ist schon richtig. Die Unsymmetrie erzeugt
nur eine Verschiebung der Wirkung der Samples wie schon gesagt. Das ist
hier deshalb der Fall, weil eine gerade Anzahl von Samples genutzt wird,
während die Kurve auf eine ungerade ausgelegt ist, bzw der Cosinus eben
so tickt. Da bei Audio eine ungerade Anzahl günstiger ist, kannst du
einen Punkt weglassen und mit 15 rechnen. Dann gibt es eine "echte"
Mitte mit 7 Nachbarn zu jeder Seite.
In der Bildverarbeitung wird das regelmäßig so gemacht (strikt ungerade
Anzahl) und das Fenster entsprechend angepasst. Siehe dazu auch den N/2
+ 1 - Shift in meiner [Digitale Sinusfunktion]. Dort wird es genutzt, um
die ungerade Sinus-Funktion auf eine gerade Zahl von Samples zu mappen
und dabei in 2 Achsen symmetrisch zu werden.
Generell kann man durch ein leichtes Verschieben der Kurve mit weniger
als einem Sample, die Signale unterhalb der Samplegrenze schieben. Z.B.
mit einem MOVE von 25% , 50%, 75% schlagartig in einer Rechnung die
Werte erhalten, die ein upsampler im Zeitbereich durch oversampling
produzieren würde.
Um das Problem also vereinfacht zu beantworten:
Die Formeln im WIKI sind auf einen Fall ausgelegt, den anderen musst du
dir denken. Das ist ja bei der Veranschlagung von Filterlängen generell
der Fall. Beispiele siehe Bild. Unten wieder meine Empfehlung mit dem
N/2-Shift.
Mathematisch / Funktionell ist beides richtig. Die Windowfunktionen an
sich sind vollständig überlagerbar, d.h. die Punkte einer verschobenene
Kurve passen genau in die einer Nichtverschobenen. Wenn man
unterschiedlich lange Kurven für mehr Samples richtig skaliert, passen
auch diese ineinander. Es sind halt andere Punkte derselben Kurve.
Es muss immer das Gleiche rauskommen. Da aber die Nutzung von einem
Sample mehr oder weniger zu etwas mehr oder weniger "Information" führt,
gibt es automatisch leicht andere Ergebnisse. Auch sind manche etwas
recheneffizienter, wegen perfekter Symmetrie und Nulldurchgängen.
Nähert man die Punkteanzahl gegen Unendlich, gleichen sich alle Kurven
einander an.