Forum: FPGA, VHDL & Co. Fragen zur open cores FFT in VHDL


von Gerald (Gast)


Lesenswert?

Kann mir bitte jemand kurz einen Tipp geben, was aus der FFT nun heraus 
kommt? Wie immer ist das alles schlecht dokumentiert. Leider ist die 
Testbench nicht in VHDL - auch im C Code blicke ich nicht durch.

Die entity schaut so aus:
1
entity cf_fft_256_8 is
2
port(
3
signal clock_c : in std_logic;
4
signal enable_i : in unsigned(0 downto 0);
5
signal reset_i : in unsigned(0 downto 0);
6
signal sync_i : in unsigned(0 downto 0);
7
signal data_0_i : in unsigned(15 downto 0);
8
signal data_1_i : in unsigned(15 downto 0);
9
signal sync_o : out unsigned(0 downto 0);
10
signal data_0_o : out unsigned(15 downto 0);
11
signal data_1_o : out unsigned(15 downto 0));
12
end entity cf_fft_256_8;

Offenkundig kann man 2 Datenströme parallel einspeisen - wofür auch 
immer. Mal abgesehen, dass ich noch herausbekommen muss, wie ich real 
und imag ermittle, da ich ja nur einen Datenstrom y = f(t) habe -

Was gibt der mir nun aus? Ich brauche eigentlich das Spektrum meines 
kontinuierlichen Datenstroms.

Klar scheint, dass ich mit jedem Takt enable_i einen neuen Datensatz 
eingeben kann, aber was muss ich mit den Ausgangsdaten tun?

In der Erklärung steht nur:
1
--  Overview:
2
--  
3
--    Performs a radix 2 Fast Fourier Transform.
4
--    The FFT architecture is pipelined on a rank basis; each rank has its own butterfly and ranks are
5
--    isolated from each other using memory interleavers.  This FFT can perform calcualations on continuous
6
--    streaming data (one data set right after another).  More over, inputs and outputs are passed in pairs,
7
--    doubling the bandwidth.  For instance, a 2048 point FFT can perform a transform every 1024 cycles.
8
--  
9
--  Interface:
10
--  
11
--    Synchronization:
12
--      clock_c  : Clock input.
13
--      enable_i : Synchronous enable.
14
--      reset_i  : Synchronous reset.
15
--  
16
--    Inputs:
17
--      sync_i     : Input sync pulse must occur one frame prior to data input.
18
--      data_0_i   : Input data 0.  Width is 2 * precision.  Real on the left, imag on the right.
19
--      data_1_i   : Input data 1.  Width is 2 * precision.  Real on the left, imag on the right.
20
--  
21
--    Outputs:
22
--      sync_o     : Output sync pulse occurs one frame before data output.
23
--      data_0_o   : Output data 0.  Width is 2 * precision.  Real on the left, imag on the right.
24
--      data_1_o   : Output data 1.  Width is 2 * precision.  Real on the left, imag on the right.
25
--  
26
--  Built In Parameters:
27
--  
28
--    FFT Points   = 256
29
--    Precision    = 8
30
--

Bei einem Spektrum habe ich einzelne Frequenztöpfe vor Augen, die je 
nach Eingang verschieden stark gefüllt sind - so wie bei der 
Stereoanlage.

Ich erwarte etwas zweidimensionales.

von Gerald (Gast)


Lesenswert?

Um es noch weiter aufzuarbeiten:

Ich gehe mal von meinen Daten aus. Diese sind 10 Bit breit und sehen so 
aus:  567,754,876,345, 234, ... 475

Also nehme ich die als Realteil, lasse Imaginär leer und belege auch den 
zweiten Kanal nicht.

Ich habe es versucht, selber zu simulieren, kann aber anhand der Daten 
nicht erkennen, was da nun heraus kommt.

Erhalten müsste man doch so etwas, wie Amplitude über der Frequenz:

A:   0   0   0   0   1   2   5   9   4   2   1
F:   1   3  10   3 100 300  1k  3k 10k 30k 100k

Wie stelle ich die Frequenzen ein?

Wie komme ich nun zu meinen gefüllten Töpchen und wieviele sind es?

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Hallo,

du musst eine I/Q-Transformation vornehmen. D.h. deinen Datenstrom 
sowohl mit einem Sinus als auch einen Kosinus multiplizieren.
Damit erhälst du den Real und Imaginär-Teil deines Signals, plus 
Mischprodukte. Die musst du noch beseitigen.

Lies dir mal diesen Thread durch

Beitrag "IQ Mischer Verständnisfrage"

Tom

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Gerald schrieb:
> Um es noch weiter aufzuarbeiten:
>
> Ich gehe mal von meinen Daten aus. Diese sind 10 Bit breit und sehen so
> aus:  567,754,876,345, 234, ... 475
>
> Also nehme ich die als Realteil, lasse Imaginär leer und belege auch den
> zweiten Kanal nicht.

Richtig.

> Erhalten müsste man doch so etwas, wie Amplitude über der Frequenz:
>
> A:   0   0   0   0   1   2   5   9   4   2   1
> F:   1   3  10   3 100 300  1k  3k 10k 30k 100k
>
> Wie stelle ich die Frequenzen ein?
>
> Wie komme ich nun zu meinen gefüllten Töpchen und wieviele sind es?

Die Frequenzen werden durch die Abtastrate 1/T und die Länge der FFT N 
vorgegeben:

0 (=Gleichanteil)
1/(N*T)
2/(N*T)
...
(N-1)/(N*T)

