www.mikrocontroller.net

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


Autor: Kris Maier (kristian)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Duke Scarring (Gast)
Datum:

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

Duke

Autor: Kris Maier (kristian)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kris Maier (kristian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn niemand Erfahrungen mit den FFT hard core von Xilinx??

Autor: Gerd N. (mrgne)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kris Maier (kristian)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Duke Scarring (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laut Datenblatt 
http://www.xilinx.com/support/documentation/ip_doc... 
wird für die Burst I/O Architektur die Decimation in Time Variante 
genommen und für die Pipelined Architektur die Decimation in Frequency.

Autor: Georgi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
component myFFT2048
  port (
  clk: IN std_logic;
  start: IN std_logic;
  xn_re: IN std_logic_VECTOR(15 downto 0);
  xn_im: IN std_logic_VECTOR(15 downto 0);
  fwd_inv: IN std_logic;
  fwd_inv_we: IN std_logic;
  scale_sch: IN std_logic_VECTOR(11 downto 0);
  scale_sch_we: IN std_logic;
  rfd: OUT std_logic;
  xn_index: OUT std_logic_VECTOR(10 downto 0);
  busy: OUT std_logic;
  edone: OUT std_logic;
  done: OUT std_logic;
  dv: OUT std_logic;
  xk_index: OUT std_logic_VECTOR(10 downto 0);
  xk_re: OUT std_logic_VECTOR(15 downto 0);
  xk_im: OUT std_logic_VECTOR(15 downto 0));
end component;

Wie müsste man die FFT parametrieren?

Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Georgi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Georgi (Gast)
Datum:

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

Autor: Georgi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Georgi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
und das kommt auf höhrere Frequenz heraus - wie interpretiere ich das 
nun?

Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Georgi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.