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
entitycf_fft_256_8is
2
port(
3
signalclock_c:instd_logic;
4
signalenable_i:inunsigned(0downto0);
5
signalreset_i:inunsigned(0downto0);
6
signalsync_i:inunsigned(0downto0);
7
signaldata_0_i:inunsigned(15downto0);
8
signaldata_1_i:inunsigned(15downto0);
9
signalsync_o:outunsigned(0downto0);
10
signaldata_0_o:outunsigned(15downto0);
11
signaldata_1_o:outunsigned(15downto0));
12
endentitycf_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.
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?
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
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.
> 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
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.
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.
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.
>"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.
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.