Fast Furier Transformation
-
Hallo zusammen!
Ich arbeite mit Matlab und den funktionen fft und ifft. Ich möchte gerne die .m files in alleinstehene, ausführbare Dateien umwandeln. Ich weis, dass es den compiler von Matlab gibt. Ich möchte dies aber gerne auf einen nicht komerziellen Weg lösen.
Mir wäre es auch egal, wenn ich alles in c++ schreiben müsste.
Das Programm soll,(wenn es fertig wird) spannunswerte erfassen, und davon einne fft bilden. Mein erster Gedanke war, dass ich die Werte in ein Array packe und dann fft(Array); ausführe. So funktioniert das halt in Matlab.Ich möchte mich nicht unbedingt mit der FFT selbst beschäftigen sondern nur anwenden. Gibt es vl eine Implementierung für c++, die einem ähnlichen Prinzip unterliegt?
danke im Voraus
-
Du suchst also einfach eine FFT Implementierung in C oder C++? Sowas gibts wie Sand am Meer z.b. http://www.fftw.org/
-
Hi!
Ich kann dir folgende Seiten empfehlen:
http://www.inf.fh-flensburg.de/lang/algorithmen/fft/fft.htm
Ganz unten gibt es ein Beispiel für Java. Das muss man jedoch etwas auseinanderklamüsern:
Du Funktion fft(a, n, lo, w)
a ist ein Array aus komplexen Werten. Wenn du ein reelles Signal hast(beispielsweise Mikrofondaten), dann machst du folgendes:
a[index].re = signal[index]
a[index].im = 0.0n ist die Anzahl an Messwerten. Sollte eine 2er Potenz á la 1024, 2048, 4096 usw. sein.
lo setzt du beim ersten Aufruf zu 0
w wird so berechnet:
w.re = cos(360°/n) // bzw. cos(2Π/n)
w.im = sin(360°/n) // bzw. sin(2Π/n)Das Ergebnis ist wiederum ein Array aus komplexen Zahlen. Wenn du aber das in reelle Zahlen darstellen willst, kannst du sie so zurückrechnen:
ReellesArray[Index] = sqrt(a[Index].re² + a[Index].im²)Ein paar Gesetzmäßigkeiten, die ich bei der Umsetzung festgestellt habe:
Bei einer Samplerate von 4096 Hz kann man die Frequenzanteile bis 2048 Hz nur korrekt auswerten. Das ReelleArray spiegelt sich ab n/2. Der Index I des Arrays spiegelt den Frequenzanteil der Frequenz SampleRate/Samples*I/2.0 Hz wieder. Warum /2.0 weiß ich selber nicht.Es werden 3 Rechenarten für komplexe Zahlen benötigt:
R = A+B
R.re = A.re + B.re
R.im = A.im + B.imR = A-B
R.re = A.re - B.re
R.im = A.im - B.imR = A*B
R.re = A.re*B.re - A.im*B.im
R.im = A.re*B.im + A.im*B.reZu guter Letzt
z=1;
Ich hoffe, ich konnte damit helfen. Habe mich jetzt in letzter Zeit selber damit herumgequält.
mfg olli
-
Also ich würde da auf eine fertige Lösung bauen. Natürlich kann man sich eine FFT relativ schnell selbst programmieren, aber die FFTW heißt nicht umsonst so. Da wurde schon einiges an Arbeit reingesteckt.
-
vielen dank!
werd mich da mal dahinterklemmen!