Fast Fourier Transformation - frequenzspektrum

Neue Frage »

jbmes Auf diesen Beitrag antworten »
Fast Fourier Transformation - frequenzspektrum
Guten Tag,

mir fehlen gerade die mathematischen Hintergründe um das Resultat eine FFT zu plotten.

Ich habe ein Signal eines Sensors mit n Werten, durch linearer Interpolation erstelle ich neue Werte mit äquidistanten Zeitabständen. Diese tue ich nun in eine FFT und bekomme die dazugehörigen Real und Imaginärteil. Nun würde ich gern das Frequnzspektrum diese Signals zeichnen.

Hier fangen die Probleme bei mir an.

Ich würde gern von 0 bis 3 Hz plotten.
folgende Formel habe ich gefunden um die Frequenz zu ermitteln

f(x) = (x *zeitabstand) / (n*zeitabstand) Wie stelle ich nun das Intervall von 0 bis 3 Hz da?

Gebt mir auch gerne ein Link,habe zwar wiki schon durchforstet, aber wahrscheinlich bin ich zu dumm um Rückschlüsse ziehen zu können.


Danke für die hilfe
Lampe16 Auf diesen Beitrag antworten »
RE: Fast Fourier Transformation - frequenzspektrum
Zitat:
Original von jbmes
...Nun würde ich gern das Frequnzspektrum diese Signals zeichnen....


Du kannst entweder Real- und Imaginärteil als diskrete Punkte über der f-Achse getrennt zeichnen oder in der komplexen Re-Im-Ebene als Ortskurve.

Wenn dein Zeitdatensatz die Zeitspanne T mit n Werten abgetastet hat, ist die niedrigste Frequenz 1/T und die höchste n/T.
jbmes Auf diesen Beitrag antworten »

Ich versuche es mal an einem Bsp. um mein Verständnis zu fördern.

ich habe gerade eine 5s Aufnahme gemacht und erhalte 736 Sample mit einem Abstand von 7ms.

Also wäre T ja 5152ms bzw. 5,152 s
Meine niedrigste Frequenz wäre also 1/T = 0.194Hz
Meine höchste Frequenz wäre n/T = 143Hz

Wenn ich also den Wert für 3Hz haben möchte nehme 3*5.152 = 15.456, also hat der 15 Sample den Wert für 3 Hz. Ist das so richtig?

Da ich den „Funktionsplotter“ selber programmiere würde ich dann nicht einfach die Frequenzachse in 143 Teile teilen und dann den Imaginärteil der jeweiligen Frequenz in y abtragen?!


Ich hoffe dieses praktische Bsp. hilft mir alles besser zu verstehen.

Vielen dank bis hier... .

Gruß jbmes
Lampe16 Auf diesen Beitrag antworten »

Zitat:
Original von jbmes
...
Wenn ich also den Wert für 3Hz haben möchte nehme 3*5.152 = 15.456, also hat der 15 Sample den Wert für 3 Hz. Ist das so richtig?

Ja, wegen Ordinalzahl gerundet.

Zitat:
Original von jbmes
Da ich den „Funktionsplotter“ selber programmiere würde ich dann nicht einfach die Frequenzachse in 143 Teile teilen...

Ja.

Zitat:
Original von jbmes
und dann den Imaginärteil der jeweiligen Frequenz in y abtragen?!


Wenn du die Ortskurve meinst: Ja! Und den Realteil als x-Wert!
jbmes Auf diesen Beitrag antworten »

Hey, also erstmal wieder vielen, vielen Dank! Da ich viel in verschiedenen Forum bin ist es keine Selbstverständlichkeit vernünftige Antworten zu bekommen.. .

Ich möchte folgende Resultat haben:

Edit (mY+): Anstatt des externen Links wurde die Grafik an den Beitrag angehängt. Vorschau klicken!

[attach]17227[/attach]

Wie ich auf die Frequenzachse komme ist mir nun klar(dank dir), ich dachte um den dazugehörigen Wert auf der Intensitätsachse zu bekommen müsste ich den Imaginärteil nehmen.. .
Die FFT gibt mir für meine Sensordaten folgende 15 Werte(die ersten 15, weiter unten) um wie gesagt bis zu 3Hz zu plotten. Wenn ich jetzt so eine Fkt wie die Plotts vom Link haben möchte welchen Wert nehme ich dann für y?

Tut mir sehr Leid, dass ich immer noch nicht so richtig weiter weis .(Ich komme mir vor wie jemand mit einem Schlüssel vor einer verschlossenen Tür der nicht weiter weis). Aber ich mag dein Zitat, mir fehlt ja anscheinend die Begabung.


0 29.442225582781248 0.0
7 0.7572567452642875 9.11324683213612
14 4.64891528858612 12.918993402243535
21 7.92342553216383 1.6853069533532854
28 -1.973446366252081 1.6121448530519817
35 1.7870100323560951 20.183835112506834
42 16.869683273528196 14.900797406348584
49 1.3805810933908222 -0.5324122634876751
56 -61.21503208080267 99.83155770536496
63 -22.536388846454138 -88.04274081227479
70 -14.671581289215718 -0.7406073935072202
77 5.159473922397039 -0.1213291731512404
84 0.5797509427514094 -10.511223994562064
91 -4.933058754437091 -6.513580035360867
98 -6.819511451731637 0.2482675110080584
Lampe16 Auf diesen Beitrag antworten »

Hallo jbmes,
ich muss (wahrscheinlich) zuerst etwas widerrufen, nachdem ich mir deine Daten angeschaut habe. Der 2. Wert des komplexwertigen Spektrums entspricht der niedrigsten Frequenz 1/T. Der 1. Wert ist die Summe der Messwerte und steht für den Gleichanteil. Bitte kontrolliere Letzteres, denn ich kenne ja deine Software nicht.

Die Intensität in der von dir angefügten Graphik ist höchstwahrscheinlich der Betrag der komplexen Fouriertransformierten, zu berechnen a la Pythagoras aus Real- und Imaginärteil.

