FFT mit Daten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo,

ich lerne gerade python und möchte Daten aus einer txt Datei laden und mit diesen Daten eine Fast Fourier Transformation machen. Das Einlesen der Datei versuche ich gerade, aber ich weiss gar nicht, wie ich dann eine FFT machen kann? Ist das möglich?

mfg detlef
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Aber sicher, das geht beides mit `numpy`.

Einlesen `numpy.loadtxt` >> http://docs.scipy.org/doc/numpy/referen ... adtxt.html
FFT: `numpy.fft` >> http://docs.scipy.org/doc/numpy/referen ... s.fft.html

:)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo,

ich habe beim Laden der Datei an so etwas gedacht:

Code: Alles auswählen

   pfad = "s:/wspiegel/info/dein_Verzeichnis_name/" # anpassen!!
   dateiname="datei.txt"
   datei = pfad+dateiname
   in_file =np.loadtxt(datei,dtype 'float',3)
   text = in_file.read()
   in_file.close()
Aber meine txt-Datei hat auch Text in den ersten 3 Zeilen, wie kann ich diese im Delimiter ignorieren? Wie müssen die Daten in der txt-Datei getrennt sein? Bei mir sind 3Leerzeichen zwischen den Spalten, ist das wichtig?

Wie ich nun weiter mit der FFT mache, versteh ich nicht so ganz??

mfg
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Vielleicht solltest du sowohl das Python-Tutorial durcharbeiten als auch die Doku zu loadtxt lesen. Vor allem letzteres sollte dir deine Fragen beantworten.

Auch wundert es mich, dass dein geposteter Code bei dir zu funktionieren scheint. Denn wenn er es nicht tut, stellst du die falschen Fragen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die üblichen Fragen lauten:

1 - wie sieht denn die Syntax der Datendateien aus?
2 - kann man diese ggf. beeinflussen und ein anderes, sinnvolleres Format wählen (sofern bei 1 etwas schlechtes ans Tageslicht kam)

Dabei spielt natürlich ggf. auch eine Rolle, wie die weiterverarbeitenden Libs die Daten benötigen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo,

so sieh die txt-Datei aus:
Bild

Zum Laden der Datei :

Code: Alles auswählen

   pfad = "s:/wspiegel/info/dein_Verzeichnis_name/" # anpassen!!
   dateiname="datei.txt"
   datei = pfad+dateiname
   fname=np.loadtxt(datei, dtype=<type 'float'>, comments='#', delimiter=2, converters=None,  skiprows=0, usecols=(0,2), unpack=False)¶
Also mich interessieren eigentlich nur die 1 und die 3 Spalte, dass kann man mit usecols einstellen oder? Muss ich auch einstellen, wie die Spalten in der txt getrennt sind?

mfg
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

01detlef hat geschrieben: Also mich interessieren eigentlich nur die 1 und die 3 Spalte, dass kann man mit usecols einstellen oder? Muss ich auch einstellen, wie die Spalten in der txt getrennt sind?
Probiers doch oder guck in die Doku und probiers dann ;-)

Der Text oben drüber könnte natürlich Probleme machen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo,

es lief heute vormittag nicht und jetzt kann ich es bis morgen nicht probieren, würde aber gerne weiterkommen!

Also in der Doku steht ja zu loadtx:
numpy.loadtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False)¶

load data from a text file

und fname muss man ja noch einlesen oder?Mit dem delimiter würde ich die ersten beiden Reihen abtrennen und usecols=(0,2)

Und wie kann ich dann die FFT anwenden?

mfg
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

01detlef hat geschrieben:es lief heute vormittag nicht
Aha, warum schreibst du das nicht gleich? Und "lief nicht" ist keine Problembeschreibung.
Also in der Doku steht ja zu loadtx:
Da steht sogar noch mehr. Da drunter sind die einzelnen Parameter haarklein beschrieben. Erwarte nicht, dass dir das hier wer auf deutsch übersetzt. Übrigens würde ich dir nochmal dringen raten das Python-Tutorial durchzuarbeiten. http://docs.python.org/tutorial/control ... ent-values kommt da nämlich durchaus drin vor.
Und wie kann ich dann die FFT anwenden?
Im Zweifelsfall indem du dir Wikipedia schnappst und die Formeln anwendest. Oder doku zu numpy.fft lesen.

