Forum: FPGA, VHDL & Co. FFT-Berechung abkürzen


von Jan (Gast)


Lesenswert?

Ich möchte eine FFT durchführen, die aber sehr lange ist. Ich verwende 
das streaming Modell und erhalte bei z.B. 2048 Daten erst nach 2048 
(Einschreiben )+ ca 500 Latenz + 1024 (Auslese) = 3500 Taktzyklen einen 
ersten Wert.

Das FPGA ist schnell genug, aber die Daten kommen nicht scheller rein 
(120MHz). Ich würde gerne die FFT in der Geschwindigkeit verdoppeln, 
also ein Core berechnet die eine Hälfte und der andere die andere 
Hälfte.

Damit hätte ich nur 1024 Takte zum Einschreiben, weniger Latenz und auch 
nur 512 zum Auslesen. Der erste Block könnte quasi schon nach 1024 Daten 
losrechnen und das Ergebnis wäre nach dem zweiten fertig, also 2048 + 
512 + kleinere Latenz. Geschätzt: 2600

Wie könnte man das machen?

Bez kann man einen FFT Core halb nutzen (halb mit Daten füttern)?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jan schrieb:
> also ein Core berechnet die eine Hälfte und der andere die andere Hälfte.
Von was?

> Wie könnte man das machen?
Was ist dein eigentliches Problem?

> Ich verwende das streaming Modell
Mach es doch einfach anders...   :-/

von Heinz (Gast)


Lesenswert?

Versteh ich es richtig, statt einer 2048 Punkte FFT möchtest du eine 
1024 Punkte FFT machen?

von Decius (Gast)


Lesenswert?

Wozu benutzt Du das Ergebnis der FFT? Kommt eventuell auch ein digitaler 
Filter in Frage?

von Fetz (Gast)


Lesenswert?

Gab doch jetzt vor ein paar Tagen einen Bericht, nachdem MIT an der 
schnelleren-schnellen-Fourier-Transformation arbeitet.

Die haben das wohl mit vorgeschalteten Filterbänken gemacht oder so ...

Kann man nicht per Filter das Frequenzband in der Mitte in 2 Gleiche 
trennen und dann jeweils eine 1024pt FFT drauf ansetzen?

von Fetz (Gast)


Lesenswert?

Also ich meine, Halbbandfilter, Polyphase-Dezimierer mit 
Saplerate-Halbierung und dann 2*FFT

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Fetz schrieb:
> Kann man nicht per Filter das Frequenzband in der Mitte in 2 Gleiche
> trennen und dann jeweils eine 1024pt FFT drauf ansetzen?
Hört sich hinreichend verwegen an. Das könnte klappen...  ;-)

Jan schrieb:
> Ich würde gerne die FFT in der Geschwindigkeit verdoppeln
Man kann (in gewissen Grenzen) immer Geschwindigkeit gegen Ressourcen 
aufwiegen. Nur gibt es für eine Abschätzung bisher zu wenige Zahlen...

von Jan (Gast)


Lesenswert?

klar, ich kann das Signal runtermischen und zwei grobe FFTs machen. Ich 
möchte das Problem aber nicht analog sondern digital lösen.

Der FFT-Core - so wie ich ihn instanziere - geht ja davon aus, dass er 
"n" werte bekommt. Dann rechnet und sortiert er. Darauf aufbauend müsste 
es möglich sein:

1) Die Rechnung dahingehend zu vereinfachen, dass die eine Hälfte der 
Werte Null ist, was zu weniger Code führt, weil Berechnungen wegfallen 
und die Ergebnisse früher stabil sind, bzw nicht so stark gepipelined 
werden muss, um die speed zu schaffen, also mehr der Berechnungen 
(butterfly) in einem Takt erfolgen können.

