Seite 1 von 1

FFT Numpy

Verfasst: Samstag 18. Februar 2017, 12:53
von Nekosos
Hallo,

ich möchte gerne einen FFT-Algorithmus in Python programmieren. Bin selbst noch nicht lange dabei und hoffe auf eure Unterstützung :roll: 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

Re: FFT Numpy

Verfasst: Samstag 18. Februar 2017, 16:16
von MagBen
Schau Dir das mal an

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()
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

Re: FFT Numpy

Verfasst: Samstag 18. Februar 2017, 19:40
von Nekosos
Super Antwort! Der Algorithmus funktioniert einwandfrei, jedoch bin ich gerade noch etwas am "verzweifeln" :roll: was das Einlesen der .txt datei angeht. :cry:

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")
ausprobiere kommt folgende Fehlermeldung:

ValueError: could not convert string to float: {\rtf1\ansi\ansicpg1252\cocoartf1504\cocoasubrtf760

Danke für eure Unterstützung :P

Re: FFT Numpy

Verfasst: Samstag 18. Februar 2017, 19:52
von Sirius3
@Nekosos: das sieht nicht nach einer txt-Datei aus, sondern nach einer rtf-Datei. Wie hast Du die Datei erzeugt?

Re: FFT Numpy

Verfasst: Samstag 18. Februar 2017, 20:00
von Nekosos
Stimmt, mein Fehler. :twisted: Hab sie mal direkt konvertiert in eine .txt datei.
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
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:

Code: Alles auswählen

ValueError: could not convert string to float: ��0
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:

Code: Alles auswählen

data = np.loadtxt("einlesen.txt", dtype=float, delimiter='\t', skiprows = 1)
Immernoch der error:

Code: Alles auswählen

ValueError: could not convert string to float:

Re: FFT Numpy

Verfasst: Samstag 18. Februar 2017, 22:41
von Nekosos
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?

Code: Alles auswählen

t        = data[:,0]
signal_t = data[:,1]
 
dt = t[1]-t[0]
Danke für deine/eure Unterstützung

Re: FFT Numpy

Verfasst: Sonntag 19. Februar 2017, 08:53
von MagBen
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.

Re: FFT Numpy

Verfasst: Montag 20. Februar 2017, 10:40
von Nekosos
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

Re: FFT Numpy

Verfasst: Montag 20. Februar 2017, 12:22
von MagBen
Nekosos hat geschrieben:Sind die Angaben in kHz ? 0.4 Hz scheint mir doch recht wenig..
[Frequenz] = 1/[Zeit]
Wenn t in s ist, dann ist f in Hz.
Nekosos hat geschrieben:Ich teste den Algorithmus gerade mit einer Rechteckfunktion, welche zwischen 1 und -1 pendelt
Mit welcher Periode?

Re: FFT Numpy

Verfasst: Montag 20. Februar 2017, 22:36
von Nekosos
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

Re: FFT Numpy

Verfasst: Dienstag 21. Februar 2017, 08:22
von MagBen
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.

Re: FFT Numpy

Verfasst: Samstag 1. Februar 2020, 13:54
von hassan_89
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

Re: FFT Numpy

Verfasst: Samstag 1. Februar 2020, 16:03
von __deets__
Du siehst doch den Code den MagBen oben gepostet hat. Was daran funktioniert fuer dich nicht?