Я использую следующий код для немедленной обработки/анализа звука. Он работает, но очень медленный (по сравнению с запланированной скоростью). Я добавил несколько маркеров времени, чтобы узнать, где проблема, и по их словам не должно быть никаких. Типичная продолжительность (см. Ниже) равна < 0,01 с для всех трех вычисленных времен, но для завершения цикла все еще требуется около секунды. В чем проблема?Ускорение алгоритма обработки звука
Редактировать: Обратите внимание, что измерение времени здесь не является реальной проблемой. Чтобы доказать, что: MyPeaks
в основном просто находит максимум довольно короткого FFT - ничего дорогого. И проблема сохраняется, даже когда эти процедуры закомментированы.
- Должен ли я использовать что-то отличное от лямбда-функции, чтобы сделать цикл?
- Произошла ли ошибка при запуске и записи потока?
т.д.
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()
Ускорьте свой питон с помощью C! (или cython) – erip
Откуда вы знаете, что время - это время обработки, а не master.after()? Когда я попробовал numpy против raw C, это выглядит довольно быстро. (для точки, которая неудивительно) – paddyg
@paddyg Я этого не делаю, но это не проблема (см. редактирование). –