2) Wenn weniger zu berechnen ist, muss auch weniger ausgeben werden. 
Somit liesse sich die Berechung aufteilen, dass ein Core etwas berechnet 
und die eine Hälfte ausgibt, der andere quasi dasselbe berechnen könnte, 
sich aber auf die ungeraden Frequenzen konzentriert und nur diese 
ausgibt.

von Fetz (Gast)


Lesenswert?

Jan schrieb:
> klar, ich kann das Signal runtermischen und zwei grobe FFTs machen. Ich
> möchte das Problem aber nicht analog sondern digital lösen.

Ööh ... und wieso nicht digital runtermischen und zwei FFTs machen?

von Jan (Gast)


Lesenswert?

Mit "analog" meinte ich solche Mischereien und 
Frequenzverschiebespielchen. Das müsste doch mit der FFT selber gehen. 
Meine ich halt ..

von Georg A. (georga)


Lesenswert?

Klar kannst du Teile der FFT parallelisieren, bzw. eine grosse aus 
mehreren kleinen zusammensetzen. z.B. kann man eine 32768 Punkt FFT aus 
3*1024 Läufen von getrennten 32Punkt FFTs machen. Dass das wirklich 
aufgeht, sieht man zB. an der Gesamtzahl der Butterflies (15*16384 = 
3*1024*80).

Wenn du eine 2048er FFT kleinbekommen willst, geht das über 2 1024er, 
deren Ergebnisse dann über einen Radix2-Kernel zusammengefügt werden (in 
beiden Fällen 11264 Butterflies). Das braucht aber durchaus 1024 
(unterschiedliche) Koeffizienten. Also mindestens ein BRAM mit denen.

Fertig gibts da AFAIK nix, musst du schon selber machen. Fang am besten 
mal an zu verstehen, wie die FFT überhaupt abläuft, zB. mit einer 
übersichtlichen 16er. Es sollte dann relativ offensichtlich sein, dass 
man jede der 4 Runden mit je 8 Butterflies parallelisieren kann, bzw. 
wie der letzte Durchlauf die Ergebnisse von vorher zusammenfügt.

von Sebastian (Gast)


Lesenswert?

Macht es doch nicht so kompliziert. Du must eine Pipline verwenden.

Du berechnest die 1 FFT. Während der Berechnung schreibst die nächsten 
Daten in den 2 FFT-Kern der dann wieder 3500 Takte benötigt. Du kannst 
z.B. 4 FFTs immer versetzt berechnen. Dem nach dem welchen FPGA Du 
verwendest kannst Du auch 20 FFTs gelichzeitig berechnen.

Ich hoffe das hat Dir weiter geholfen.

Ach eins habe ich noch vergessen. Du bekommst aus 2048 Datenpunkte 1024 
komplexe Zahlen (also 1024 Realteile und 1024 Imaginärteile)

Wie hast Du denn deb Betrag gebildet?

von J. S. (engineer) Benutzerseite


Lesenswert?

Jan schrieb:
> Ich möchte eine FFT durchführen, die aber sehr lange ist
2048 ist aber noch nicht Soooo lange, speziell in einem FPGA nicht.

Deine Überlegung Nummer 1 kannst Du umformulieren zu, Wie man FFTs 
interlacet. Dazu benutzt Du die halbe FFT-Auflösung und den Core mit 2 
Kanälen oder 2 parallelnl FFTs. Um das Runter-, bzw Hochmischen kommst 
Du dann aber nicht rum oder Du musst Deine FFT selber programmieren und 
eigene Frequenzen festlegen. Damit landest du funktionstechnisch bei 
einer DFT. Inwieweit man die nun noch so zusammenfassen kann, das sie 
schneller wird, musst du schauen.

Deine Überlegung Nummer 2 kannst Du umformulieren zu, wie man 
beschleunigt ausgibt.

Da um das Abwarten des letzten Wertes nicht herum kommst (du kannst 
NICHT schon nach der Hälfte der Daten beginnen, weil dann die Auflösung 
sinkt), bleibt die eigentlich nur ein paralleles Auslesen.

