2016-09-18 67 views
-1

我目前正在使用python開發一個項目。我的目標是能夠使用Raspberry Pi製作主動降噪設備。 現在,我已經編寫了這個程序,它開始錄製我試圖取消的聲音,然後使用一個PID控制器來計算與原始聲音相反的波形並播放它,以取消它。使Python代碼運行得更快以減少偏移量

我現在的問題是,程序需要一些時間來做數學運算,所以一旦它計算出了反轉波,原來的那個已經過了設備,我得到的偏移量大約爲0.02秒。我的目標是儘可能減少這種偏移,然後通過增加麥克風和揚聲器之間的距離來補償它。現在,由於偏移量爲0.02秒,聲速爲340米/秒,我必須將該距離設置爲6.8米(0.02 * 340 = 6.8),這太多了。

那麼如何讓程序運行得更快? 下面的代碼:

import pyaudio, math, struct 
import numpy as np 
import matplotlib.pyplot as plt 

#INITIAL CONFIG 

chunk = 1024 
FORMAT = pyaudio.paInt16 
CHANNELS = 1 
RATE = 44100 
RECORD_SECONDS = float(input('Seconds: ')) 

p = pyaudio.PyAudio() 
guess = 0 
integral = 0 
kp = 0.5 
ki = 200 
kd = 9999 
dt = RATE**(-1) 
ddt = RATE 
stream = p.open(format=FORMAT, 
       channels=CHANNELS, 
       rate=RATE, 
       input=True, 
       output=True, 
       frames_per_buffer=chunk) 

total_error = 0 
previous_e = 0 

#Start processing 
print ("* recording") 

for i in range(0, int(RATE/chunk * RECORD_SECONDS)): 
    byted = (b'') 
    for element in np.fromstring(stream.read(chunk), 'Int16'): 
     error = -(guess - element) 
     integral += error*dt 
     derivative = (error - previous_e)/ddt 
     guess += int(round(kp*error + ki*integral + kd*derivative, 0)) 
     byted += struct.pack('<h', -guess) 
     previous_e = error 
    stream.write(byted, chunk) 

#Close 
stream.stop_stream() 
stream.close() 
p.terminate() 

input ('Press enter to exit...') 

請注意:不要只用一個解決方案作出迴應,請解釋爲什麼它提高了程序的速度,不僅是我想這個工作,但我也想學學。

感謝

回答

0

我粗略模擬結果表明,你可能會不串聯字節串在你的循環,而是在一個陣列收集它們,你的循環後加入他們獲得一些速度:

byted_array = [] 
    for element in np.fromstring(stream.read(chunk), 'Int16'): 
     ... 
     byted_array.append(struct.pack('<h', -guess)) 
     ... 
    stream.write(b''.join(byted_array), chunk)