Ich würde dir wirklich sehr empfehlen das ganze mal im interaktiven Python-Interpreter Stück für Stück auszuprobieren und zu gucken, wie die Daten aussehen, die da raus kommen. Wenn dir dann was unklar ist, kannst du gerne Fragen. Aber allgemeines vorkauen von allem wird hier keiner machen.
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Ich habe mir das ja durchgelesen zu loadtxt und auch was gefragt, was nicht genau da steht.

Aber fname muss man ja noch einlesen oder?Mit dem delimiter würde ich die ersten beiden Reihen abtrennen und usecols=(0,2) setzen für die erste und dritte Spalte. Wie werden die Spalten getrennt?

mfg
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

01detlef hat geschrieben:Ich habe mir das ja durchgelesen zu loadtxt und auch was gefragt, was nicht genau da steht.
Doch genau das steht da, alles.
Aber fname muss man ja noch einlesen oder?
Frage verstehe ich nicht, was willst du überhaupt machen. Was meinst du mit „noch einlesen“.
Mit dem delimiter würde ich die ersten beiden Reihen abtrennen
Nein, doku zu skiprows lesen.
und usecols=(0,2) setzen für die erste und dritte Spalte.
Das ist die einzige Frage die ich wirklich nachvollziehen kann, Antwort: ja.
Wie werden die Spalten getrennt?
Doku zu delimiter nochmal richtig lesen. Wie kommst du da drauf, dass man damit Reihen überspringt?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Wieso muß man "fname" einlesen? Das kannst Du natürlich machen, aber Du kannst auch den String in Dein Skript schreiben. Und was den Text in Deinem Textfile angeht: Prosa und numerische Daten sollte man nicht mischen, es sei denn, man macht den Text eindeutig als Kommentar kenntlich, z. B. mit "#" oder anderen Zeichen. Ansonsten kannst Du natürlich auch den skiprows-Parameter von numpy.loadtxt nutzen: Einfach auf 2 setzten.

Ich weiß nicht, wie ich Dein Codebeispiel deuten soll. Hoffentlich nicht so, daß Du alle Parameter so übergibt, wie Du schreibst und auch nicht so, wie ich Deine weiteren Posts interpretiere. Also:
- "delimiter = 2" ist eigentlich gar nicht definiert. Wenn Du Glück hast wird das Zeichen "2" als Delimiter benutzt (bin gerade zu faul in den Quelltext zu schauen), aber Du hast whitespace, was dem default entspricht, also warum überhaupt setzen?
- dtype = <type 'float'> schreibt man so nicht. Ist auch überflüssig. Ansonsten einfach mal in der numpy-Doku nachschauen.
- skiprows müßte, wie gesagt auf 2 gesetzt werden.
- "datei" ist als Name nicht sehr deskriptiv. Mir ist dabei nicht direkt klar, ob es ein String sein soll oder eine geöffnete Datei.

Also wäre das in etwa so:

Code: Alles auswählen

a = np.loadtxt(datei, skiprows=2, ...)
np.fft.fft(a.T[x])
, wobei x der gewünschten Spalte entspricht.

Ich habe Dir mal soweit weiter geholfen, doch eigentlich hilft Dir das kaum wirklich weiter, wenn Du nicht das Tutorial und die numpy-Anleitung durchkaust. Ja, kostet Zeit, aber sonst kannst Du nicht richtig loslegen.

HTH
Christian
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo,

1)also mir ist nicht klar was fname sein soll. Ich habe die ganze Zeit gedacht, dass man hier die komplette Adresse der einzulesenden Datei angeben muss?! Deshalb habe ich noch den weiteren Code gedacht zum Einlesen!

2) Als Delimiter ist Whitespace eingestellt, okay. Gibt es auch kein Problem, wenn zwischen den Spalten unterscheidlich viele Leerzeichen sind?

Ich werde jetzt erstmal das Tutorial durcharbeiten
vielen dank
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