Auch ohne die Nummer 1 wird irgendwann mal das Ergebnis-Set stabil und 
ist bekannt. Dieses Auslesen muss freilich nicht sequenziell erfolgen. 
Wenn Du die FFT händisch programmierst, kannst Du die Registerwerte ja 
rausflashen, wann und wohin Du möchtest. Z.B. interessieren Dich gfs nur 
bestimmte Frequenzen oder Bänder. Dann kannst Du Dich darauf 
konzentrieren und früher beginnen, auszuwerten. Andererseits läuft das 
dann schon wieder auf den Görtzel hinaus, wenn du nur wenige Frequenzen 
brauchst.

Wenn du aber doch alle Frequenzen brauchst, muss Du auch die Berechung 
aller Ergebnisse abwarten. Dann greift nur der Vorschlag der parallelen 
Ausgabe, sofern das bei einem FPGA am Anschlag überhaupt Sinn macht, da 
ja alle Folgeoperationen dann ebenfalls parallel laufen müssten. Du 
willst mit den Daten ja auch was tun und die FFT Cores in den FPGAs sind 
nicht ohne Grund auf pipelining und damit optimalen Datendurchsatz 
getrimmt. Am Ende investierst du mit anderen Lösungen viel Struktur, um 
nur wenig Tempo zu gewinnen. Wenn, müsstest Du auch das Einschreiben in 
die Register parallelisieren.


Was Du gfs noch nicht ausgeschöpft haben wirst:

1) FiFo vor die FFTs und mit maximaler Geschwindigkeit prozessieren.

2) Auf die Ausgabe der natürlichen Reihenfolge verzichten und selber 
umsortieren. Dann muss nicht gewartet werden, bis der FFT-Wert 1 fertig 
ist.

Sebastian schrieb:
> Du berechnest die 1 FFT. Während der Berechnung schreibst die nächsten
> Daten in den 2 FFT-Kern der dann wieder 3500 Takte benötigt. Du kannst
> z.B. 4 FFTs immer versetzt berechnen

Das ist was anderes. Man bekommt eine feinere Auflösung der 
Frequenzinformation über die Daten, das Extrem wäre mit jedem Datum eine 
aktualisierte FFT. Die Latenz ist dieselbe. Was der TO aber will, ist 
Latenzverkürzung.

von Fetz (Gast)


Lesenswert?

Jan schrieb:
> Mit "analog" meinte ich solche Mischereien und
> Frequenzverschiebespielchen. Das müsste doch mit der FFT selber gehen.
> Meine ich halt ..

Es ist keine Mischerei. Ein Halbband-Polyphase-Filter macht ja schon 
alles alleine. Per Matlab-DSP Toolbox kann man sich die Koeffizienten 
für so einen Filter (bereits inklusive Sample-Rate-Halbierung) berechnen 
lassen. Der Filter ist dann ein simpler FIR. Am Ausgang lässt man jedes 
2te sample weg  (Halbierung der Sample-Rate) und das wars ... Ganz easy

von Fetz (Gast)


Lesenswert?


von Jan (Gast)


Lesenswert?

Ich erkenne noch nicht, wie (alleine!) das Halbbandfilter mir 
weiterhilft. Das HBF trennt mir doch nur die Frequenzen auf und ich habe 
zwei parallele Datenkanäle, der eine hat die Tiefen und der andere die 
Höhen.

Nehme ich nun zwei FFT-cores unveränderter Bauart gegenüber der 
eindimensionalen Variante, bekomme ich doch in der einen auch einfach 
nur die Bässe und in der anderen die Höhen. Der Rest ist jeweils mehr 
oder weniger 0.

Da sehe ich noch nicht den Gewinn! Der Core liefert die Daten 
sequenziell und ich kann bei dem einen früher aufhören, mitzuhören, weil 
die Tiefen von 0% bis 25% der Auslese kommen. Aber andere bringt mir die 
Höhen erst zwischen 25% und 50% der Auslesezeit. Oder kann man das 
umdrehen?

