INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

FFT Express VI - Single Channel Multiple Samples



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

06.07.2021, 12:48
Beitrag #1

bisasam Offline
LVF-Neueinsteiger


Beiträge: 2
Registriert seit: Jul 2021

2019
2019
DE



Sad FFT Express VI - Single Channel Multiple Samples
Hallo,


ich möchte auf meiner FPGA Karte echtzeitfähig einen Block-Algorithmus implementieren der im Frequenzraum Berechnungen durchführt und anschließend wieder in den Zeitbereich rücktransformiert. Hierzu möchte ich die FFT Express VI nutzen.

Zunächst generiere ich mir einen Sinus und füttere die einzelnen Werte in ein Buffer-Array. Der Buffer fasst 1024 Sample. Ich möchte nun alle 512 Sample eine FFT über die 1024 Sample im Buffer bilden. Dafür erstelle ich mir eine Laufvariable und schmeisse bei Vielfachen von 512 die FFT-Express VI an. Ich nutze hier den "Single Channel Multiple Samples" Modus, teile meine 1024 Sample in Signalblöcke der Länge 16 und schieb sie in die FFT. Nun kommen die frequency bins aber in einer anderen Reihenfolge raus und ich weiß nicht wie ich Sie abspeichern kann und meine Versuche mit Build Array sind bislang kläglich gescheitert. Ich muss danach noch die frequency bins mittels weiterer Berechnungen verändern und dann eine IFFT durchführen deswegen macht es vermutlich keinen Sinn die frequency bins vor der Express-IFFT sinnvoll zu ordnen, da sie dem Schema der Express-FFT folgt.

Mir erscheint meine Vorgehensweise viel zu umständlich und ich denke, dass das doch eigentlich einfacher sein muss. Weiß jemand wie ich die 16er Blöcke aus der FFT abspeichern kann oder wie das einfacher funktioniert?

Ich habe den Code soweit es geht reduziert, angehängt und kommentiert. Über Antworten und Tipps zu meiner Erlösung von der Qual der Echtzeit-Implementierung würde ich mich sehr freuen.


Viele Grüße

bisasam


Angehängte Datei(en)
19.0 .vi  FPGA_main.vi (Größe: 273,53 KB / Downloads: 211)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.07.2021, 11:55
Beitrag #2

bisasam Offline
LVF-Neueinsteiger


Beiträge: 2
Registriert seit: Jul 2021

2019
2019
DE



RE: FFT Express VI - Single Channel Multiple Samples
Hier ist das VI nochmal auf privaten Tipp in der 17.0 Version.


Angehängte Datei(en)
17.0 .vi  FPGA_main.vi (Größe: 213,1 KB / Downloads: 192)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.07.2021, 12:52 (Dieser Beitrag wurde zuletzt bearbeitet: 07.07.2021 12:54 von GerdW.)
Beitrag #3

GerdW Offline
______________
LVF-Team

Beiträge: 17.465
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: FFT Express VI - Single Channel Multiple Samples
Hallo Matthias,

danke für das Konvertieren - und herzlich willkommen im Forum!

Zum VI:
So ganz werde ich daraus nicht schlau, dafür fehlen mir einfach Kommentare im Blockdiagramm, die die einzelnen Schritte erläutern…

Aber was ich sagen kann: das VI sieht überhaupt nicht aus, als wäre es für einen FPGA entworfen!
- Array-Handling auf dem FPGA ist sehr reduziert! Ständig Arrays in ihrer Größe zu ändern, geht überhaupt nicht! Also versuche ohne DeleteFromArray, InsertIntoArray, ArraySize auszukommen. Und am besten auch ohne BuildArray, wenn du damit auch Arrays variabler Größe erstellst!
- Achte auf CoercionDots: warum erzeugst du FXP-Daten, deren Größe nicht zu Indicators oder anderen Rechnungen passen?
- Ein FPGA hat keinen Monitor und kann kein Frontpanel darstellen: Charts sind tabu!
- Wozu die Größe eines Arrays bestimmen, dass du zwei Schritte früher selbst per InitArray definierst hast? Rube-Goldberg lässt grüßen!
- Generall: Code aufräumen! Gerade Drähte!
- Wozu so viele Sequenzrahmen? Das geht doch fast alles auch ohne!?

Ich habe mal den ersten Frame etwas "beräumt":
   
Aufgrund von "THINK DATAFLOW!" wäre der Sequenzrahmen für den ersten Frame nicht nötig…
(Siehe angehängtes VI…)

Wenn du den Code besser kommentierst, kann man dir auch andere/bessere Code-Konstrukte empfehlen!
Zu der Frage bzgl. Speichern von Daten in einem Array: auf dem FPGA sollte man für solche Zwecke eher mit MemoryBlocks arbeiten - oder eben mit Arrays fester Größe…

Allgemeiner Hinweis: LabVIEW-FPGA erfordert ein spezielles Herangehen, das sich etwas von "normalem" LabVIEW unterscheidet. Schau dir dringend die FPGA-Basics-Kurse an! (Siehe meine Signatur.)


Angehängte Datei(en)
17.0 .vi  FPGA_main.vi (Größe: 234,77 KB / Downloads: 204)

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
07.07.2021, 13:07
Beitrag #4

Martin.Henz Offline
LVF-Team
LVF-Team

Beiträge: 426
Registriert seit: Jan 2005

2.5.1 bis 20
1992
kA

