Forum: FPGA, VHDL & Co. Xilinx FFT hard core


von Kris M. (kristian)


Lesenswert?

Hi,

hat schon mal jemand mit einem Xilinx FFT hard core gearbeitet?

Ich hab damit folgendes Problem:
Egal was für Signale ich in die FFT hineingeben, das Ausgangssignal im 
Frequenzbereich ist immer verdreht.

Hier ein Beispiel:
Das Eingangssignal ist ein Sinus mit einer Frequenz von 2 Hz. Als 
Ausgang der FFT erwarte ich folgendes Signal:
-> f(0)=0; f(1)=0; f(2)=1; f(3)=0; …; f(N-3)=0; f(N-2)=-1; f(N-1)=0; 
f(N)=0;

Die FFT liefert allerdings folgendes Ausgangssignal:
-> f(0)=0; f(1)=0; f(2)=-1; f(3)=0; …; f(N-3)=0; f(N-2)=1; f(N-1)=0; 
f(N)=0;

Ich verstehe nicht wieso das Ausgangssignal verdreht ist. Hat jemand von 
euch eine Idee? Ist es möglich das Ausgangssignal zu verdrehen?

Gruß,
Kristian

von Duke Scarring (Gast)


Lesenswert?

Meistens wird das Ergebnis in einem RAM abgelget. Es verbietet Dir 
keiner, den rückwärts auszulesen.

Duke

von Kris M. (kristian)


Lesenswert?

Klar verbietet es einem keiner den rückwärts auszulesen, aber was ist 
der Grund dafür?

Will eine Autokorrelation mit einem FFT und invers FFT realisieren. Da 
nun der erste FFT die Daten verkehrt herum ausgibt muss ich die ganzen 
Daten zwischenspeichern. Kostet nur unnötig Resourcen.

von Kris M. (kristian)


Lesenswert?

Hat denn niemand Erfahrungen mit den FFT hard core von Xilinx??

von Gerd N. (mrgne)


Lesenswert?

Seit wann hat Xilinx nen FFT Hard Core? Die DSP Blöcke in den Virtex und 
im Spartan3A DSP sind mir bekannt aber ein FFT Hard Core!?!?

Klär mich mal auf, vielleicht kann ich helfen.

von Günter -. (guenter)


Lesenswert?

Bei radix-2 FFT sind je die Daten normalerweise bit-reversed, nicht 
einfach verdreht. Schau doch mal im Datenblatt von dem core nach den du 
nutzt.

Wenn du FFT/IFFT machst, kann es sinnvoll sein für die FFT einen 
Decimation In Frequency (DIF) und für die IFFT einen Decimation In Time 
(DIT) cores zu nutzen. Dann sind zwar die Daten im Frequenzbereich 
verdreht, aber Ein- und Ausgang von dem System sind in normaler 
Anordnung.

von Kris M. (kristian)


Lesenswert?

Da hatte ich mich vertan. Der Virtex hat natürlich keinen fft hard core 
sondern einen normalen soft core. Sorry!

Das stimmt, die Daten sind bei radix-2 FFT bit-reversed, verursacht 
durch die Butterfly-Operationen. Hab in den core-Optionen "Natural 
order" ausgewählt, sodass die durch die Butterfly verursachte 
bit-reversierung aufgehoben wird.

Bieten die Xilinx cores "Decimation in time" an? Hab da leider nichts 
auf Anhieb gefunden.

von Duke Scarring (Gast)


Lesenswert?

@Kris Maier:
> Bieten die Xilinx cores "Decimation in time" an? Hab da leider nichts
> auf Anhieb gefunden.

Suchst Du vielleicht den "CIC Compiler"?
(Core Generator -> Digital Signal Processing -> CIC Compiler)

Duke

von Günter -. (guenter)


Lesenswert?

Laut Datenblatt 
http://www.xilinx.com/support/documentation/ip_documentation/xfft_ds260.pdf 
wird für die Burst I/O Architektur die Decimation in Time Variante 
genommen und für die Pipelined Architektur die Decimation in Frequency.

von Georgi (Gast)


Lesenswert?

Ich habe den FFT Core 7 instanziert, bekomme aber komische Werte. Die 
Architektur scheint zu laufen, aber die Werte sind seltsam. Die Indizes 
kommen nicht linear heraus sondern starten so 0,256,512,768, später 
kommen dann die fehlenden. Das habe ich in der Doku so nicht gesehen.

Ergo habe ich ein DP-RAM drangehängt und schreibe die Werte passend zu 
den Indizes in die Adressen. Dort kommen aber auch nur komische Werte 
raus. Später lese ich sie von der anderen Seite her aus.

Ich habe mal einen stark ausgesteuerten Sinus auf die FFT draufgegeben, 
aber sehe nur Rauschen in den Werten.

Hat jemand dazu eine Info?