Meines Erachtens muss ich die hohen Frequenzen doch auch nach unten 
schieben, um schneller zu werden, also doch mischen? Aus der NT weiss 
ich, dass man bei einer Multiplikation der Frequenz A mit B die 
Frequenzen A-B und A+B erhält. Muss ich dann vor der zweiten FFT die 
Höhen mit der halben Samplefrequenz runtermischen?

Und dann, wie bringe ich nun die halbe FFT ins Spiel? War das so gemeint 
eine halb so lange FFT zu nehmen?

>Wenn du eine 2048er FFT kleinbekommen willst, geht das über 2 1024er,

von Fetz (Gast)


Lesenswert?

Jan schrieb:
> der eine hat die Tiefen und der andere die
> Höhen.

Nein, das ist nicht richtig ... Nach der Sample-Rate-Dezimierung hast du 
"2 mal tief".

Das kann man machen, weil es kein Aliasing mehr mit dem anderen halben 
Band gibt, weil es nicht mehr vorhanden ist.

von Fetz (Gast)


Lesenswert?

Vlt noch zusätzlich ...

Normalerweise hast du den Nyquist, der dir sagt, dass du 40kHz 
Sample-Rate brauchst für 20kHz Signal.

Wenn du das in zwei Bänder teilst mit 0-10kHz und 10kHz-20kHz, dann 
kannst du das obere Band einfach runtersampelt auf 20kHz.

Das Sprektrum sieht dann so aus, als wäre es 0-10kHz. Das geht aber nur 
dann, wenn die 0-10kHz nicht mehr da sind, mit denen die Frequenzen 
Aliasen könnten.

Wenn du den Polyphase-Filter mit 40kHz takten lässt, kriegst du quasi 2 
Kanäle mit Frequenzen von 0-20kHz, wobei der eine Kanal eigentlich 0-20 
ist und der andere 20-40.

von Jan (Gast)


Lesenswert?

Fetz schrieb:
> Nein, das ist nicht richtig ... Nach der Sample-Rate-Dezimierung hast du
> "2 mal tief".

ok, nach der Ratendezimierung! Wobei ich das nur für die niedrigen 
Frequenzen direkt einsehe. Für die Tiefen entfällt durch den Filter das 
Aliasproblem. Aber für die Höhen fällt doch Information weg, wenn man 
jedes 2. sample weglässt. Mir fehlt da wohl ein wenig NT-Knowhow.

Die Signalkette wäre also:

Input -> Halbbandfilter ->  0% -  50% Frequenz -> FFT1
                        -> 50% - 100% Frequenz -> FFT2

Die Frequenzen der FFT binde ich dann einfach zusammen.

Nach demselben Muster liessen sich auf 4 Bänder definieren, meine ich.

Allerdings:

Habe ich zwei Probleme;

1) So ganz hunderprozentig kann das nicht sein, weil doch die Filter 
nicht-ideal sind. An den Bereichsgrenzen dürften sich Artefakte zeigen. 
Müsste man gfs durch Überlappung lösen (wie?)

2) Die Filterei kostet mich wahrscheinlich rodentlich Zeit, weil der 
Filter sicher nicht gerade mit 5 Taps auskommen wird. Die Latenz kommt 
ja dann nochmals in meine Signalkette hinein. Momentan sehe ich eher, 
dass ich später fertig sein werde, als früher.

von Andelko (Gast)


Lesenswert?

Schau mal hier. ;)
http://www.elektor.de/elektronik-news/schneller-als-die-fft-erlaubt.2061779.lynkx

Es geht also noch schneller als FFT.

von Jan (Gast)


Lesenswert?

Ja,ja, das geistert seit Tagen durch die Gazetten.

von Georg A. (georga)


Lesenswert?