74363
Deutschland
RE: FFT Express VI - Single Channel Multiple Samples
Hallo bisasam,

erst einmal herzlich willkommen im Forum.

Ich habe den starken Verdacht, dass du das FFT VI falsch bedienst. Du schiebst dem immer den nächsten Datenblock rein, danz egal, was das VI am Ausgang "ready for input" zurückmeldet. Den Eingang "ready for output" hast du gar nicht verbunden. Das kommt mir alles etwas komisch vor und könnte dazu führen, dass du aus der FFT keine korrekten Daten raus bekommst.

Martin Henz
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
10.07.2021, 13:07 (Dieser Beitrag wurde zuletzt bearbeitet: 10.07.2021 13:30 von Martin.Henz.)
Beitrag #5

Martin.Henz Offline
LVF-Team
LVF-Team

Beiträge: 426
Registriert seit: Jan 2005

2.5.1 bis 20
1992
kA

74363
Deutschland
RE: FFT Express VI - Single Channel Multiple Samples
Hallo bisasam,

es ist schon vollkommen ok, das Ganze erst einmal auf dem Desktop auszuprobieren. So ist dein VI vermutlich auch gedacht. Auf den FPGA zu gehen, wenn die Bedienung der VIs nicht verstanden wurde, macht auch ziemlich wenig Sinn. Da kommen dann auch noch mal ganz andere Dinge dazu. Das FFT VI ist für den FPGA gemacht und muss daher auch entsprechend bedient werden. Dein Beispiel ist davon noch ziemlich weit entfernt Cool

Wenn ich dein VI richtig verstehe, dann willst du erst einmal nur simulierte Messdaten erzeugen und aus denen dann die FFT berechnen. Da es später auf einen FPGA laufen soll, wird das etwas komplizierter - sonst wäre es ja ganz einfach. Aber dabei hast du dich ziemlich "verlaufen". Das geht so nicht Box

Ich habe mal ein etwas anderes Beispiel dafür erstellt.

Das enthält zwei While Schleifen. Die untere While-Schleife simuliert die Datenerfassung. Vom Prinzip her könnte auf diese Art die Datenerfassung in einer single-cycle-timed-loop, also mit voller Taktrate des FPGA, laufen. Natürlich nur, sofern der A/D Wandler das auch kann.
   

Oben erfolgt die Messung des Signals (jeweils ein Sample aus dem Sinusgenerator und ein bisschen Rauschen dazu).
Anschließend (mitte) sammle ich 16 Samples und wenn 16 Samples zusammen gekommen sind, dann werden diese zur Auswertung (FFT) gesendet (also zur oberen While-Schleife). Als Ersatz für einen FPGA FIFO verwende ich einfach eine Queue und der verwendete Sinusgenerator würde auch nicht auf einem FPGA funktionieren - spielt aber erst mal keine Rolle.

Die obere While-Schleife bekommt nun über die Queue (das wäre ein FIFO auf dem FPGA) jeweils 16 Samples. Also genau die Anzahl Samples, welche für die FFT benötigt werden. Sofern das FFT VI am Ausgang "ready for input" den Wert TRUE liefert guckt die obere While Schleife ob neue Daten aus der Messdatenerfassung vorhanden sind. Wenn ja, dann bekommt das FFT VI in der nächsten Iteration der While-Schleife die Daten und der FFT Eingang "input valid" wird auf TRUE gesetzt. Sind keine neuen Daten vorhanden, dann ist "input valid" immer FALSE.
   

Nun darf die FFT also die nächsten 16 Samples berechnen. Bei den aktuellen Einstellungen der FFT dürfte das FFT VI nach etwas 1300 Iterationen die ersten Ergebnisse liefern (output valid = TRUE).
Das FFT VI liefert dann am Ausgang 16 Werte von den 1024 Werten der kompletten FFT Daten. Wo die hin kommen, das steht in "data out indexes". Die Daten von "real data out" und "imaginary data out" müssen also an die richtige Stelle. Da habe ich mir jetzt nicht die Mühe gemacht, das in Anlehnung an eine single-cycle-timed-loop zu programmieren. In einer single-cycle-timed-loop hättest du jetzt 16 Takte Zeit im die 16 Samples richtig zu einzusortieren. Also genau so lange wie die Datenerfassung bei einer single-cycle-timed-loop braucht um dir die nächsten 16 Samples zu liefern.
Wenn alle 1024 Samples (so groß ist die gesamte FFT) vorhanden sind, dann berechnet das VI noch das Spektrum und gibt es auf dem Graph aus. Das würde auf dem FPGA auch nicht funktionieren. Es ist aber der Zeitpunkt um die fertige FFT einer weiteren Verarbeitung zuzuführen.


Angehängte Datei(en)
17.0 .vi  fft_test_01.vi (Größe: 40,08 KB / Downloads: 199)

Martin Henz
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  High Throughput Divide in Single Cycle Timed Loop Krimo 3 6.229 18.07.2019 12:08
Letzter Beitrag: jg
  Fifo zum Host in Single Cycle Timed Loop liefert unerwartete Daten RobertR 2 6.714 12.01.2012 21:54
Letzter Beitrag: RobertR
  FPGA project with multiple targets dlambert 2 5.240 22.06.2009 10:46
Letzter Beitrag: dlambert
  Case Struktur in Single Cycle Timed Loop ro.hau 2 6.299 28.01.2009 08:34
Letzter Beitrag: ro.hau

Gehe zu: