Выход Pyaudio искажается при непрерывном чтении, фильтрации данных и выводе в цикле while - PullRequest
1 голос
/ 23 февраля 2020

Я пытаюсь использовать pyaudio в шапке hifi berry на малиновом пи через python, чтобы получить непрерывное значение l oop, в которое я считываю данные, фильтрую их и выводю отфильтрованные данные. Входные и выходные волны визуализируются на осциллографе. После ожидания в течение нескольких минут выходная волна искажается и иногда останавливается перед продолжением. Как бы сделать вывод не глюком или остановкой. Мой код, который я использую, ниже. Я не уверен, что проблема в приведенном ниже коде или других фоновых файлах, работающих на Raspberry Pi.

Код:

# installing packages needed for script
import numpy as np
import matplotlib.pyplot as plt
import pyaudio
import wave
import math
import cmath


# Initializing the variables for stream
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024
INDEX = 1

p = pyaudio.PyAudio()
# defining the pyaudio stream 
stream = p.open(format=FORMAT, input_device_index = INDEX,
                    channels=CHANNELS,
                    rate=RATE, input=True,
                    output = True,
                    frames_per_buffer=CHUNK)

#recursive filter variables
f = RATE
f0 = 440
Q = 10
c = -math.exp((-2*math.pi*f0)/(Q*f))
b = 2*math.exp((-math.pi*f0)/(Q*f))*math.cos(2*math.pi*f0/f)
a = (1-b-c)/(Q)

x = [0]*CHUNK

# while loop to take incoming waves filter and output them
while True:
    Sample = stream.read(CHUNK, exception_on_overflow = False) # data gets read as bytes[int]
    Sample = np.fromstring(Sample,dtype=np.int16) # converting from string to bytes[np.int16]

    for i in range(0, len(Sample)):
        x[i] = (a)*Sample[i] + (b)*x[(i-1)%CHUNK] + (c)*x[(i-2)%CHUNK] # output data at this point becomes np.float64

    out = np.asarray(x).astype(np.int16)# output goes back to np.int16

    out = out.tostring() #output goes back to string from np.int16
    stream.write(out) #streaming out filtered string data 

Любые предложения о том, как исправить вывод на осциллограф или сделать код лучше / эффективнее?

...