Ich würde dir gern noch etwas erklären, damit du die ganze Sache mit mehr Verständnis angehen kannst, weiß aber nicht, wo ich dich abholen kann. Frage: Kennst du die Fourieranalyse periodischer Funktionen, die als Ergebnis die Sinus- und Kosinus-Koeffizienten liefert?
Schau dir auf jeden Fall schon mal die Abschnitte 6.3 bis 6.3.7 in dieser Formelsammlung an. Da wird nicht viel erklärt, aber du bekommst die Formeln für den periodischen Fall.
 
 
jbmes Auf diesen Beitrag antworten »

Hello again .... :-) ,

auch wenns nervt: VIELEN DANK!!!!

Ich kenne die Fourier Reihe, habe in dieser Woche von einem Rechtecksignal (ungerade) die Koeffizienten berechnet und bis zur 10 Oberschwingung geplottet.
War ein hartes Stück arbeit. Ich habe mich auch schon in http://www.dspguide.com/ eingelsen, finde das ein herliches Buch. Wie gesagt verstehe ich oft die Mathe dahinter nicht und das ganze soll mir einfach helfen. Ich hätte auch gern die FFT selber programmiert, leider habe ich erstmal diese genommen http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_(part_1)

ich kann dir leider nicht genau sagen ob das erste Element der Gleichanteil ist.

Würde mich sehr freuen wenn du mir die Sache etwas näher bringen kannst :-)
Weis immer noch nicht was ich plotten soll um die Schwingung bis zu 3Hz anzuzeigen.
LG Jbmes
Lampe16 Auf diesen Beitrag antworten »

Hallo jbmes,

erst mal was Grundsätzliches: FFT ist ein Sammelbegriff für verschiedene Verfahren, welche die DFT (Diskrete Fourier-Transformation) schnell berechnen. Zum Verständnis der Mathematik dahinter musst du dich mit der DFT beschäftigen. Darin steckt die Idee. Die FFT ist dann etwas für Mathematiker, die die DFT in Rekordhzeit schaffen wollen. Reden wir also über die DFT.

Man kann sich ihr von zwei Seiten annähern: Über die Fourier-Transformation für zeit- und wertkontinuierliche aperiodische energiebegrenzte Signale oder über die Fourier-Analyse, ebenfalls für zeit- und wertkontinuierliche, aber periodische Signale. Ich wähle den letztgenannten Weg.

Im ersten Fall (Fourier-Transformation) ist die Transformierte eine kontinuierliche (Spektral-)Funktion, im zweiten (Fourier-Analyse) eine Reihe von Koeffizienten, die man auch als Linienspektrum bezeichnet. In beiden Fällen kann man die Transformierte reell oder komplexwertig formulieren. Die komplexwertige Darstellung ist übersichtlicher.

Ich enge meine Erklärung jetzt auf die Fourieranalyse, ausgedrückt durch komplexwertige Koeffizienten ein. Die Berechnungsformel ist in dem von mir genannten Formelsammlungs-Link angegeben. Mit den Fourier-Amplituden und -Nullphasenwinkeln (6.3.5 bzw. 6.3.6) kannst du das Signal aus dem Linienspektrum zurückgewinnen, und zwar mit Gl. 6.3.2 .

Dein Messsignal, das nicht periodisch ist, kannst du (gedanklich) in ein periodisches Signal umdeuten, indem du es dir vorher und nachher immer wieder sich wiederholend vorstellst. Damit steht es für die Fourier-Analyse zur Verfügung. Als Nächstes stell dir dein Messsignal als Folge von extrem kurzzeitigen (Dirac-)Impulsen vor, deren Inhalt gleich dem Produkt von Abtastwert und Abtastintervall ist. Das ist nicht so abartig, wie es auf den ersten Blick scheint, weil eine näher an der Wirklichkeit liegende zeitkontinuierliche Treppenkurve auch als Impulsfolge (die Breite der Impulse ist jetzt gleich dem Abtastintervall) mit denselben Impulsinhalten zu deuten ist.

Die mit dieser Vorstellung nach 6.3.4 berechneten Fourier-Koeffizienten stehen mit den DFT-Werten in der Beziehung



Dabei ist die Anzahl der gemessenen Abtastwerte.

Du siehst, wie nahe die DFT und damit auch die FFT mit der Fourier-Analyse verwandt ist.

Zitat:
Original von jbmes
Wie gesagt verstehe ich oft die Mathe dahinter nicht...

Du musst dich auf jeden Fall mit der komplexen Rechnung vertraut machen.

Zitat:
Original von jbmesIch hätte auch gern die FFT selber programmiert, ...

Fang nach dem oben Gesagten lieber mit der DFT an. Übrigens solltest du dazu mit einer Programmiersprache arbeiten, die von vornherein die Regeln der komplexen Rechnung beherrscht. Ich empfehle dazu die Freeware Scilab. Die Einarbeitung ist eine Investition fürs Leben.

Zitat:
Original von jbmesich kann dir leider nicht genau sagen ob das erste Element der Gleichanteil ist.

Doch, das müsstest Du können, denn das erste Element sollte einfach die Summe aller Abtastwerte sein.

Melde dich wieder, wenn du noch Fragen hast. Du nervst nicht.
jbmes Auf diesen Beitrag antworten »

Hallo,

ich glaube um ein Stück weiter zu kommen muss ich wissen was der Gleichanteil ist, bei google bin ich bis auf Seite 6 gekommen, ohne wirkliche Erklärung des Gleichanteils bzw. dessen Bedeutung . Auch mein elektrotechnik buch"Gert Hagman - grundlagen der Elektronik) benutzt es zwar geht aber nicht wirklich drauf ein. Könntest du mir da weiter helfen, vieleicht war nur Gleichanteil zu wenig als g.. Begriff, aber das Buch ist eigentlich sehr gut. Weiterhin wird oft die Amplitude bzw. der Pythagoras durch die Hälfte der Sample geteilt, ich habe auch schon darüber gelesen. weist du den Hintergrund?? Die Analyse und das plotten mach ich mit Java und OpenGl auf einem Android Handy... . Ich arbeite gerade als Hiwi für nen BrückenbauProfessor, der das Handy zum Schwingungsmessen benutzen will... . Ich habe mir extra diese Aufgabe geholt um Fourier zu verstehen.Aus diesem Grund programmiere ich in Java und OpenGL. Ich habe mir aber schon das Matheprogramm runtergeladen und es sieht gut aus(und sogar open source ...) . Mir steht aber auch Matlab zur Verfügung und müsste es nur noch lernen. Weis nicht auf welches Pferd ich setzen soll um meine Resultate zu prüfen... .