Nur jetzt so aus der Zusammenfassung beurteilt ist das Verfahren nur in 
Sonderfällen nutzbar... zB. bei fast allen Modulationsstandards, die 
eine FFT brauchen, sind so gut wie alle FFT-Punkte auch notwendig. WLAN 
nutzt 52 aus 64, DVB-T 6144 aus 8192, DAB 1536 aus 2048. Da bringt 
Filterung (ausser Phasenproblemen) nicht mehr viel... Algorithmisch ist 
das auch kein neues Verfahren, so wie es einst die FFT selbst war...

von Fetz (Gast)


Lesenswert?

Jan schrieb:
> Aber für die Höhen fällt doch Information weg, wenn man
> jedes 2. sample weglässt. Mir fehlt da wohl ein wenig NT-Knowhow.

Nein, eben nicht ... Theoretisch gehen keine Informationen verloren. 
Praktisch durch Rechenungenauigkeiten.

Such dir mal Tutorial zu Polyphase-Filter, da wirds dann klarer, wieso 
das so ist.

von Fetz (Gast)


Lesenswert?

Achja, und natürlich das Matlab-Beispiel ... Es heißt ja auch "2 channel 
perfekt reconstruction filterbank" ... Da darf nichts verloren gehen :)

von Ralf (Gast)


Lesenswert?

Ich bin an einer ähnlichen Fragestellung dran und auch beim HBF 
geladnet. Bleibt die Frage, wie das Halbbandfilter gebildet wird. Ein 
"Idealer Tiefpass" nach den üblichen Verfahren nehme ich an.

Aber: Fenstern oder nicht?

Die Fensterung verkrümmt doch die Frequenzspektren, wie kann das dann 
noch stimmen?

Siehe auch meine Überlegung zu hier:

Beitrag "Fenstern oder nicht Fenstern"

von Jan (Gast)


Lesenswert?

Ich habe einen solchen Filter nun gebaut und einfach die halbe Nyquist 
angesetzt. Ich hoffe, ich bon da nicht daneben.

Leider klappt es aus anderen Gründen nicht so, wie gedacht:
Beitrag "Mappen versagt, weil Summationen nicht getaktet sind (?)"

von Ralf (Gast)


Lesenswert?

Jan schrieb:
> Ich habe einen solchen Filter nun gebaut

Könntests du den posten?

von Jan (Gast)


Lesenswert?

Nein :-)

@Fetz: wie wiet kann man das Spiel mit der FFT-Unterteilung treiben?
Hat das Verkürzen der FFT nicht Auswirkungen auf die erfasste Frequenz 
nach unten?

Ich meine, man muss doch sicher eine gewisse Mindestmenge an Daten in 
die FFT einleiten, damit die Frequenzen erfasst werden können. Also 
wenigstens mal die Grundwelle.

Wenn man aber mit z.B. 100kHz erfassen will, brauche ich mindestens 10us 
sample time, bei 100MHz also 1000 Werte.

???

von Fetz (Gast)


Lesenswert?

Jan schrieb:
> @Fetz: wie wiet kann man das Spiel mit der FFT-Unterteilung treiben?
> Hat das Verkürzen der FFT nicht Auswirkungen auf die erfasste Frequenz
> nach unten?

Hmm ... ich schätze, dass die Faltungseffekte durch die FFT immer größer 
werden, je kleiner das Fenster ist.

Da war erst ein ähnlicher Thread über das Fenstern bei FFT.

von Hagen R. (hagen)


Lesenswert?

Fetz schrieb:
> Jan schrieb:
>> @Fetz: wie wiet kann man das Spiel mit der FFT-Unterteilung treiben?
>> Hat das Verkürzen der FFT nicht Auswirkungen auf die erfasste Frequenz
>> nach unten?
>
> Hmm ... ich schätze, dass die Faltungseffekte durch die FFT immer größer
> werden, je kleiner das Fenster ist.
>
> Da war erst ein ähnlicher Thread über das Fenstern bei FFT.

