auch wenn es vielleicht nicht jedermans Fachgebiet ist, hoffe ich, dass vielleicht der ein oder andere schonmal mit der FFT in Python gearbeitet hat. Ich habe mir, um die FFT erstmal nachvollziehen zu koennen, ein kleines Python Programm geschrieben.
Code: Alles auswählen
from numpy import linspace, array, sin, shape, sqrt
from numpy.fft import fft, fftfreq
from math import pi
from matplotlib.pyplot import figure, plot, show
class FFT_Beispiel(object):
def __init__(self):
# Zeit
self.time = linspace(0,1,2**8)
# Abtastfrequenz
self.dt = self.time[1]
self.fa = 1/self.dt
# Signal1 mit frequenz = f1 und Amplitude = a1
self.f1 = 2.
self.a1 = 1.
self.y1 = array([])
# Signal1 mit frequenz = f1 und Amplitude = a1
self.f2 = 4.
self.a2 = 1.
self.y2 = array([])
# Signal1 mit frequenz = f1 und Amplitude = a1
self.f3 = 6.
self.a3 = 1.
self.y3 = array([])
# Superposition der einzelnen Signale
self.y = array([])
def signal(self):
# Berechnung der Signale
self.y1 = self.a1*sin(2*pi*self.f1*self.time)
self.y2 = self.a2*sin(2*pi*self.f2*self.time)
self.y3 = self.a3*sin(2*pi*self.f3*self.time)
self.y = self.y1 + self.y2 +self.y3
def FFT_Beispiel(self):
# Berechnung der FFT
sp = fft(self.y)
freq = fftfreq(shape(self.time)[-1], d = self.dt)
# Plotten
figure(1)
plot(self.time, self.y1)
plot(self.time, self.y2)
plot(self.time, self.y3)
figure(2)
plot(self.time, self.y)
figure(3)
plot(freq, sp.real,freq, sp.imag)
figure(4)
# Betrag berechnen
spabs = sqrt((sp.real**2) + (sp.imag**2))
# Normieren auf Amplituden
spabs = spabs / (shape(self.time)[-1]/2)
plot(freq, spabs)
show()
def main():
FFT_Exampel = FFT_Beispiel()
FFT_Exampel.signal()
FFT_Exampel.FFT_Beispiel()
Durch die Durchfuerhung der FFT ueber mehrere Perioden des Signals ist mir dann aufgefallen, dass sich dann die Aufloesung auf der X-Achse des Spektrums erhoeht. Bei Wikipedia, hab ich dazu auch irgendwas mit Unschaerferelation der Zeit und Frequenzaufloesung gelesen...?!?
Frage: Da ich besonders gerne die Aufloesung auf der X-Achse des Spektrums erhoehen moechte, wuerde ich gerne wissen, ob das nur moeglich ist ueber einen groesseren Ausschnitt oder ob die Python funktion in dem Fall mir was falsches zurueckgibt bzw. ich die Funktion falsch anwende?
Ich weiss, die Frage ist nicht nur Python spezifisch, aber vielleicht kann mir da jemand trotzdem helfen. Bin ja mit sicherheit nicht der erste hier der ne fft macht
THX