01detlef hat geschrieben: 1)also mir ist nicht klar was fname sein soll. Ich habe die ganze Zeit gedacht, dass man hier die komplette Adresse der einzulesenden Datei angeben muss?! Deshalb habe ich noch den weiteren Code gedacht zum Einlesen!
Vermutlich der Dateiname.
2) Als Delimiter ist Whitespace eingestellt, okay. Gibt es auch kein Problem, wenn zwischen den Spalten unterscheidlich viele Leerzeichen sind?
Probiere das doch einfach aus! Mal ehrlich: Das geht doch schneller als hier ein Posting zu estellen... :roll:

Wie schon Darii Dir empfohlen hat: Nimm eine interaktive Shell und probiere doch mal Dinge Stück für Stück aus.

Die FFT kannst Du doch auch ohne das Einlesen aus einer Datei testen - anderherum kannst Du das Einlesen von Daten aus einer Datei doch auch ohne FFT testen. Wenn beides läuft, musst Du das nur noch kombinieren.

Was Du nie beantwortet hast: Kannst Du das Format der Eingabedaten beeinflussen? Wenn ja, dann spare Dir die Kommentare oder ändere sie so ab, wie man es mit der numpy.loadtxt() gut ignorieren kannst und lasse doch einfach die Spalten weg, die Dich nicht interessieren.

Auf jeden Fall teste das alles Schritt für Schritt und gieße das dann in Funktionen; eine zum Laden und Daten parsen und ggf. dann eine für die FFT.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

01detlef hat geschrieben:1)also mir ist nicht klar was fname sein soll. Ich habe die ganze Zeit gedacht, dass man hier die komplette Adresse der einzulesenden Datei angeben muss?! Deshalb habe ich noch den weiteren Code gedacht zum Einlesen!
Nochmal ganz deutlich, auch wenn das eigentlich eindeutig in der Doku steht: Du kannst entweder eine geöffnete Datei übergeben oder den Dateinamen selbst.

Code: Alles auswählen

filename = 'x.txt'
# a) 
with open(filename) as fobj:
    x1 = numpy.loadtxt(fobj)
# b)
x2 = numpy.loadtxt(filename)
So schwer ist das doch nicht...
01detlef hat geschrieben: 2) Als Delimiter ist Whitespace eingestellt, okay. Gibt es auch kein Problem, wenn zwischen den Spalten unterscheidlich viele Leerzeichen sind?
Nein, mehrere Leerzeichen sind immer noch "any whitespace"...
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo,

also ich habe jetzt wirklich viel herumprobiert, aber ich verstehe nicht, wieso immer angesagt wird, dass
name 'numpy' is not defined

Code: Alles auswählen

fobj = open("woerterbuch.txt", "r")
for line in fobj: 
    print line 
fobj.close()
Das läuft wunderbar, aber bei dem Code mit loadtxt wird immer der Fehler angezeigt:

Code: Alles auswählen

a = np.loadtxt(datei, skiprows=2, ...)
mfg
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

ahh man muss

import numpy

machen!
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Code: Alles auswählen

import numpy 
   
datei = 'sinus.txt'
a = numpy.loadtxt(datei, skiprows=2)
res=numpy.fft.fft(a[1])
Ich habe nun den folgenden Code und der läuft auch soweit, nur habe ich ein Problem. Die Datei wird geladen und dann wird glaub ich nur vom letzten Wert die FFT berechnet. Also habe ich an eine Schleife gedacht, aber ich weiss gerade nicht, wie ich so die Werte einzelnd ansprechen kann, so dass ich dann die FFT anwenden kann?!

mfg
BlackJack

@01detlef: Was meinst Du mit "letztem" Wert? Du greifst auf den Index 1 von `a` zu, also auf die zweite Zeile des zweidimensionalen Arrays. Die Zählung beginnt bei 0.

Was hast Du denn vor? Was enthält die Datei für Daten, also was bedeuten die Werte, Zeilen, die Datei als ganzes? Und was möchtest Du als Ergebnis haben?
01detlef
User
Beiträge: 105
Registriert: Montag 10. Mai 2010, 21:59

Hallo,

da liegt wohl mein Fehler. Ich möchte das alle Daten in der zweiten Spalte einer FFT unterzogen werden. In der ersten Spalte ist die Zeit und in der zweiten die y-Werte dazu und davon soll die FFT gemacht werden.

mfg
Antworten