4
我正在做一個Python中的信號處理項目。到目前爲止,我已經在非阻塞模式下取得了一些成功,但是它給輸出帶來了相當多的延遲和限幅。如何在Pyaudio回調模式下處理in_data?
我想使用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()
什麼是做到這一點的正確方法?
你的腳本說'渠道= 2'。這是如何處理立體聲輸入的? – endolith
它讀取數據交錯意味着從零開始的每個第二個元素將會(假設)離開(可能是正確的),並且第一個元素的第二個元素將是另一個通道。 這個版本的代碼並沒有處理這個問題,我會在需要的時候提供一個片段: def callback(in_data,frame_count,time_info,flag): global data,recording,ch1,ch2 數據= np.fromstring(IN_DATA,D型細胞= np.float32) CH1 = DATA [0:2] CH 2 =數據[1 :: 2] 回報(IN_DATA,記錄) 這些陣列將是一半長,所以如果你想玩他們,你需要加倍他們。 –
我只是想出了:) http://stackoverflow.com/a/22644499/125507 – endolith