Ich denke, ich habe einige Parameter falsch eingestellt oder nutze die 
FFT falsch.
1
component myFFT2048
2
  port (
3
  clk: IN std_logic;
4
  start: IN std_logic;
5
  xn_re: IN std_logic_VECTOR(15 downto 0);
6
  xn_im: IN std_logic_VECTOR(15 downto 0);
7
  fwd_inv: IN std_logic;
8
  fwd_inv_we: IN std_logic;
9
  scale_sch: IN std_logic_VECTOR(11 downto 0);
10
  scale_sch_we: IN std_logic;
11
  rfd: OUT std_logic;
12
  xn_index: OUT std_logic_VECTOR(10 downto 0);
13
  busy: OUT std_logic;
14
  edone: OUT std_logic;
15
  done: OUT std_logic;
16
  dv: OUT std_logic;
17
  xk_index: OUT std_logic_VECTOR(10 downto 0);
18
  xk_re: OUT std_logic_VECTOR(15 downto 0);
19
  xk_im: OUT std_logic_VECTOR(15 downto 0));
20
end component;

Wie müsste man die FFT parametrieren?

von Günter -. (guenter)


Lesenswert?

Georgi schrieb:
> Ich habe den FFT Core 7 instanziert,

...

>
> Ich habe mal einen stark ausgesteuerten Sinus auf die FFT draufgegeben,
> aber sehe nur Rauschen in den Werten.
>

Das ist vielleicht nicht so sinnvoll, denn wenn du nicht richtig 
skalierst wirst du einen Überlauf erhalten und dann sind die 
Ausgangswerte ungültig.

Ein einfacher Test ist alle reellen Werte z.B. auf 1 zu setzen. Dann 
kommt erst mal nur der DC-Wert als Ausgang. Gut, zugegeben, dann hast du 
immer noch nicht Klarheit über die Indexierung, siehst aber erst mal 
grundsätzlich ob es überhaupt läuft.

> Hat jemand dazu eine Info?
>

Ich kenne den Core nicht, allgemein würde ich mit einer kleineren Größe 
anfangen, eine die noch nachvollziehbar ist. Achte darauf das du auch 
die FFT und nicht die IFFT berechnest. Nehme erst mal ein kleines Signal 
das keinen Überlauf erzeugt und setze die Skalierung so das nicht 
skaliert wird.

Gruß,

Günter

von Georgi (Gast)


Lesenswert?

Vielleicht noch Folgendes: Ich gebe den Sinus auf den Realteil der FFT, 
den Imag belege ich mit Null. Das Timing fahre ich so wie in der 
Application note und gelange zu Folgendem:

Wenn ich ich die parametrierbare Tiefe der FFT auf "111...1" stelle, 
dann kommen nur ab und an Nadeln als -1 aus der FFT raus ansonsten 0

Wenn ich ich die parametrierbare Tiefe der FFT auf "10...0" stelle, also 
die Häfte, dann habe ich besagtes Rauschen.

Simuliert wird mit ps, wie es Xilinx vorschlägt.

von Georgi (Gast)


Lesenswert?

Ich meinte nicht die Tiefe, sondern das Scaling. Ist aber nun draussen. 
Trotzdem kein Ergebnis.

von Georgi (Gast)


Angehängte Dateien:

Lesenswert?

Das kommt raus : 100kHz, bei einer 2048, jetzt lineare Ausgabe der Werte 
von 0...2047. Peaks sowohl im Re als auch Im bei 0 und 2027. Ich hätte 
eine einizge Linie im bereich der 100kHz Frequenz erwartet.

von Georgi (Gast)


Angehängte Dateien:

Lesenswert?

und das kommt auf höhrere Frequenz heraus - wie interpretiere ich das 
nun?

von Günter -. (guenter)


Lesenswert?

Georgi schrieb:
> Das kommt raus : 100kHz, bei einer 2048, jetzt lineare Ausgabe der Werte
> von 0...2047. Peaks sowohl im Re als auch Im bei 0 und 2027. Ich hätte
> eine einizge Linie im bereich der 100kHz Frequenz erwartet.

Nee, das stimmt schon, wenn ich mich recht entsinne, du bekommst einen 
Peak bei n und bei N-n. Für Sinus ist der eine positive, der andere 
negative. Für Cosinus beide positiv.

von Günter -. (guenter)


Lesenswert?

Georgi schrieb:
> und das kommt auf höhrere Frequenz heraus - wie interpretiere ich das
> nun?

Ich kenne nicht die Taktfrequenz im Verbindung mit dem Nutzsignal, aber 
kann das durch den Leckeffekt entstehen?

von Georgi (Gast)


Lesenswert?

Ich weiss nicht so recht - die peaks mögen ja in Ordnung sein, ich 
interpretiere das so, dass dort alle restlichen unbehandelten Frequenzen 
kummulieren, aber ich hätte doch gerne mal einen einzigen ordentlichen 
peak inmitten meines Spektrums.

Ich haue da einen einzigen Sinus aus einer Tabelle drauf, der im 
Wesentlichen als Grundsignal auftauchen muss.

Nix iss...

von Micha (Gast)


Lesenswert?

Hallo,

wie gibst Du die Daten am XN_RE-Input ein ?
z.B. bei einem Sinus 0x00-0xff bei 8-Bit,
wobei 0x00 die negative Amplitude und 0xff die positive Amplitude ist ?

laut Datenblatt soll das im Zweierkomplement Format sein,
das Byte müßte also als signed betrachtet werden,
8.Bit wäre das Vorzeichen

Grüße,
Micha

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.