Forum: Digitale Signalverarbeitung / DSP / Machine Learning 8192 Samples für FFT


von Peter (Gast)


Lesenswert?

Hallo,

eine kurze Frage.
Kann mir jemand erklären oder die Formel nennen, warum für 44.1 kHz
Audiomaterial 8192 Samples benötigt werden, um ein Buffer zu
rekonstruieren, der zunänchst in die FFT gegeben wird und anschließend
durch iFFT rekonstruiert wird.


Danke.

von Thomas (Gast)


Lesenswert?

Hallo Peter,

das eine hat mit dem anderen nix zu tun. Es ist eine Frage der
Auflösung der FFT, d.h. welche Breite der einzelnen "Frequenzbänder"
du sehen möchtest.

Gruß Thomas

von Peter (Gast)


Lesenswert?

Hallo Thomas,

Danke für Deine Antwort.
Das dachte ich mir eigentlich auch...
Ich war nur ein wenig verwundert bzw. bin es immer noch.

Angenommen meine FFT arbeitet mit 1024 Samples. Wenn ich nun 1024
Samples einfüge, das Ergebnis anschließend durch die entsprechende iFFT
überprüfen will, dann hat das Ergebis größere Abweichungen zum Orginal
und das Audiosignal erhält ein heftigeres Knistern.
Wenn ich aber lediglich 512 Sample in die FFT einfüge und die
restlichen "fehlenden" Samples "zero-padde", dann stimmt das
Endergebnis durch iFFT.
(Der imaginäre Teil wird für den FFT Teil ge-"zero-padded" und für
die iFFT Berechnung wird der FFT-Ergebnis-Img Teil benutzt)

Ich arbeite in C++ mit float Werten.


Hast Du eine Idee oder jemand anderes?
Ich habe das Gefühl das ich einen wichtigen Punkt übersehen habe...


Danke.

von Thomas (Gast)


Lesenswert?

Hallo Peter,

welche Fenterfunktion verwendest du ?
Evtl. noch keine ? Dann ist das Problem, daß du ein "Rechteckfenster"
verwendest, d.h. die Übergänge der einzelnen Frequenzbänder (Bins) sind
nicht sonderlich scharf. Ist das Knsitern ein Rauschen ?
Wenn du dir das Signal anhörst, spielst du die ifft Daten dauernd ab
(dann dürfte das Knistern von den Übergängen kommen) ?
Was machst du mit deinem DC-Anteil ?

Gruß Thomas

von Peter (Gast)


Lesenswert?

Hallo Thomas,

erneut vielen Dank, dass Du antwortest.
Bevor ich auf Deine Fragen eingehe, bitte nicht vergessen, dass ich ein
sauberes Endergebis erhalte, wenn ich z.B. 512 Samples in eine FFT/1024
oder 1024 in eine FFT/2048 benutze. Wenn ich aber 512 Samples in
FFT/512 verwende, dann ist das Endergebis verzerrt.
Das Endergebis in der letzten Variante wird besser mit z.B. 4096 in
einer FFT/4096. Bleibt aber weiterhin verzerrt.


> welche Fenterfunktion verwendest du ?
> Evtl. noch keine ? Dann ist das Problem, daß du ein
"Rechteckfenster"
> verwendest, d.h. die Übergänge der einzelnen Frequenzbänder (Bins)
sind nicht sonderlich scharf.
-> Ich dachte ich muss Fensterfunktion nur dann anwenden, wenn ich z.B.
ein visuelle Anzeige der einzelnen Frequenzen haben möchte? D.h., ich
soll eher auf das Ergebnis aus der FFT z.B. "Hamming" anwenden, und
diese Zwischenergenis in die iFFT hineingeben? (Um das ursprungssignal
wieder zu erhalten?)

> Ist das Knsitern ein Rauschen ?
-> Ich wuerde eher sagen : verzerrt. Es wird besser mit mehr
Samples...

> Wenn du dir das Signal anhörst, spielst du die ifft Daten dauernd ab
> (dann dürfte das Knistern von den Übergängen kommen) ?
-> Sagen wir so, ich habe immer 2048 Samples von einem grossen
Audiomaterial zur Verfügung. D.h., erst die ersten 2048, dann die
nächsten, und immer so weiter....
Diese Samples gebe ich dann in die FFT. Durch die Übergabe der 2048
Samples an die iFFT, erhoffe ich die FFT-Berechung zu überprufen. Haut
aber, wie bereits beschrieben, nicht hin.
Benutze ich aber 4098 Samples fuer die FFT, d.h., ich nehme 2048
Samples des Audiosignals und zero-padde den Rest, dann stimmt das
Endergebis.

