我目前正在使用python开发一个项目。我的目标是能够使用Raspberry Pi制作有源降噪设备。 现在,我已经编写了这个程序,它开始记录我试图取消的声音,然后使用PID控制器计算原始的反转波并播放它,以便取消它。
我现在的问题是该程序需要一些时间来进行数学运算,所以一旦它计算了倒波,原来的一个已经通过了设备,我得到的偏差约为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 :(得分: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)