Wie immer Danke!!!!

LG Jbmes

P.S. Auch in deiner Formelsammlung ist der Gleichanteil das Integral von zwei Grenzen... (weis aber nicht mehr damit anzufangen, bzw. die Aussage die dahinter steht).
Lampe16 Auf diesen Beitrag antworten »

Hallo Jbmes

Zitat:
ich glaube um ein Stück weiter zu kommen muss ich wissen was der Gleichanteil ist,

Für den Gleichanteil g eines zeitkontinuierlichen Signals während einer Zeitspanne T gilt: I=g*T, wobei I gleich der Fläche unter der Kurve während T ist. g ist also der Mittelwert des Signals während der Messzeit T. Im Zusammenhang der Spektralanalyse kann man auch sagen, g ist der Anteil des Signals mit der Frequenz null. Bei periodischen Signalen nimmt man für T die Periode. Z.B. ist er Gleichanteil eines Sinus gleich null. Der Gleichanteil eines trapezförmigen Impulses ist gleich seinem Wert in der Mitte.

Bei der DFT wird dieser Anteil durch die Summe der N Abtastwerte beschrieben. Das ist dann das N-fache des gewöhnlichen Mittelwerts (=Durchschnitts) der Abtastwerte.

Zitat:
Mir steht aber auch Matlab zur Verfügung....

Scilab ist ein Klon von Matlab. Wenn du dich in eines von beiden einarbeitest, kennst du (im Wesentlichen) auch das andere.

Zitat:
Auch mein elektrotechnik buch"Gert Hagman - grundlagen der Elektronik

Hagmann ist an Fachochschulen verbreitet. Du darfst aber von diesem Buch nicht zuviel erwarten.


Zitat:
Weiterhin wird oft die Amplitude bzw. der Pythagoras durch die Hälfte der Sample geteilt, ich habe auch schon darüber gelesen. weist du den Hintergrund??

Da müsste ich den genaueren Zusammenhang kennen. Die Darstellung er DFT ist nicht überall dieselbe. Da tauchen schon mal Varianten auf, so dass ich nicht über den Divisor N/2 spekulieren möchte.

Ich mache dir einen Vorschlag: Schick mir einfach deine Messdaten und ihre Transfornierte als Privatmitteilung (Button PN). Dann schau ich mir das Beispiel genauer an.
jbmes Auf diesen Beitrag antworten »

Hey, hmm bei dem Gleichanteil weis ich immer noch nicht so richtig wofür er da ist. Also wann und wofür setzt man den ein? Die Berechnung hast du mir ja gut erklärt!
So würde ich jetzt sagen ich beachte ihn nicht weiter und fange bei dem zweiten Glied an, wird er dann auch bei n weggelassen und ich muss immer n-1 schreiben ?

Ich habe dir 2 x 2 Files geschickt (10Sek und 15 Sek)

1File hat immer folgende Werte:
Zeit(ms) GSensor x GSensor y GSensor z und 3 Weitere Sensoren bzw. die Messwerte.

Hier kommen oft doppelte oder dreifache Abtastwerte vor , dies liegt in Android begründet (sendet daten "on sensor change"....). ich rechne mir dann den mittelwert der Sampls der abtastzeit aus und interpoliere dann Werte mit den neuen Zeitabständen.

2 File hat immer folgende Werte:
equidistanter Zeitabstände(ms) interpolierterWert Imaginärteil Realteil


Die doppelten Zeiteinträge will ich mit dem Messen von nanozeit entgegenarbeiten(momentan ms).


ich glaube bei deiner Hilfe muss ich noch zum Nordpol schreiben, dass der Weinachtsmann ein extra großes Paket packt.
Lampe16 Auf diesen Beitrag antworten »

Hallo jbmes,
ich habe mich mit File ...49 beschäftigt und ihn in Matlab als die Matrix "Daten" eingelesen. Dann habe ich folgendes kleine Programm darauf losgelassen:
---------------------------------------------------------------------------
% Die 4096x4-Matrix "Daten" entspricht File ...49
t=Daten(:,1); %Abtastzeitpunkte
x=Daten(:,2); %Abtastwerte
Xjbms=Daten(:,4)+i*Daten(:,3); % DFT
n=length(t) %Anzahl Messwerte
D=diff(t); sum(D~=7);% Prüfung von t auf anderen als Schritt 7, o.k.
xsum=sum(x)% offset
Xmatlab=fft(x);
nc=5; Vergleich=[Xjbms(1:nc) Xmatlab(1:nc)]
---------------------------------------------------------------------------
Ergebnis (nur die ersten 5 Werte):
n = 4096
xsum = 1.0032e+004
Vergleich =
1.0e+004 *
0 + 0.0157i 1.0032
0.0099 - 0.0001i -0.0071 - 0.6314i
0.0006 + 0.0003i 0.0198 - 0.0391i
0.0037 - 0.0009i -0.0585 - 0.2379i
0.0001 - 0.0005i -0.0291 - 0.0064i
---------------------------------------------------------------------------

Ich kann jetzt soviel sagen: Deine Transformierte stimmt nicht. Schon der 1. Wert ist falsch. Hast du ein vorhandenes Programm oder Eigenbau dazu verwendet?

Ich mache dir einen methodischen Vorschlag, weil wir so nicht weiter kommen. Um dich mit der DFT vertraut zu machen, solltest du übersichtliche Testdaten von geringem Umfang erfinden, deren DFT dann bestimmte Erwartungen erfüllen sollte.

Hier mein Vorschlag: Erzeuge diese "Messdaten" x und bearbeite sie.

N=13 % Beispiel für Anzahl Messwerte
t=linspace(0,2*pi,N+1)';
t(end)=[]; % N Abtastzeitpunkte
x=2+sin(t)+sin(2*t)/2+sin(3*t)/3+sin(4*t)/4+sin(5*t)/5+sin(6*t)/6+...
sin(7*t)/7+sin(8*t)/8+sin(9*t)/9+sin(10*t)/10+sin(11*t)/11 %N "Messwerte"

Hier ist übrigens 2 der Gleichanteil, weil die Sinus-Terme alle den Gleichanteil null haben.