Müsste es logisch betrachtet nicht bis auf 2 Frequenzen hinunter so 
funktionieren ? Man hätte dann eine Filterbank und hinter jeder eine 
2-Punkt FFT, also letzendlich das Gleiche als ohne diesen Trick mit 
einer kompletten großen FFT ?

Der einschänkende Effekt sind dann wirklich nur die unerwünschten 
Faltungseffekte der FFT selber, aber diese müssen ja auch bei den 
Filterbänken eintreten, oder ?

Gruß Hagen

von FFT-Neuling (Gast)


Lesenswert?

Ich bin kein Experte für FFTs, aber es ist irgendwie einleuchtend, was 
passiert, wenn man das Fenster verkürzt: Es gibt weniger Werte, die dazu 
beitragen, dass sich die jeweils untersuchte Frequenz von den Nachbarn 
abheben kann.

Meines Erachtens wird bei der Verkürzung des Fensters die Abdeckung der 
FFT-Linien immer grösser, d.h. sie werden weniger selektiv. Eine gute 
FFT zeichnet sich aber dadurch ab, dass sie möglichst schmalbandig ist, 
wenigstens so, dass die Überlappung sinnvoll passt, dass also keine 
Frequenz "durchfällt", weil sie nicht gut erfasst wird.

Ich habe beim meinen Messungen immer den Eindruck, dass die Frequenzen 
in den Amplituden etwas variieren, wenn man sie durchsweept - je 
nachdem, wie gut die Frequenz zur FFT-Frequenz passt. Es bilden sich 
quasi kleine Höcker, die im Ausmass geringer werden, wenn die Auflösung 
steigt.

Zum Zweiten habe ich die FFT, die ,im Gegensatz zur DFT, immer genau so 
viele Frequenzen auswirft, wie sie an Daten reingestopft bekommt, immer 
so aufgefasst, dass sie damit genau ausbalanciert ist - die Überlappung 
der Frequenzen also sozusagen optimiert ist.

Aber egal, ob das so ist, oder nicht - Ich bin eigentlich sicher, dass 
man durch eine DFT, die mit z.B. 128 Frequenzen arbeitet, sich aber über 
512 Werte erstreckt, schmalbandiger ist, als mit einer, die sich nur 
über 128 Werte ersteckt. (Mal davon abgesehen, dass sich das zu 
messenende Signal in seiner Struktur ändern könnte, wenn die Zeit 
wächst).

Wenn man also herginge und das Fenster verkleinern würde, wird die FFT 
sehr unselektiv werden - egal, mit welcher Windowfunktion man da die 
Daten noch glättet. Eine Filterbank auf letztlich zwei Punkte herunter 
zu brechen, kann sicher keinen Vorteil bringen, denke ich.


Die eigentliche Frage war aber wohl eine andere, nämlich , wie man die 
existente FFT beschleunigt. Ich würde sagen, paralleles einlesen, 
paralleles rechnen und paralleles auslesen.

von Hagen R. (hagen)


Lesenswert?

FFT-Neuling schrieb:
> Die eigentliche Frage war aber wohl eine andere, nämlich , wie man die
> existente FFT beschleunigt. Ich würde sagen, paralleles einlesen,
> paralleles rechnen und paralleles auslesen.

das wäre das Maximum was rauszuholen ist durch die geänderte 
Verarbeitung der Daten durch das FPGA. Aber eben keine Lösung die den 
Gesamt-Algorithmus optimiert, also die Frage ob man mathematisch was an 
der FFT drehen kann um es zu beschleunigen.

Gruß hagen

von Jan (Gast)


Lesenswert?

"Paralleles Einlesen":

Dazu muss ich mir wohl einen eigenen Core schreiben, nehme ich an. Oder 
gibt es eine FFT, die das kann? Die open cores FFT macht das offenbar 
nicht.

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.