Ich verwende den folgenden Code, um einige sofortige Sound-Verarbeitung/Analyse zu tun. Es funktioniert, aber sehr langsam (im Vergleich zur geplanten Geschwindigkeit). Ich habe einige Zeitmarkierungen hinzugefügt, um herauszufinden, wo das Problem liegt, und ihnen zufolge sollte es keine geben. Typische Dauer (siehe unten) ist < 0,01 s für alle drei berechneten Zeiten, aber es dauert immer noch etwa eine Sekunde, um die Schleife zu vervollständigen. Wo ist das Problem?Beschleunigen Sie den Sound-Processing-Algorithmus
Edit: Bitte beachten Sie, dass die Zeitmessung hier nicht das eigentliche Problem ist. Um das zu beweisen: MyPeaks
findet im Grunde nur das Maximum an ziemlich kurzer FFT - nichts teures. Und das Problem bleibt bestehen, selbst wenn diese Routinen auskommentiert sind.
- Sollte ich etwas anderes als Lambda-Funktion verwenden, um den Zyklus zu machen?
- Habe ich beim Starten und Aufzeichnen des Streams einen Fehler gemacht?
usw.
import pyaudio import struct import mute_alsa import time import numpy as np from Tkinter import * def snd_process(k=0): if k<1000: t0=time.clock() data = stream.read(CHUNK) t1=time.clock() fl=CHUNK int_data = struct.unpack("%sh" %str(fl),data) ft=np.fft.fft(int_data) ft=np.fft.fftshift(ft) ft=np.abs(ft) t2=time.clock() pks=MyPeaks(np.log(ft)) freq_out.configure(text=str(pks)) t3=time.clock() print t1-t0, t2-t1, t3-t2 master.after(1, lambda: snd_process(k+1)) CHUNK = 8000 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 4000 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) #Tkinter stuff master=Tk() button_play=Button(master, command=snd_process, bg="yellow", text="Analyze") button_play.grid(row=0, column=0) freq_out = Label(master) freq_out.grid(row=0, column=1) freq_out.configure(text='base') mainloop()
Beschleunigen Sie Ihre Python mit C! (oder Cython) – erip
woher wissen Sie, die Zeit ist Bearbeitungszeit nicht die master.after()? Wenn ich gegen rohes C etwas numpig ausprobiert habe, scheint es ein bisschen schneller zu sein. (für dot das ist nicht überraschend) – paddyg
@paddyg ich nicht, aber das ist nicht das Problem (siehe die Änderung). –