2014-02-28 17 views
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() 

什麼是做到這一點的正確方法?

回答

5

找到了答案,我在此期間的問題,則回調看起來是這樣的:

def callback(in_data, frame_count, time_info, flag): 
    global b,a,fulldata #global variables for filter coefficients and array 
    audio_data = np.fromstring(in_data, dtype=np.float32) 
    #do whatever with data, in my case I want to hear my data filtered in realtime 
    audio_data = signal.filtfilt(b,a,audio_data,padlen=200).astype(np.float32).tostring() 
    fulldata = np.append(fulldata,audio_data) #saves filtered data in an array 
    return (audio_data, pyaudio.paContinue) 
+0

你的腳本說'渠道= 2'。這是如何處理立體聲輸入的? – endolith

+1

它讀取數據交錯意味着從零開始的每個第二個元素將會(假設)離開(可能是正確的),並且第一個元素的第二個元素將是另一個通道。 這個版本的代碼並沒有處理這個問題,我會在需要的時候提供一個片段: 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,記錄) 這些陣列將是一半長,所以如果你想玩他們,你需要加倍他們。 –

+0

我只是想出了:) http://stackoverflow.com/a/22644499/125507 – endolith

相關問題