FFT Numpy

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Nekosos
User
Beiträge: 6
Registriert: Samstag 18. Februar 2017, 12:42

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
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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
a fool with a tool is still a fool, www.magben.de, YouTube
Nekosos
User
Beiträge: 6
Registriert: Samstag 18. Februar 2017, 12:42

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
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Nekosos: das sieht nicht nach einer txt-Datei aus, sondern nach einer rtf-Datei. Wie hast Du die Datei erzeugt?
Nekosos
User
Beiträge: 6
Registriert: Samstag 18. Februar 2017, 12:42

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:
Nekosos
User
Beiträge: 6
Registriert: Samstag 18. Februar 2017, 12:42

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
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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.
a fool with a tool is still a fool, www.magben.de, YouTube
Nekosos
User
Beiträge: 6
Registriert: Samstag 18. Februar 2017, 12:42

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
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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?
a fool with a tool is still a fool, www.magben.de, YouTube
Nekosos
User
Beiträge: 6
Registriert: Samstag 18. Februar 2017, 12:42

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
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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.
a fool with a tool is still a fool, www.magben.de, YouTube
hassan_89
User
Beiträge: 1
Registriert: Samstag 1. Februar 2020, 13:29

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
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du siehst doch den Code den MagBen oben gepostet hat. Was daran funktioniert fuer dich nicht?
Antworten