Die obere Hälfte (ab N/2+1) kannst du wegwerfen, weil die bei reellen 
Signalen symmetrisch zur unteren Hälfte ist. Die Koeffizienten sind bis 
auf den bei 0 und N/2 alle komplex, d.h. du hast einen Real- und 
Imaginärteil (auch wenn dein Eingangsvektor rein reell ist). Wenn du den 
Betrag berechnest und quadrierst bekommst du die Leistung bei der 
Frequenz.

von Gast (Gast)


Lesenswert?

> du musst eine I/Q-Transformation vornehmen. D.h. deinen Datenstrom
> sowohl mit einem Sinus als auch einen Kosinus multiplizieren.
> Damit erhälst du den Real und Imaginär-Teil deines Signals, plus
> Mischprodukte. Die musst du noch beseitigen.

Würde mich wundern ...

AFAIK ist der Imagniärteil einfach 0, und der Reelteil entspricht den 
normalen Eingangsdaten, die man transformieren will.

Wenn I=0, dann ist es so, wie Andreas schon geschrieben hat. Das 
erzeugte Spektrum ist dann symmetrisch.

Grüße,
Gast

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Aus welchem Projekt von opencores hast du die FFT?

Eine FFT analysiert ein Spektrum und müsste ein array zurückliefern und 
jede Spalte ist der Wert der Amplitude. Deine Töpfe.

Ansonsten ist es ein Sinus bzw. Cosinus Korrelator. Du musst diesen 
Korrelator für jede der dich interessierenden Frequenz anwenden.

von Gerald (Gast)


Lesenswert?

Es ist die http://www.opencores.org/project,cf_fft

>Eine FFT analysiert ein Spektrum und müsste ein array zurückliefern

Eben, das sehe ich da nicht. Kommt das gfs gepipelined?
Wäre schön, wenn ich noch einen Tip bekäme, ich ich da weiter komme.

Hat jemand einen anderen link?

...........

Wie sieht das nun aus mit dem "Sinus-Multiplizieren"? Muss ich da noch 
etwas tun, bevor ich die pipieline füttere?

Ich habe das nun so verstanden, dass ich eingangsseitig nur mit dem 
Realteil arbeiten kann, weil ich mich auf den Zeitpunkt / Phase = Null 
beziehe. Dann gibt es keinen Imaginärteil.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Bei mir kommt unter dem genannten Projekt was in verilog raus. Komme ich 
auch nicht ganz klar.

Was ist dein Ziel?
Amplitudenwerte oder getrennt Real und Imaginärwerte?

Ich weiss auch nicht auf welcher Hardware du es umsetzen möchtest?
Zumindest dien Anzahl der Multiplizier ist beschränkt. Bei einer 
kontinuierlichen Auswertung eines Signals kannst, du nicht unendliche 
fein die Frequenzen wählen.

von John-eric K. (mockup)


Lesenswert?

Also auf deinem Link nach OpenCores steht im Text
"All designs are pipelined with a synchronous enable and reset."

von Selbständiger (Gast)


Lesenswert?

>"All designs are pipelined with a synchronous enable and reset."

Was noch nicht erklärt, wie die Daten rauskommen. Es muss JE Datenwort 
JEDE Frequenzamplitude berechnet werden.

Auf den ersten Blick sieht es so aus, als kommt eine Art Data Valid 
nachdem ein neues Datenwort verfügbar ist. Gfs kommen ab dort N 
Kombinationen aus R/I für jede Frequenz heraus. Das bedeutet, dass man 
nur alle N Takte ein neues Datenwort einfüttern kann.

Bei mindestens 30 MHz für ein langsam getaktetes FPGA käme man bei 1024 
Anteilen auf 30kHz. Reicht gerade für Audio.

von Günter -. (guenter)


Lesenswert?

Gerald schrieb:
> Es ist die http://www.opencores.org/project,cf_fft
>

Hallo Gerald,

was du da nutzt ist eine FFT die von Tom Hawkins in Confluence erzeugt 
wurde und dann in VHDL oder Verilog konvertiert wurde.

Von der Beschreibung sieht es so aus als wenn data_0_i die geradzahligen 
Eingabedaten und data_1_i die ungeradzahligen Eingabedaten annimmt. 
Daher kann eine 2048 Punkte FFT in 1024 Cyclen abgearbeitet werden.

Die Real- und Imaginärteile werden zusammengesetzt. Die MSB-bits sind 
der Realteil und die LSB-bits der Imaginäteil.

Das ganze ist eine Pipelined Architektur. D.h. mit dem ersten Takt 
werden die Datenpunkte 0 und 1 eingegeben, mit dem zweiten Takt 2 und 3 
usw. Daraus folgt das bei einer 2048 Punkte FFT alle Daten nach 1024 
Takten eingegeben sind. Vielleicht hilft auch das folgende Datenblatt um 
es zu verstehen:

http://www.dilloneng.com/documents/FFT_PIPE_Candidate_core_data_sheet.pdf

Unterschied ist nur das hier nicht zwei Datenworte auf einmal ein 
getaktet werden, sondern nur eins.

Was ich nicht aus der Beschreibung lesen konnte ist was für eine FFT-Typ 
implementiert ist und ob damit die Eingangs- oder Ausgangsdaten 
bit-reversed sind. Oder ob sogar eine Einheit vorhanden ist um die 
Eingangs- bzw Ausgangsdaten in richtiger Reihenfolge zu nutzen.

Viele Grüße,

Günter

p.s: Tom Hawkins hatte eine Zeit für Dillon Engineering gearbeitet.

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.