Hallo,
ich möchte gerne einen FFT-Algorithmus in Python programmieren. Bin selbst noch nicht lange dabei und hoffe auf eure Unterstützung Die Ausgangslage ist eine .txt Datei, welche im folgenden Format vorliegt:
Zeit Signal
0 1.01
0.5 1.04
1 1.05
1.5 1.24
Diese habe ich auch schon erfolgreich eingelesen und in eine list geschrieben.
Nun soll aus diesen Signalen das Frequenzspektrum via numpy FFT bestimmt werden. Leider steh ich momentan bzgl. der weiteren Vorgehensweise ein bisschen auf dem Schlauch :K und hoffe ihr könnt mir weiterhelfen. Muss ich die einzelnen Signal erst in eine Funktionsgleichung umwandeln sodass numpy damit arbeiten kann? oder kann numpy mit den "Rohdaten" arbeiten und das Frequenzspektrum bestimmen?
Ich hoffe ihr könnt mir ein paar Anlauftipps geben..
Mit freundlichen Grüßen
Nekosos
FFT Numpy
Schau Dir das mal an
Den Zusammenhang zwischen Fourier-Reihe, Fourier-Transformation und Fast-Fourier-Transformation (FFT) habe ich mit Python Code hier beschrieben:
http://www.magben.de/?h1=mathematik_fue ... schreibung
Code: Alles auswählen
import numpy as np
import matplotlib.pyplot as plt
#data = np.loadtxt("data.txt")
data = np.array([[0, 1.01],
[0.5, 1.04],
[1, 1.05],
[1.5, 1.24]])
t = data[:,0]
signal_t = data[:,1]
dt = t[1]-t[0]
f = np.fft.fftfreq(t.size, dt)
signal_f = np.fft.fft(signal_t)*dt
plt.figure()
plt.stem(np.fft.fftshift(f), np.fft.fftshift(np.abs(signal_f)))
plt.show()
http://www.magben.de/?h1=mathematik_fue ... schreibung
Super Antwort! Der Algorithmus funktioniert einwandfrei, jedoch bin ich gerade noch etwas am "verzweifeln" was das Einlesen der .txt datei angeht.
Sie liegt im folgenden Format vor:
http://www.directupload.net/file/d/4636 ... iw_png.htm
Die erste Zeile "Signal" und "Zeit" soll natürlich gelöscht werden
Die Signalintegers und die Zeitintegers sind durch ein TAB voneinander getrennt.
Wenn ich es mit dem obigen ausprobiere kommt folgende Fehlermeldung:
ValueError: could not convert string to float: {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
Danke für eure Unterstützung
Sie liegt im folgenden Format vor:
http://www.directupload.net/file/d/4636 ... iw_png.htm
Die erste Zeile "Signal" und "Zeit" soll natürlich gelöscht werden
Die Signalintegers und die Zeitintegers sind durch ein TAB voneinander getrennt.
Wenn ich es mit dem obigen
Code: Alles auswählen
data = np.loadtxt("data.txt")
ValueError: could not convert string to float: {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760
Danke für eure Unterstützung
Stimmt, mein Fehler. Hab sie mal direkt konvertiert in eine .txt datei.
Mein Mac erstellt immer automatisch .rtf Dateien über den Texteditor
Kommt weiterhin folgende Fehlermeldung:
Wenn ich aus meiner .txt Datei "Zeit" und "Signal" lösche und nur die Integers drin habe, welche mit einem TAB voneinander getrennt sind, dann kommt folgende Meldung:
In welchem Ordner muss die einzulesende Datei liegen? Habe sie passend zu .py Datei des Algorithmus gepackt.
Gruß
nekosos
RE:
hab noch ein bisschen rumprobiert und die loadtxt Zeile nun so stehen:
Immernoch der error:
Mein Mac erstellt immer automatisch .rtf Dateien über den Texteditor
Kommt weiterhin folgende Fehlermeldung:
Code: Alles auswählen
ValueError: could not convert string to float: ��Z
Code: Alles auswählen
ValueError: could not convert string to float: ��0
Gruß
nekosos
RE:
hab noch ein bisschen rumprobiert und die loadtxt Zeile nun so stehen:
Code: Alles auswählen
data = np.loadtxt("einlesen.txt", dtype=float, delimiter='\t', skiprows = 1)
Code: Alles auswählen
ValueError: could not convert string to float:
Ich habe es noch hinbekommen, die Datei ordnungsgemäß einzulesen. es lag an der .txt datei.
Ich versuche gerade den Algorithmus zu verstehen.
Was genau wird hier gemacht?
Danke für deine/eure Unterstützung
Ich versuche gerade den Algorithmus zu verstehen.
Was genau wird hier gemacht?
Code: Alles auswählen
t = data[:,0]
signal_t = data[:,1]
dt = t[1]-t[0]
dt brauchst Du um damit den Output von FFT (Fast-Fourier-Transformation, numerischer Algorithmus) zu multiplizieren, damit es zu einer FT (Fourier-Transformation, mathematische Methode) wird.
t=data[:,0]
Die 1.Spalte des 2D-Arrays data wird der Variablen t zugewiesen, t ist ein 1D-Array und enthält die selben Daten wie die 1.Spalte von data, wenn Du in t was änderst, so ist es auch in data geändert.
Das ist die Sclicing-Syntax von Numpy. Es ist die gleiche Syntax wie in Matlab.
Hier findest Du dazu eine Erklärung mit Bildern (der Link springt mitten in den Interessanten Teil des Tutorials):
http://www.labri.fr/perso/nrougier/teac ... l#creation
Und hier ist noch ein Numpy Tutorial:
http://cs231n.github.io/python-numpy-tutorial
Um flüssig mit Numpy arbeiten zu können solltest Du die Slicing-Syntax verinnerlichen.
t=data[:,0]
Die 1.Spalte des 2D-Arrays data wird der Variablen t zugewiesen, t ist ein 1D-Array und enthält die selben Daten wie die 1.Spalte von data, wenn Du in t was änderst, so ist es auch in data geändert.
Das ist die Sclicing-Syntax von Numpy. Es ist die gleiche Syntax wie in Matlab.
Hier findest Du dazu eine Erklärung mit Bildern (der Link springt mitten in den Interessanten Teil des Tutorials):
http://www.labri.fr/perso/nrougier/teac ... l#creation
Und hier ist noch ein Numpy Tutorial:
http://cs231n.github.io/python-numpy-tutorial
Um flüssig mit Numpy arbeiten zu können solltest Du die Slicing-Syntax verinnerlichen.
Danke für deine Antwort. Das hat mir sehr geholfen.
Ich teste den Algorithmus gerade mit einer Rechteckfunktion, welche zwischen 1 und -1 pendelt und auch in Ordinatenrichtung in 1er Schritten geht. Rauskommen tut ein Frequenzspektrum zwischen 0.4 und -0.4 (Abzissenachse). Sind die Angaben in kHz ? 0.4 Hz scheint mir doch recht wenig..
Danke für eure Unterstützung
MFG
Nekosos
Ich teste den Algorithmus gerade mit einer Rechteckfunktion, welche zwischen 1 und -1 pendelt und auch in Ordinatenrichtung in 1er Schritten geht. Rauskommen tut ein Frequenzspektrum zwischen 0.4 und -0.4 (Abzissenachse). Sind die Angaben in kHz ? 0.4 Hz scheint mir doch recht wenig..
Danke für eure Unterstützung
MFG
Nekosos
[Frequenz] = 1/[Zeit]Nekosos hat geschrieben:Sind die Angaben in kHz ? 0.4 Hz scheint mir doch recht wenig..
Wenn t in s ist, dann ist f in Hz.
Mit welcher Periode?Nekosos hat geschrieben:Ich teste den Algorithmus gerade mit einer Rechteckfunktion, welche zwischen 1 und -1 pendelt
das ist meine .txt:
Zeit Signal
1 1
2 1
3 -1
4 -1
5 1
6 1
7 -1
8 -1
9 1
10 1
Also eine Periode wäre 4s.
Das ist die Ausgabe:
http://www.directupload.net/file/d/4638 ... yf_png.htm
Danke für eure Unterstützung
MFG
Nekosos
Zeit Signal
1 1
2 1
3 -1
4 -1
5 1
6 1
7 -1
8 -1
9 1
10 1
Also eine Periode wäre 4s.
Das ist die Ausgabe:
http://www.directupload.net/file/d/4638 ... yf_png.htm
Danke für eure Unterstützung
MFG
Nekosos
Die Einheit der Zeit ist bei Dir s, also ist Deine Frequenzeinheit Hz. Eine Perodendauer von 4 s bedeuted eine Frequenz von 0.25 Hz. Der Plot Deines Spektrums hat in der Nähe davon auch sein Maximum. Das und alles weitere ist aber Signaltheorie und hat mit Python nichts mehr zu tun.
Hallo,
ich habe ein reales Signal mit uber 1,5 milionen Messwerten in excel (X:samples bzw. zeit und Y: Amplituden). dieses Signal möchte ich im frequenzbereich mit der FFT darstellen.
ich habe die excel -Tabelle in python importiert und als list umgestellt. habt ihr weitere ideen, wie ich die FFt dieses Signals darstellen könnte
ich habe ein reales Signal mit uber 1,5 milionen Messwerten in excel (X:samples bzw. zeit und Y: Amplituden). dieses Signal möchte ich im frequenzbereich mit der FFT darstellen.
ich habe die excel -Tabelle in python importiert und als list umgestellt. habt ihr weitere ideen, wie ich die FFt dieses Signals darstellen könnte