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 | signal n23 : unsigned(15 downto 0); |
2 | :
|
3 | :
|
4 | n23 <= n22(30 downto 30) & |
5 | n22(29 downto 29) & |
6 | n22(28 downto 28) & |
7 | n22(27 downto 27) & |
8 | n22(26 downto 26) & |
9 | n22(25 downto 25) & |
10 | n22(24 downto 24) & |
11 | n22(23 downto 23) & |
12 | n22(22 downto 22) & |
13 | n22(21 downto 21) & |
14 | n22(20 downto 20) & |
15 | n22(19 downto 19) & |
16 | n22(18 downto 18) & |
17 | n22(17 downto 17) & |
18 | n22(16 downto 16) & |
19 | n22(15 downto 15); |
Warum schreibt er nicht:
1 | signal n23 : unsigned(15 downto 0); |
2 | :
|
3 | :
|
4 | n23 <= n22(30 downto 15); |
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...
was heißt "über einen Index anzusprechen"? wie spreche ich das ausgangssignal an um werte mit entsprechenden werten zu bekommen?
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.
Wieso nimmt denn keiner die FFT die im ISE vorhanden ist? Muß man dafür Lizenzgebühren bezahlen?
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?
Muss die Welchmethode nach der FFT angweandt werden? Wie implementiere ich sie am Besten? MfG
@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
hier sieht man 3 zusammengemischte Frequenzen im input datenstrom und die analyze im output: 3 frequenzen und ihre gespiegelten pendants
>Nach der Unschärferelation ist deine Frequenzauflösung 5GHz
Seit wann ist das eine "Unschärferelation "???
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.