Das ergibt (zu deiner Kontrolle)
x =
2.0000
3.2183
3.0837
2.8854
2.6556
2.4032
2.1361
1.8639
1.5968
1.3444
1.1146
0.9163
0.7817

Wenn für dieses Beispiel alles zusammenpasst, werden auch die realen Daten kein Problem mehr machen.
Ich bin auf deine DFT - in diesem Fall nur 13 komplexe Zahlen gespannt.
Lampe16 Auf diesen Beitrag antworten »

Hallo jbmes,
vielleicht brauchst du keine weiteren Tipps mehr. Damit ich mich später im Forum darauf beziehen kann, poste ich jedenfalls die folgende
Zusammenfassung.
Die Funktion fft von Matlab oder Scilab gibt für eine äquidistante reellwertige Zeitreihe ()
die diskrete Fourier-Transformierte (DFT) () in folgender Form aus:
Summe der Zeitreihe (Wert zur Frequenz 0, Maß für Gleichanteil)
Werte der bis -ten Harmonischen
Nochmal die Werte der bis -ten Harmonischen, aber konjugiert komplex.
Dabei gilt:
Die Funktion rundet auf die nächste ganze Zahl ab.

Für das weitere Verständnis:
Als Messzeit ist

definiert. ist das Abtastintervall.
Die kleinste erfasste Frequenz ( Harmonische, in zu finden am Platz ) ist

Die -te Harmonische (in zu finden am Platz ) hat die Frequenz

Die höchste erfasste Frequenz (-te Harmonische, in zu finden am Platz ) ist

Damit sind die Bedeutungen der Plätze von und ihre Zuordnung zur Frequenz festgelegt.


Bei gegebenen DFT-Werten können die Abtastwerte und auch (harmonisch interpolierte) Zwischenwerte des zu Grunde liegenden als zeitkontinuierlich angenommenen Signals mit

rekonstruiert werden (harmonische Synthese).

Dabei gilt:
(Gleichwert)
(Amplituden der bis -ten Harmonischen)
(Nullphasenwinkel der bis -ten Harmonischen)
(Kreisfrequenz der Harmonischen)

Die Abtastwerte können natürlich auch mit der inversen FFT (in Matlab und Scilab ifft) rekonstruiert werden.

Diese Zusammenfassung enthält das Wesentliche. Auch deine frühere Frage "...durch die Hälfte der Sample geteilt, ..." ist mit der drittletzten Gl. behandelt.
Lampe16 Auf diesen Beitrag antworten »

Ich nehme den Faden nach unseren PN hier wieder auf.

Der (vereinfachte) Scilab-Code sieht so aus:
--------------------------------------
x=...
[2.0
3.523345230100679
u.s.w.
0.7380275443505366];

X=fft(x); //fft(...) ist die Scilab eigene Fuktion für die FFT
[x X] //Ausgabe
-----------------------------------------

Die selbst kodierte function der DFT so:

function y=FFT(x)
N=length(x)
[k,n]=ndgrid(1:N,1:N)
ey=(ones(N,1)*x').*exp(-%i*2*%pi.*(k-1).*(n-1)/N)
y=sum(ey,'cf')
endfunction
--------------------------------------------

Mit den Finessen einer Beschleunigung dieser Rechnung - also mit der FFT - beschäftige ich mich nicht. Das haben die Experten ja schon ziemlich perfekt gelöst.
jbmes Auf diesen Beitrag antworten »

So nun ist es wieder soweit.. :-(

Scilab spuckt die Werte aus welche du mir gegeben hast.... :-) .

Ich habe nun Konsequenzen gezogen und eine andere FFT implementation genommen, diesmal direct von Java.

Die Werte stimmen überhaupt nicht mehr überein. ich glaube mir fehlt an dieser Stelle wieder das Wissen. Ich soll als Parameter zum Beispieldie FFTFramesize angeben.

Auf einer Seite habe ich gelesen:
"Nyquist provides functions for FFT and inverse FFT operations on streams of audio data. Because sounds can be of any length, but an FFT operates on a fixed amount of data, FFT processing is typically done in short blocks or windows that move through the audio. Thus, a stream of samples is converted in to a sequence of FFT frames representing short-term spectra"

..verstehe ich die Framesize als ein Fenster welches benutzt wird um das Signal bzw immer Stücke davon zu nehmen!

Als weitere Eingaben steht natürlich das double[] array bereit, wobei dort steht
// Data = Interlaced double array to be transformed.
// The order is: real (sin), complex (cos)

Ich habe als Data DIE Prüfwerte(Realteil) und Nullen(Imaginärteil) benutzt.
Ist dies so richtig?

Vielen Dank für die Hilfe!
Lampe16 Auf diesen Beitrag antworten »

Zitat:
Scilab spuckt die Werte aus

Herzlichen Glückwunsch! Scilab wie Matlab sind sehr hilfreich. Die Einarbeitung lohnt sich.

Zitat:
..verstehe ich die Framesize als ein Fenster welches benutzt wird um das Signal bzw immer Stücke davon zu nehmen!

Genau! Bei FFT, die in Realzeit t mitläuft, wird die Vergangenheitsspanne -T<t<0 ausgewertet. 0 ist der Zeitpunkt der Auswertung und T die Zeitspanne, deren Werte abgetastet werden.

Zitat:
Ich habe als Data DIE Prüfwerte(Realteil) und Nullen(Imaginärteil) benutzt. Ist dies so richtig?

Ich vermute ja! Da Messsignale immer reell sind, überrascht es mich, dass man überhaupt komplexe Zahlen eingeben kann. Die DFT, und damit auch die FFT, funktioniert genauso für komplexe Zahlen. Aber bei üblichen Messsignalen, wie z.B. einer Spannung, ist der Imaginärteil der Abtastwerte gleich null.
jbmes Auf diesen Beitrag antworten »

Celebration!!!!!

Ich kann nicht sagen was ich falsch gemacht habe bei der Eingabe der Werte und der benutzung der FFT FFT Java .

Ich habe nun diese FFT implementiert FFT Android und bekomme da die richtigen Werte, welche auch Matlab und Scilab ausgeben!!


Ich hätte noch ne Frage und zwar würde ich gern die Fourier besser verstehen und habe die Aufgabe:

geg: eine Fourier-Reihendarstellung y(x) = 1 + (2/pi) summenZeichen (-1)^(n+1) * (sin(nx)/n)

Die Funktionsanalyse wurde hier doch schon durchgeführt und wenn ich die Glieder aufschreibe muss ich doch eigentlich nur die Werte für das jeweilige Glied einsetzen? Woran seh ich ohne einen Plotter zu benutzen welche Fkt das ist?
In Funkyplot habe ich gesehen das es eine Sägezahnfunktion ist. Wenn ich die einzelnen Summanden charakterisiere bestimmt die Amplitude doch wie wieviele Oberwellen das einzelne Glied mit bei trägt?! Da Die Symmetrie eine wichtige Eigenschaft spielt wie erkenne ich das bei dieser Funktion? Und ist es richtig wenn ich das Amplitudenspektrum zeichnen möchte nehme ich einfach nur die Amplituden und trage diese in eine Koordinatensystem ab?!


Ich bin mir nicht sicher ob ich nen neuen Thread machen sollte?

Aber mit der FFT vielen vielen Dank, ich dachte schon es liegt an mir, dass immer falsche Werte rauskommen. Du hast mir sehr geholfen!!!!
Freude

P.S. hätte erst zimlich spät gesehen das wir uns nun schon auf der 2 Seite befinden und dachte du antwortest nicht....
Lampe16 Auf diesen Beitrag antworten »

Hallo jbmes!

Zitat:
Woran seh ich ohne einen Plotter zu benutzen welche Fkt das ist?

Ich kenne keine andere Methode als die, welche du benutzt hast. Vermutlich gibt es auch keine.

Zitat:
Wenn ich die einzelnen Summanden charakterisiere, bestimmt die Amplitude doch, wie viele Oberwelle das einzelne Glied beiträgt?!

Exakt!

Zitat:
Da Die Symmetrie eine wichtige Eigenschaft spielt wie erkenne ich das bei dieser Funktion?

Die F.-Reihe gerader/ungerader Funktionen hat nur cos-/sin-Glieder.

Zitat:
Und ist es richtig wenn ich das Amplitudenspektrum zeichnen möchte nehme ich einfach nur die Amplituden und trage diese in eine Koordinatensystem ab?!

Ja, genau! Im allgemeinen Fall hat die F.-Reihe sin- und cos-Glieder. Dann sind beide in der Amplitude zu berücksichtigen.

Zur vollständigen Beschreibung einer Zeifunktion im Frequenzbereich (kurz: des Spektrums) gehört immer auch das Phasenspektrum.
west628 Auf diesen Beitrag antworten »
fft und fourier reihen entwicklung
Hallo zusammen

würde gerne hier kurz einhacken und eine (hoffentlich ganz kleine) Frage stellen.
Ich habe einen Verlauf einer Messgröße als Werte und soll nun davon eine FFT in Matlab machen und die Fourier Reihe herleiten.
Mein bisheriges Vorgehen war das ich die Messwerte einlese, normiere und dann mit Matlab einfach die FFT mache.
Von den komplexen Daten die ich erhalte nem ich den Absolutwert und stelle dann mit f(x) = a0 + Summe av cos (nüh omega t) + Summe bv cos (nüh omega t) meine Fourier Reihe auf. Als av bzw bv nehme ich die Absolutwerte...

Ist das komplett falsch oder bin ich auf dem richtige Weg? Bekomme nämlich trotz 29 av's und bv's keine schöne Kurve hin....

Hoffe es kann mir jemand helfe verzweifel ein wenig

gruß und schon mal danke
west628
Lampe16 Auf diesen Beitrag antworten »
RE: fft und fourier reihen entwicklung
Komplett falsch ist das nicht, aber falsch. Mach es exakt so, wie ich es in diesem Thread in meinem Beitrag vom 22.12.2010 18:40 (unterer Bereich) geschrieben habe. Dann sollte die Synthese etwa so wie die Ausgangsfunktion aussehen.
west628 Auf diesen Beitrag antworten »

Hey erst einmal vielen dank für deine Antwort
könntest du mir zwei zeilen bitte erklären?
[k,n]=ndgrid(1:N,1:N);
ey=(ones(N,1)*x').*exp(-%i*2*%pi.*(k-1).*(n-1)/N)));
Was ist denn k und n?
bzw. was muss ich da definieren, aus denen wird dann ein array gebildet?
und was genau passiert bei ey = ....

Danke schon mal!
Lampe16 Auf diesen Beitrag antworten »

@west628
Zitat:
könntest du mir zwei zeilen bitte erklären? [k,n]=ndgrid(1:N,1:N); ey=(ones(N,1)*x').*exp(-%i*2*%pi.*(k-1).*(n-1)/N)));


Das ist Scilab-Code, der Matlab sehr ähnlich ist. Schau in Matlab bitte unter "help fft" und "help ndgrid" nach. Das beantwortet praktisch alle Fragen, auch nach der Bedeutung der Bezeichnungen.
Lampe16 Auf diesen Beitrag antworten »

@west628
Dein Fehler liegt wahrscheinlich bei den und . Wie hast du die berechnet?

In meinem oben genannten Beitrag synthetisiere ich nur mit der cos-Funktion, wozu dann direkt Betrag und Phase der DFT(FFT)-Transformierten genommen werden können.
west628 Auf diesen Beitrag antworten »

die av und bv habe ich über abs(X) wobei X das normierte FFT Ergbebnis berechnet, zumindest dachte ich es würde so gehen
bei ey=... hast du ja die Funktion eingetragen, aber da hab ich ja keine oder kann ich aus meinen messwerten eine funktion erstellen die ich da eintrage?

gruß und danke
west628
Lampe16 Auf diesen Beitrag antworten »

@west628
Du hast keine Funktion gemessen, du hast nur äquidistante Messwerte (Abtastwerte). Da aber die Messgröße stetig verläuft, kann man ihren Verlauf durch Interpolation der Werte rekonstruieren, zunächst ganz ohne DFT. Dann hast du die "Funktion".

Wenn man aus dem Messwerten die DFT (per FFT) berechnet, also das Spektrum, kann man natürlich aus den komplexen Werten wieder zurück zu den Messwerten. Das geht mit der inversen DFT, in Matlab und Scilab "ifft".

Darüber hinaus kann man die DFT-Werte auch in komplexe Fourierkoeffizienten umdeuten, aus denen sich eine periodische Zeitfunktion rekonstruieren lässt. Man tut also so, als stammten die Messwerte von einer periodischen Funktion, von der man gerade eine Periode abgetastet hat.

In dem folgenden Scilab-Code wird die DFT für eine harmonische Reihe mit 11 sin-Harmonischen als Testsignal durchgeführt. Aus den DFT-Werten werden dann die Fourieramplituden und -nullphasenwinkel berechnet und damit schließlich die Messgröße rekonstruiert.

Scilab ist wie Matlab. Da du letzteres kennst, kannst du den Code in etwa verstehen.
Durch den vektorisierten Programmierstil ist es nicht ganz leicht, die FFT-Formel zu durchschauen: Sie tut aber nichts anderes, als in der Matlab-Hilfe unter "fft" nachlesbar.

Am besten, du installierst die Freeware Scilab auf deinem Rechner und schaust dir die Graphiken an. In Matlab übersetzen geht sicher auch.
----------------------------------------------
//Fast Fourier Transformation - Frequenzspektrum, Fouriersynthese
function y=FFT(x) //Berechnet DFT
N=length(x)
[k,n]=ndgrid(1:N,1:N)
ey=(ones(N,1)*x').*exp(-%i*2*%pi.*(k-1).*(n-1)/N)
y=sum(ey,'cf')
endfunction

N=100 //Anzahl Messwerte eines Testsignals x
o=2*%pi*50; T=2*%pi/o;
t=linspace(0,T,N+1)';
t($)=[]; //N Mess-Zeitpunkte, letzter Wert gelöscht
x=2+sin(o*t)+sin(2*o*t)/2+sin(3*o*t)/3+sin(4*o*t)/4+sin(5*o*t)/5+sin(6*o*t)/6+...
sin(7*o*t)/7+sin(8*o*t)/8+sin(9*o*t)/9+sin(10*o*t)/10+sin(11*o*t)/11; //Messwerte
nH=floor((N-1)/2) //Anzahl der in der DFT sichtbaren Harmonischen
X=FFT(x) //DFT, diskrete Fourier-Transformierte
Null?=[X(2:nH+1) - conj(X($:-1:$-nH+1))] //Kontolle des Vektoraufbaus
//Fourier-Synthese
x0=X(1)/N //Gleichwert
xk=2*abs(X(2:nH+1))/N //Amplituden der Harmonischen
phik=atand(imag(X(2:nH+1)),real(X(2:nH+1)))*%pi/180 //cos-Nullphasenwinkel

xsyn=x0; //Initialisierung der Summe mit Gleichwert
t1=linspace(0,T,1000)'; //Mehr Zeitpunkte
t1($)=[]; //Mehr Zeitpunkte ohne Wiederholung des 1. Werts
for k=1:nH, xsyn=xsyn + xk(k)*cos(k*o*t1+phik(k)); end
xdel();
subplot(1,3,1),plot(t,x,'.', t1,xsyn),title('Messpunkte und Rekonstruktion im Zeitbereich'),xlabel('t / s')
subplot(1,3,2),plot([0;[1:nH]'/T],[x0; xk],'o') ,title('Amplitudenspektrum'),xlabel('f / Hz')
subplot(1,3,3),plot([0;[1:nH]'/T],[%nan; phik],'o') ,title('Phasenspektrum'),xlabel('f / Hz')
----------------------------------------------------------------------
west628 Auf diesen Beitrag antworten »

Hallo

danke für deine Antwort.
Verstehe ich dich richtig ich benötige zu aller erst eine Spline Interpolation meiner Messkurve, diese Funktion nehm ich dann und setze sie mehr oder weniger in das Programm ein? Und damit erhalte ich dann die Fourier Reihe die mir meinen Verlauf nach der FFT beschreibt?
Lampe16 Auf diesen Beitrag antworten »

Zitat:
Original von west628
Verstehe ich dich richtig ich benötige zu aller erst eine Spline Interpolation meiner Messkurve, ...


Nein, das ist nicht nötig. Schreib doch mal, mit welchen Formeln du von den DFT-Werten zu den und gelangt bist.
west628 Auf diesen Beitrag antworten »

Hey lese die unten agehängten Werte als t und x Vektor ein, danach bilde ich die Abtastzeit, bestimme die Länge des Datenvektors und erstelle den Frequenzvektor,
mit den x-Werten führe ich die fft durch, normiere die Ergebnisse, begrenze selbige noch auf Fmax und nehme dann den Absolutwert von meinen komplexen Zahlen.

Und dann war ich bisher der Meinung das ich mit den Werten die ich daraus erhalte schon die av's und bv's hätte
also ich erhalte darauf
0,0624217016293305
0,0547927845850187
0,385207837761955
0,0560039501680001
0,0580694837075895
0,0271521524989278
0,0276585780235125
0,0368975842294969
0,0475214015202286
0,0115922321032228
0,0213954229120496
0,00652658507294739
0,00672284035428347
0,00681461710109161

usw. und dachte das der erste wert a1 der zweite b1 usw. ist....

Habe mein Programm mal angehängt...

Danke dir schon mal, hab grad ein schwarzes Loch vor mir und weiß nicht weiter...

gruß west628


Ts = diff (t(1:2)); % Abtastzeit
N = length (x); % Länge des Datenvektors
f = [0:floor((N-1)/2)] / (N*Ts); % Frequenzvektor für Plot

X = fft(x); % Fouriertransformation
X = X / N; % Normierung

X = [2*X(2:floor((N-1)/2)+2)]; % Begrenzen auf < F_max

z = abs(X);

0 ; 200.3578947
5.9 ; 200.2578879
11.9 ; 200.2299
17.9 ; 200.2853333
23.9 ; 200.3706809
29.9 ; 200.3733202
35.9 ; 200.3156939
41.9 ; 200.2451404
48 ; 200.2603818
54 ; 200.3282917
60 ; 200.3438367
66 ; 200.2820474
72 ; 200.1223571
78 ; 199.9842672
84 ; 199.9220803
90 ; 199.8910701
95.9 ; 199.8578481
101.9 ; 199.7527254
107.9 ; 199.6174306
113.9 ; 199.546841
119.9 ; 199.5870656
125.9 ; 199.6616228
131.9 ; 199.6985544
138 ; 199.6533779
144 ; 199.5894894
150 ; 199.5707054
156 ; 199.6109283
162 ; 199.6687016
168 ; 199.6954938
174 ; 199.7395683
180 ; 199.7486069
185.9 ; 199.8328817
191.9 ; 199.9943802
197.9 ; 200.1575417
203.9 ; 200.2195062
209.9 ; 200.2329658
215.9 ; 200.2604894
221.9 ; 200.3023393
228 ; 200.3819767
234 ; 200.4332675
240 ; 200.3698958
246 ; 200.2750215
252 ; 200.24494
258 ; 200.2989431
264 ; 200.3800581
270 ; 200.3819858
275.9 ; 200.3334659
281.9 ; 200.2709955
287.9 ; 200.2819882
293.9 ; 200.3474286
299.9 ; 200.3731538
305.9 ; 200.2955672
311.9 ; 200.1472074
318 ; 200.0080303
324 ; 199.9382839
330 ; 199.9209868
348 ; 199.7646069
354 ; 199.5529528
360 ; 199.5900366
365.9 ; 199.6965748
371.9 ; 199.7228571
377.9 ; 199.6761088
383.9 ; 199.6047541
389.9 ; 199.5858996
395.9 ; 199.6267803
401.9 ; 199.6849828
408 ; 199.7122461
414 ; 199.7446614
420 ; 199.7374201
426 ; 199.8102519
432 ; 199.9691434
438 ; 200.118624
444 ; 200.1676642
450 ; 200.166711
455.9 ; 200.1919141
461.9 ; 200.2407709
467.9 ; 200.3312185
473.9 ; 200.3711486
479.9 ; 200.3305533
485.9 ; 200.2202273
491.9 ; 200.1853873
498 ; 200.2375615
504 ; 200.3215524
510 ; 200.3347863
516 ; 200.2755761
522 ; 200.2145344
528 ; 200.2226275
534 ; 200.2757778
540 ; 200.3119134
545.9 ; 200.2472967
551.9 ; 200.1047036
557.9 ; 199.9716946
563.9 ; 199.9031762
569.9 ; 199.8810905
575.9 ; 199.8402756
581.9 ; 199.7306835
588 ; 199.6020482
594 ; 199.5306329
600 ; 199.5662553
606 ; 199.66
612 ; 199.6832411
618 ; 199.6267447
624 ; 199.5642037
630 ; 199.5470072
635.9 ; 199.5911317
641.9 ; 199.6547093
647.9 ; 199.6773684
653.9 ; 199.717973
659.9 ; 199.7427479
665.9 ; 199.8176378
671.9 ; 199.9885642
678 ; 200.1382397
684 ; 200.2030335
690 ; 200.2073504
708 ; 200.3033287
714 ; 200.4253906
Lampe16 Auf diesen Beitrag antworten »

Zitat:
Original von west628
...Und dann war ich bisher der Meinung das ich mit den Werten die ich daraus erhalte schon die av's und bv's hätte

Nee, so geht das nicht.

Von den Werten der DFT (X) zu den Fourier-Koeffizienten kommst du so:

a_v = 2/N*real(X(2:nH+1)) mit v=1,2,...,nH
b_v = -2/N*imag(X(2:nH+1))

Die Grundharmonische (a_1, b_1) folgt aus X(2).
west628 Auf diesen Beitrag antworten »

Erst einmal nochmals vielen Dank für deine Hilfe bin dir wirklich sehr sehr dankbar,

habe es jetzt so gemacht wie du beschrieben hast (mit nh = 55) ich habe aber sehr sehr kleine Werte raus und damit sind auch meine Summen von av und bv sehr sehr klein, der Verlauf sieht eigentlich ganz gut aus...
Weißt du was ich falsch mache?
Lampe16 Auf diesen Beitrag antworten »

Multipliziere versuchsweise mit N.
west628 Auf diesen Beitrag antworten »

hmm mit einem Faktor von 40 komme ich auf die amplituden,
ein problem habe ich noch, ich erstelle meinen verlauf in excel wenn ich dort nun in der ersten zeile alles definiere und wegen der veränderlichen zeit nach unten ziehe würde ich wenn ich die zeit komplett ausnutzen würde einen deutlich längeren verlauf hinbekommen, ich habe also zuviel im vergleich zum ausgangssignal,
ist das normal? oder noch ein fehler?
Lampe16 Auf diesen Beitrag antworten »

Zitat:
Original von west628
hmm mit einem Faktor von 40 komme ich auf die amplituden,

Wenn 40 gleich N ist, stimmt alles.

Zitat:
Original von west628
.. würde einen deutlich längeren verlauf hinbekommen, ich habe also zuviel im vergleich zum ausgangssignal,
ist das normal? oder noch ein fehler?

Ich verstehe nicht, was du meinst.
Wenn dein x-Datensatz N Werte enthält, liefert die DFT (per fft von Matlab oder Scilab) genau N X-Werte. Der 1. Wert ist gleich der Summe, die gleichbedeutend mit dem N-fachen Mittelwert von x ist. Dann folgen die Harmonischen bis etwa zur Hälfte des DFT-Satzes. Der Rest von X ist bei reellen Messwerten x, wie hier, redundant.

Durch Rücktransformation der N DFT-Werte (z.B. per ifft) gelangt man exakt zu den N Zeitwerten x zurück.

Durch Umdeutung der x-Werte in Abtastwerte eines periodischen Signals kann man die DFT-Werte auch als (Maß für die komplexen) Fourierkoeffizienten ansehen und damit entsprechend dem vorher angegebenen Verfahren zu den Zeitwerten zurückkehren (Fouriersynthese) und auch Zwischenpunkte interpolieren.

Wir haben jetzt eine Reihe von Details behandelt. Was sich mir bisher nicht erschlossen hat, ist die Aufgabe, die du gerade löst. Willst du dich einfach mit Fourier vertraut machen und deshalb den Zyklus x->X-x genau verstehen, oder ist es etwas ganz anderes?

Mich wundert auch, dass du hier mir excel arbeitest, wo du auch Matlab oder Scilab kennst. Für mich wäre excel der beste Weg, die Übersicht zu verlieren. Kann excel komplex rechnen?
west628 Auf diesen Beitrag antworten »

Hey
hehe ok ich versuche mal etwas Licht ins dunkel zu bekommen.

Aufgabe:
Ich habe eine Messkurve und muss davon eine FFT machen und die Messkurve mit einer Fourier-Reihe wiedergeben

Zu meinem Problem:
Ich habe 116 x Werte also Messdaten und jeweils einen t-Wert dazu.

Wenn ich nun die fft davon durchführe also X bestimme erhalte ich 58 Werte in komplexer Form. Also jeweils 58 av und 58 bv Werte (was ja eigentlich passen würde).
So weit so gut hab ich das alles verstanden. Falls meine av's und bv's richtig sind müsste ich ja nur mithilfe von
f(x) = a0 + Summe av*cos(nüh*w*t) + Summe bv*cos(nüh*w*t)
wobei w meine Frequenz 2*Pi*f0 ist, meine Fourier Reihe aufstellen können (diesen Schritt habe ich in Excel gemacht wobei ich zugeben muss, dass die Übersicht ganz schön leidet)
Das Problem ist wenn ich nun meine gesamten t's durchgehe von 0 bis 0,16 (116 Werte) habe ich nicht den "exakten" Verlauf den ich benötige und erwartet habe...

Gruß & danke
west628
Lampe16 Auf diesen Beitrag antworten »

Zitat:
Original von west628
Aufgabe:
Ich habe eine Messkurve und muss davon eine FFT machen und die Messkurve mit einer Fourier-Reihe wiedergeben
west628

Danke, jetzt ist alles klar.


Zitat:
Original von west628
Das Problem ist wenn ich nun meine gesamten t's durchgehe von 0 bis 0,16 (116 Werte) habe ich nicht den "exakten" Verlauf den ich benötige und erwartet habe...west628


Ich habe das Problem mit Scilab codiert. Code und Graphiken sind beigefügt. Soweit ich sehe, passt alles zusammen.
Gut, dass ich das nicht mit excel machen muss, oder nutzt du diese Software freiwillig?
west628 Auf diesen Beitrag antworten »

ähm ich weiß gar nicht was ich sagen soll
VIELEN VIELEN DANK!!!!!!

ich werd das ganze jetzt nochmal in Matlab versuchen, aber ich bin dir wirklich extrem dankbar!!!

p.s. ich hab diese software freiwillig benutzt ;-)
west628 Auf diesen Beitrag antworten »

Hey lampe,

nochmals danke.
Hätte noch ein paar Fragen zum Verständnis an dich wenn das ok wäre, du hast die letzten zwei Werte wegen dem Sprung im Intervall weggelassen warum macht man das?
Warum muss das mit dem Mittelwert bzw. Offset gemacht werden?
Der Nullphasenwinkel ist die Anfangsauslenkung oder?

Noch eine letzte Frage mit dem atand
hab danach gegoogelt und gelesen das das die inverse der Elemente bzw. umrechnung in grad ist könntest du das vielleicht auch noch erklären warum das gemacht werden muss
die restlichen dinge sind soweit klar danke dir nochmals!!! Gott Freude Tanzen
Lampe16 Auf diesen Beitrag antworten »

Zitat:
Original von west628

...du hast die letzten zwei Werte wegen dem Sprung im Intervall weggelassen warum macht man das?

Die DFT setzt äquidistante Werte voraus. Das kann nur so sein, weil die Zeitpunkte nicht Input zur DFT sind.

Zitat:
Original von west628
Warum muss das mit dem Mittelwert bzw. Offset gemacht werden?

Das ist nicht nötig und eigentlich auch überflüssig, aber nicht falsch. Ich hatte mich dazu verleiten lassen, weil der Mittelwert eine andere Größenordnung hat als die 'Harmonischen.

Zitat:
Original von west628
Der Nullphasenwinkel ist die Anfangsauslenkung oder?

Jede Harmonische hat ihren Nullphasenwinkel. Dabei habe ich die cos-Funktion als Basis genommen. Eine Harmonische in cos-Phase hat damit den Npw 0, eine in sin-Phase den Npw -90 °.
Da du die reelle Synthese (a-b-Form) statt der komplexen (c-Form) bevorzugst, bin ich darauf eingestiegen, habe aber trotzdem Amplituden und Npw der Harmonischen geplottet. Ich finde die informativer.

Zitat:
Original von west628
Noch eine letzte Frage mit dem atand

Der atand von Scilab gibt den Arcustangens in Grad aus. Die Zeile würde in Matlab einfach phik=angle(X(2:nH+1)); lauten.

Noch eine Kleinigkeit. Meine Formeln gelten exakt nur für den Fall einer ungeraden Punktzahl N. Deshalb habe ich den Code entsprechend editiert. Dabei habe ich auch den Offset drin gelassen und das Bild neu angeordnet.
JensSenger Auf diesen Beitrag antworten »
FFT Tool
Hallo,

so habe mich nach einigen Semestern auch mal aufgerafft etwas hier im Forum beizutragen, da ich etwas sehr hilfreiches gefunden habe. Ich habe heute durch Zufall ein Tool gefunden um aus Werten im Zeitbereich mir die FFT anzeigen zu lassen.(http://www.downloads.de/details.php?id=2...belle=Utilities). Habe in Excel für ETIT 3 mal Wertetabellen von Signalen erstellt und diese dann mit dem FFT Tool geladen. Man sieht den Zeitbereich der Signale wie in Excel, erhält dann auch das Frequenzspektrum und kann damit Anhand von Mustersignalen etwas mehr verstehen durch praktische Test mit generierten Signalen. Vielleicht ist das Tool auch interessant um Messwerte von Oszilloskopen zu laden und sich das Spektrum anzuzeigen.

LG,
Jens

P.S.: Das Tool kann man im Hilfemenü updaten. Danach lief es bei mir wesentlich besser...
43812 Auf diesen Beitrag antworten »

hallo,
wie kann man jetzt ifft nutzen?
ich habe gemessene Daten((Kräfte x,y,z) und t)
ich will einmal fft und wider ifft nutzen.
aber ifft funktioniert nicht richtig.
bitte bitte helfen Sie mir
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »