Ich habe von opencores einen vhdl fft-code heruntergeldaen. Leider gibt
es hierzu keine Dokumentation, zumindest habe ich keine gefunden.
Deshalb die Fragen: warum gibt es 2 Dateneingänge und 2 Datenausgänge?
Wofür sind die anderen Eingänge, vor allem i3? Und das allerwichtigste:
Wie interpretiere ich die Ausgänge, wenn ich z.B. an einem Eingang ein
Sinussignalanlege, dann bekomme ich an beiden Datenausgängen der fft
das selbe Sinussignal wieder raus, nur zeitlich etwas nach hinten
verschoben, dabei möchte ich doch eigentlich ein Frequenzspetrum. Gibt
es eine Möglichkeit, ein Frequenzspektrum vom Eingangssignal zu
bekommen?
MfG
Hast du dir schon mal grundlegend das Thema FFT angesehen?
> Deshalb die Fragen: warum gibt es 2 Dateneingänge und 2 Datenausgänge?
Ich wage sogar die Frage zu stellen: warum nur 2 Eingänge und 2
Ausgänge?
Wenn ich mir den Code so ansehe, dann ist der komplett unleserlich und
ohne Dokumentation unbrauchbar.
Zudem möchte ich einige der Konstrukte in Frage stellen:
1
signaln23:unsigned(15downto0);
2
:
3
:
4
n23<=n22(30downto30)&
5
n22(29downto29)&
6
n22(28downto28)&
7
n22(27downto27)&
8
n22(26downto26)&
9
n22(25downto25)&
10
n22(24downto24)&
11
n22(23downto23)&
12
n22(22downto22)&
13
n22(21downto21)&
14
n22(20downto20)&
15
n22(19downto19)&
16
n22(18downto18)&
17
n22(17downto17)&
18
n22(16downto16)&
19
n22(15downto15);
Warum schreibt er nicht:
1
signaln23:unsigned(15downto0);
2
:
3
:
4
n23<=n22(30downto15);
Der Code sieht für mich irgendwie automatisch generiert aus, weil
jeglicher sinnvoller Kommentar fehlt und die Signalnamen eigentlich
unbrauchbar sind... :-/
Ja kann gut sein dass der Code unbrauchbar ist, nichtsdestotrotz würde
ich gerne wissen, wie ich aus dem Ausgangssignal einer fft in vhdl das
Frequenzspektrum herausbekomme, das normale ausgangssignal ist ja auch
zeitabhängig...
> Ausgangssignal einer fft ...
Das Ausgangssignal einer FFT ist ein Feld mit Werten. Und darin sind die
einzelnen Frequenzen einfach über einen Index anzusprechen...
Die grundlegende Theorie zur FFT ist dir geläufig?
Eine FFT mit z.B. 16 Punkten hat 16 Eingangsdatenworte aus dem
Zeitbereich.
Das Ergebnis der FFT sind 16 Datenworte im Frequenzbereich.
Du speicherst für eine 1024er FFT also 1024 analoge Werte in ein Feld.
Dann lässt du die FFT draus los. Und bekommst nach Beendigung der
Berechnung ein Feld, in dem das Spektrum abgelegt ist.
Du brauchst also (grob gesagt) zum Einspeichern der Werte einen Index
und zum Auslesen des Spektrums auch einen...
Ja ok jetzt hab ich am Ausgang einen Index mit Werten, aber wie bekomme
ich daraus jetzt Frquenzabhängige Werte, mein ausgang sieht ja jetzt so
aus: Zum zeitpunkt x ist mein ausgang y, aber ich möchte ja bei der
Frequenz f einen zugehörigen wert x, also mein Frequenzspektrum. zum
Beispiel bei 1 khz ist mein zugehöriger wert 4 für eine bestimmte
funktion.
>> Die grundlegende Theorie zur FFT ist dir geläufig?
Du hast ein Eingangsfeld und ein Ausgangsfeld. Das Eingangsfeld enthält
Zahlenwerte im Zeitbereich, das Ausgangsfeld enthält Zahlenwerte im
Frequenzbereich.
>> Die grundlegende Theorie zur FFT ist dir geläufig?
Ich möchte sogar noch eins weitergehen:
Die grundlegende Theorie zur Umwandlung vom Zeit- in den Frequenzbereich
ist dir geläufig. Und vor allem, was die entsprechenden Werte dann
darstellen?
> Zum zeitpunkt x ist mein ausgang y, aber ich möchte ja bei der> Frequenz f einen zugehörigen wert x, also mein Frequenzspektrum. zum> Beispiel bei 1 khz ist mein zugehöriger wert 4 für eine bestimmte> funktion.
Kapier ich nicht :-/
Zeichne doch mal ein Bild dazu...
Ok mir ist nicht ganz klar was im Ausgangsbereuch meiner FFT in VHDL
angezeigt wird, ich will ein Frequenzspektrum haben wie in der ersten
Datei(Matlabfft), wo ich einen 50 Hz sinus angelegt habe und mir das
Frequenzspektrum auch eine Amplitude bei 50 Hz anzeigt.wie komme ich
nun von dem Ergebnis der VHDLFFT( 2. Datei, VHDLfft, imaginär und
realteil des Ausganges sind angezeigt)bei der ich als Realteil eine
Sinus aufgelegt habe und den imaginärteil leergelassen habe, auf so ein
Frequenzspektrum wie in Datei 1?
Zeig dir doch einfach mal die Zahlenwerte in Modelsim als Analogkurven
an
(so wie hier der Ausgang einer DDFS:
http://www.lothar-miller.de/s9y/uploads/Bilder/DDFS.gif)
dann erkennst du leicht, ob da überhaupt irgendwas Sinnvolles rauskommt.
sieht glaub ich nicht so sinnvoll aus oder kann man damit was anfangen?
die sinuswelle ist der eingang der fft (imaginärteil leer) und reaus und
imraus die ausgänge.
Das Matlab-Spektrum scheint auf jeden Fall auf Daten im Zeitbereich zu
basieren, auf die schon eine Fensterfunktion angewandt wurde. Ansonsten
sähe man keinen endlich breiten Peak, sondern nur eine diskrete Linie
bei der Grundfrequenz 50Hz.
Ist die Breite des Abtastzeitfensters nicht exakt ein Vielfaches aller
im Signal enthaltenen Schwingungen, hat das berechnete Spektrum nicht
allzu viel mit dem Eingangssignal zu tun, sondern besteht aus einer
Vielzahl von Frequenzen. Aus diesem Grunde wendet man vor der
Fouriertransformation eine Fensterfunktion (z.B. Hamming, Hanning, usw.)
an.
Leider vergessen nämlich viele Leute, dass die Fouriertransformation nur
dann ein korrektes Spektrum handelt, wenn das Eingangssignal eine
Periodizität mit exakt der Breite des Abtastfensters besitzt!
Du must doch den Realteil mit dem Imaginärteil verrechnen.
z.B. Wurzel aus(Re^2 + Im^2) das Ergebnis kann man dann noch in db
umrechnen
Außerdem mus man das Testsignal noch fenstern. (siehe Wikipedia
Fensterfunktion http://de.wikipedia.org/wiki/Fensterfunktion)
Dort ist z.B. das Hamming-Fenster beschrieben.
Man berechnet anhand der angegebenen Formel die Parameter für das
Hamming-Fenster. Wenn Dein Testsignal z.B. aus 512 Werten besteht, dann
benötigst Du aich 512 Koeffizienten für die Fensterung. Diese errechnet
man mit Hilfe der Funktion die auf Wikipedia steht z.B. mit Exel aus.
Kann dann aus den Werten einen Graphen erzeugen um das Ergebnis zu
überprüfen. Diese Koeffizienten speichert man in einem Excel File ab.
Anschließend verwendet man das Xilinx Tool "mem_edit" damit kann man ein
Excel-File importieren und dieses dann als ein BlockRAM
Konfigurationsfile abspeichern.
Somit kannst Du dann im ISE ein BlockRAM mit Hilfe des IP-Core-Wizeard
erstellen und das Konfigurationsfile für den Block-RAM benutzen. Somit
stehen im FPGA die Koeffizienten für die Fensterfunktion zur Verfügung.
Die Fensterfunktion ist dann wieder ganz einfach. Du must nur Dein
Testsignalvektor mit dem Koeffizientenvektor multiplizieren. Das heist
Testsignalwert 0 mit Koeffizient 0 dann Testsignalwert 1 mit Koeffizient
1 usw.
Somit hast Du das Testsignal mit einer Fensterfunktion versehen.
> Außerdem mus man das Testsignal noch fenstern.
Warum denn MÜSSEN? Man kann auch ein Rechteckfenster nehmen, nur
sollte man dann auch wissen, wie man das Ergebnis zu interpretieren
hat...
Aber aus dem Ergebnis oben kann irgendwie nichts Sinnvolles abgelesen
werden...
Als ein Rechteckfenster ist nun wirklich nicht die beste Wahl. Der
Aufwand für die Implementierung eines Rechteckfensters und eines
Hamming-Fensters bleibt gleich.
> Als ein Rechteckfenster ist nun wirklich nicht die beste Wahl.
Trotzdem sollte auch mit einem Rechteckfenster nicht so etwas
undefiniertes rauskommen wie im Screenshot...
> Der Aufwand für die Implementierung eines Rechteckfensters und eines> Hamming-Fensters bleibt gleich.Diese Aussage solltest du dir aber nochmal grundlegend genau
überdenken :-o
Es kommt immer darauf an wie man es implementiert :-)
Du hast ja Recht ein Rechteckfenster ist sehr einfach zu implementieren.
Das was dort rauskommt ist auf jedenfall falsch.
Jedoch muß man sagen das er gebreits einiges geschafft hat. Mach weiter
so und es wird noch etwas. Nie den Kopf hängen lassen. ich habe auch
überlegt ob ich die FFT auf dem FPGA mache, jedoch habe ich deutlich
mehr Daten.
Ich habe ein Board gebaut, mit 14Bit 800Msps digitalisiert. Da kommt
schon richtig was zusammen. Vielleicht werde ich auch mal so eine FFT
auf der Grafikkarte probieren.
Johann schrieb:> Wieso nimmt denn keiner die FFT die im ISE vorhanden ist? Muß man dafür> Lizenzgebühren bezahlen?
Es geht bei so etwas nicht nur um die Lizenzkosten, sondern ggf. auch
darum, eine Mischung von Quellen, die unter verschiedenen und ggf.
inkompatiblen Lizenzen stehen, zu vermeiden.
Gerade auch bei Bibliotheken, die von Prozessorherstellern
bereitgestellt werden, kann man doch erhebliche Probleme bekommen, wenn
man sie für ein Projekt verwendet, das z.B. unter die GPL gestellt wird.
Zwar sind solche Bibliotheken zwar meist kostenlos erhältlich, aber an
die Auflage gebunden, sie ausschließlich auf Bausteinen des betreffenden
Herstellers einzusetzen. Die Anforderung halte ich auch für
ausgesprochen legitim.
Verwendet man in einem FPGA einen Picoblaze, Microblaze oder NIOS, ist
man ja lizenzmäßig auch an die jeweiligen FPGAs von Xilinx bzw. Altera
gebunden, unabhängig davon, ob man es durch irgendwelche technischen
Kniffe schaffen würde, den jeweiligen Core auf einem Fremd-FPGA zum
Laufen zu bringen.
Und von Tool-Herstellern bekommt man ja auch Softcores, andere IP-Blöcke
und Softwarebibliotheken bereitgestellt, die man eben auch nur zusammen
mit den jeweiligen Tools einsetzen darf, z.B. den MIPS-kompatiblen
TSK3000 von Altium/Tasking.
> Wieso nimmt denn keiner die FFT die im ISE vorhanden ist?
Schwenk dann mal dein Design auf Altera oder Lattice über...
> Wieso nimmt denn keiner die FFT die im ISE vorhanden ist?
Ziemliche Verallgemeinerung, nicht wahr?
Wer nimmt sie deines Wissens nach sonst noch nicht?
Bevor ich ein Projekt umsetze, lege ich mich bereits auf einen FPGA
Hersteller fest und nach Möglichkeit auf den Type (Virtex 5 Spartan 3
oder Spartan 6)
Viel schlimmer ist es open Cores zu verwenden die dann nicht gehen und
man hoffen muß das jemand einem dann weiter helfen kann. Ich denke mal
die die meisten hier einen engen Zeitplan haben und es sich nicht
leisten können Module zu debuggen. Deshalb würde ich NUR Cores verwenden
die von Xilinx oder Drittanbieter sind.
Danke für die Tips, die Fensterung soll auch noch kommen wenn die FFT
erstmal richtig durchgeführt und interpretiert ist, auch wenn ich altera
nutze und nich xilinx aber egal. Wenn ich auf meine FFT eine clock von
100ps lege, habe ich doch eine Abtastfrequenz von 10 GHz, am Ende
bekomme ich ein Feld mit Daten, die mir nacheinander ausgegeben werden.
Wenn ich als Ausgang 64 Felder habe, ist es dann richtig, dass das 6.
Feld mir den Ausgangswert des Bereiches 781 bis 937 Mhz anzeigt?
((10 Ghz/ 64) *5 = 781Mhz, (10 Ghz/64)*6= 937Mhz)
Die 2. Hälfte( 5-10Ghz) kann ich verwerfen, wegen Spiegelung oder?
@Dennis --> Welch ist ein Fenster, wenn dann muss es vor der FFT
angewandt werden.
@Peter --> Um von deinen Ausgangswerten das sog. Powerspektrum zu
bekommen musst Du den Betrag der beiden Komplexen Ausngangsvektoren
bilden mit sqrt( RE[i]^2 +IM[i]^2 ).
Wenn Du eine Sample-Rate von 10GS hast ist die Nyquistfrequenz 5GHz die
Du in 64 Quantisierungsblöcken vorliegen hast. Nach der
Unschärferelation ist deine Frequenzauflösung 5GHz/64=78,125MHz, das
Spektrum sieht nun so aus:
0 Bandenergie von 0MHz...78,125MHz
1 ...
2 ...
3 ...
4 ...
5 Bandenergie von 390,625MHz...468,75MHz ( = 6. Feld im Spektrum)
...
...
...
63 Bandenergie von 4,921,785GHz.....5GHz