我正在python中进行信号处理项目.到目前为止,我在非阻塞模式下取得了一些成功,但它给输出带来了相当大的延迟和削波.
我想使用Pyaudio和Scipy.Signal实现一个简单的实时音频过滤器,但在pyaudio示例中提供的回调函数中,当我想读取in_data时我无法处理它.尝试以各种方式转换它但没有成功.
这是我想要实现的代码(尽快从麦克风,过滤器和输出中读取数据):
import pyaudio
import time
import numpy as np
import scipy.signal as signal
WIDTH = 2
CHANNELS = 2
RATE = 44100
p = pyaudio.PyAudio()
b,a=signal.iirdesign(0.03,0.07,5,40)
fulldata = np.array([])
def callback(in_data, frame_count, time_info, status):
data=signal.lfilter(b,a,in_data)
return (data, pyaudio.paContinue)
stream = p.open(format=pyaudio.paFloat32,
channels=CHANNELS,
rate=RATE,
output=True,
input=True,
stream_callback=callback)
stream.start_stream()
while stream.is_active():
time.sleep(5)
stream.stop_stream()
stream.close()
p.terminate()
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
我有一个主要使用PyAudio的实验室项目,为了进一步了解它的工作方式,我进行了一些测量,在这种情况下,回调之间的时间(使用回调模式).
我计时了,得到了一个有趣的结果
(@ 256块大小,44.1k fs):0.0099701; 0.0000365; 0.0000201; 0.0201579
这种模式一直在继续.
在两个较长的呼叫之间,我们有两个较短的呼叫,有时较长的呼叫较短(请注意,我在程序中没有做任何其他事情而不是回调时间).
如果我们对此进行平均,我们会得到所需的回调时间:
1/44100*256(约5.8ms)
这是我的测量可视化:
那么有人可以解释一下这里究竟发生了什么?