Frequenz-Analyse in Python
Ich versuche die Verwendung von Python zum abrufen der dominanten Frequenzen einer live-audio-input. Für den moment bin ich zu Experimentieren mit der audio-stream mit meinem Laptop das eingebaute Mikrofon, aber bei der Prüfung des folgenden code, ich bin immer sehr schlechte Ergebnisse.
# Read from Mic Input and find the freq's
import pyaudio
import numpy as np
import bge
import wave
chunk = 2048
# use a Blackman window
window = np.blackman(chunk)
# open stream
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 1920
p = pyaudio.PyAudio()
myStream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, frames_per_buffer = chunk)
def AnalyseStream(cont):
data = myStream.read(chunk)
# unpack the data and times by the hamming window
indata = np.array(wave.struct.unpack("%dh"%(chunk), data))*window
# Take the fft and square each value
fftData=abs(np.fft.rfft(indata))**2
# find the maximum
which = fftData[1:].argmax() + 1
# use quadratic interpolation around the max
if which != len(fftData)-1:
y0,y1,y2 = np.log(fftData[which-1:which+2:])
x1 = (y2 - y0) * .5 / (2 * y1 - y2 - y0)
# find the frequency and output it
thefreq = (which+x1)*RATE/chunk
print("The freq is %f Hz." % (thefreq))
else:
thefreq = which*RATE/chunk
print("The freq is %f Hz." % (thefreq))
# stream.close()
# p.terminate()
Den code kannibalisiert von diese Frage, die sich mit der Fourier-Analyse einer wave-Datei. Es ist in der aktuellen modulare Struktur, wie ich bin, es umzusetzen mit der Blender Game-Umgebung (daher der import bge an der Spitze), aber ich bin mir ziemlich sicher, mein problem liegt in der AnalyseStream Modul.
Einen Rat, den Sie anbieten können, wäre sehr geschätzt werden.
UPDATE: ich bekomme die richtigen Werte hin und wieder, aber man findet Sie selten unter falsche Werte (<10 Hz). Und das Programm läuft WIRKLICH langsam.
InformationsquelleAutor Dave Moore | 2012-01-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hallo das maximum der Berechnung der FFT, für die real-time-Analyse wird ein wenig langsam.
Wenn Sie nicht arbeiten mit komplexen Wellenformen zu finden, die Frequenzen, die Sie verwenden können, jede Methode, basierend auf der Zeit-Domäne, wie z.B. zero-crossing, wo die performance besser.
Im letzten Jahr mache ich eine simple Funktion in calc die Häufigkeit von Zero-crossing.
ederwander
InformationsquelleAutor ederwander
Es gibt auch die Funktion
scipy.signal.lombscargle
berechnet die Lomb-Scargle periodogram und steht seit v0.10.0. Diese Methode sollte funktionieren, auch für ungleichmäßig abgetasteten Signale. Es scheint, dass die Daten bedeuten muss abgezogen werden, damit diese Methode richtig funktioniert, obwohl dies nicht in der Dokumentation erwähnt.Weitere Informationen finden Sie in der scipy-Referenz-guide:
http://docs.scipy.org/doc/scipy/reference/tutorial/signal.html#lomb-scargle-periodograms-spectral-lombscargle
InformationsquelleAutor Miguel de Val-Borro