der u.g. Code stellt aus einem Ausschnitt eines Audiosignals (z.B. 1/20 Sekunde) die entsprechenden Frequenzanteile grafisch dar.
Code: Alles auswählen
import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import read
(fs, at) = read('440_880_1320_4_3_2.wav')
# at: Amplitude in der zeitlichen Domaene
np.int_(at) # Umwandlung von int16 in int
Y = np.fft.fft(at)
N = len(Y)/2+1
t = np.arange(at.size)/float(fs)
dt = t[1] - t[0]
af = 1.0/dt # scan frequency
X = np.linspace(0, af/2, N, endpoint=True)
hann = np.hanning(len(at))
Yhann = np.fft.fft(hann*at)
plt.figure(figsize=(7,3))
plt.subplot(121)
plt.plot(t,at)
plt.title('Time Domain Signal')
plt.ylim(np.min(at)*3, np.max(at)*3)
plt.xlabel('Time ($sec$)')
plt.ylabel('Amplitude ($Unit$)')
plt.subplot(122)
plt.plot(X, 2.0*np.abs(Yhann[:N])/N)
plt.title('Frequency Domain Signal')
plt.xlabel('Frequency ($Hz$)')
plt.ylabel('Amplitude ($Unit$)')
plt.show()
Paul Balzer: Die FFT mit Python einfach erklärt
Als Anfänger kann ich nicht sagen, daß ich den Code vollständig verstanden habe, doch er funktioniert im Wesentlichen, wie die folgende Probe zeigt:
Es wurde ein wav-file erstellt, welches ein Mischsignal enthält mit den drei Frequenzen (Sinus) 440, 880 und 1320 Hz sowie den entsprechenden Amplituden 0.4, 0.3 und 0.2 (Audacity). Download hier.
Wie kann ich jetzt die Werte der Maxima (Frequenz und Amplitude) numerisch ermitteln? Wenn man einen entsprechenden Ausschnitt aus der Grafik anschaut, habe ich den Verdacht, daß die ermittelten Frequenzen nicht genau mit den Ausgangsmaterial übereinstimmt. Wie kann das verbessert werden?
Was bedeutet [:N] in folgendem Ausdruck?
plt.plot(X, 2.0*np.abs(Yhann[:N])/N)
Wie kann die Darstellung im Frequenzbereich auf max. 20000Hz beschränkt werden?
Viele Grüße
Pypet