>Was machst du mit deinem DC-Anteil ?
-> Oha, Du hast mich und hier muss ich passen. Kannst mir darueber
etwas sagen. Ich meine, dass der DC-Anteil im Realteil[0] ist.


Danke.

von Thomas (Gast)


Lesenswert?

Hi Peter,

mal grundsätzlich ? Machst du eine nur "reale" FFT oder was machst du
mit den imaginär inputs ? Vielleicht liegt ja da der Wurm begraben. Das
Fenster macht einfach die Übergänge etwas weniger "scharf", da die
FFT ja nicht weiß wo das Signal herkommt bzw. wie es hinterher
weitergeht.
Ansonsten rechne dir doch mal verschiedene Frequenzgemische numerisch
aus und lass diese durch deine FFT laufen. Wenn du exakt in den Bins
liegst ist ein Fenster a) nicht nötig und b) stört es sogar. Wenn die
Frequenz ganzzahling in Abtastfrequenz passt (z.B. fs/16), dann sollte
eben nur eine einzige Frequenz entstehen.

Aber je länger ich drüber nachdenke, geh ich fast davon aus, daß deine
FFT ein komplexes Eingangssignal erwartet und dann natürlich das
Eingangssignal etwas "verwurschtelt" wird. Das würde die Verbesserung
durch Null-Füllerei....

Hast du dir FFT selbst gebastelt ?

Gruß Thomas

von Peter (Gast)


Lesenswert?

Hallo Thomas,

ja, die FFT ist von mir und ich arbeite mit komplexen Eingangssignal.
Also, das Problem ist, dass ich das Audiomaterial immer nur in Blöcken
zu Verfügung bekomme. Und daher muss ich, zero-padding anwenden, um
eine richtige FFT zu berechnen.
D.h., wenn ich 512 Samples im Block erhalte, dann dupliziere ich die
Anzahl und fütter die restlichen 512 Samples mit 0.
(Ich erhalte ja auch ein richtiges Ergbnis)
Die Frage ist, da bin ich noch nicht dahinter gestiegen, ob ich eher
die ersten 256 Samples mit 0 belege, dann die richtigen Audiosamples
von 256 - 768 und den Rest wieder 0.
Oder ist das vermutlich egal. Ich glaube schon.

Danke.

Ach, wenn ich eine "reale" FFT erstellen würde, dann müßte ich in
meinem Fall genauso vorgehen, oder? Eine "reale" FFT wird doch nur
benutzt, um zusätzlich noch weniger CPU Belastung zu erhalten...

von Peter (Gast)


Lesenswert?

Hallo Thomas,

ich habe meinen blöden Bug gefunden.
War irgendwo im tiefsten Source.


Danke nochmal.

von Thomas (Gast)


Lesenswert?

Freut mich, daß es jetzt klappt. Ich hab bei meiner ersten FFT auch
einige Tage gesucht und getestet bis das alles geklappt hat.

Noch viel Spaß
Thomas

von Peter (Gast)


Lesenswert?

Hallo Thomas und Hallo alle Anderen,

wollen wir einen Schritt weiter gehen?
Ich arbeite weiterhin mit einer kompexen FFT und habe weitere
Window-Varianten ( z.B. "Hann" ) eingebaut.
Nun dachte ich, ich könnte Daten im Frequenzbereich verändern, z.B.
eine einzige Frequenz, um diese dann herauszufiltern. Jedoch ende ich
wieder in Klicks, obwohl die Funktionalität vorhanden ist.

D.h., ich berechne die FFT, erhalte den imaginären und realen Teil der
Samples. Veränder dann realTeil[1] = imaginärTeil[1] =
realTeil[Samplelänge-1] = imaginärTeil[Samplelänge-1] = 0. Abschließend
iFFT.

Kann man das einfach so machen? Vermutlich nicht...


Dank erneut.

von Peter (Gast)


Lesenswert?

Vielleicht noch eine weitere Frage...
Overlapping Windows.
Ich bekomme ja weiterhin eine statische Anzahl an Samples. Ich dachte,
dass ich bei einem overlapping windows Verfahren, immer die Haelfte der
letzten Sample speichere, und diese mit den naechsten benutze. Und so
weiter...
Ich glaube man kann es aber auch noch anderes machen - Weiß jemand wie?
Mit zeropadding?

Danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.