2016-09-18 5 views
-1

В настоящее время я работаю над проектом с использованием python. Моя цель - создать активное устройство для шумоподавления с использованием малины. На данный момент я написал эту программу, которая начинает запись звука, который я пытаюсь отменить, а затем использует ПИД-регулятор для вычисления инвертированной волны в исходную и воспроизводит ее, чтобы отменить ее.Сделать код на 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)