2015-07-20 52 views
0

我正在編寫一個小程序,使用PortAudio執行實時環境噪聲消除。爲了做一些必要的計算(如傅立葉變換),我需要提供樣本數據,但我也需要確切知道在給定時間內有多少個樣本正在處理。確定音頻緩衝區中的採樣數

我怎麼能確定音頻採樣的緩衝區的數目?

在嘗試這種解決自己,兩個變量顯得尤爲重要和有用的,即:採樣率和每緩衝框架。當我試圖使用採樣率計算樣本數時,我遇到了錯誤計算每次回調調用之間的時間的問題。

int ambienceCallback(const void * inputBuffer, 
      void * outputBuffer, 
      unsigned long framesPerBuffer, 
      const PaStreamCallbackTimeInfo * timeInfo, 
      PaStreamCallbackFlags statusFlags, 
      void * userData) 
{ 
    const SAMPLE * in = (const SAMPLE *) inputBuffer; 
    PaStreamParameters * inputParameters = (PaStreamParameters *) userData; 
    PaTime time = timeInfo->inputBufferAdcTime; 
    int sampleCount = (time - callbackTime) * Pa_GetDeviceInfo(inputParameters->device)->defaultSampleRate; 
    callbackTime = time; 
    // extraneous ... 
} 

callbackTime其中在頭文件中聲明的變量,並且在開始音頻輸入流初始化。

// extraneous ... 
error = Pa_StartStream(stream); 
callbackTime = Pa_GetStreamTime(stream); 
// extraneous ... 

但是,計算的時間總是爲零。因此,我無法簡單地將採樣率乘以經過的時間工作。另一個變量framesPerBuffer似乎可以用來計算樣本數量,如果我能夠找到一個框架中有多少個樣本,但是我平淡無力地管理這個樣本。

同樣,我怎麼能確定有多少樣本是在緩衝區?作爲免責聲明,我是音頻編程的新手。我可能混合了一些術語或概念,導致更有經驗的人撓頭。 (我很抱歉!)

+0

一個「幀」是一個樣本,IIRC – Dmitri

+0

也就是說,一幀是每個通道的一個樣本;例如。對於立體聲,左聲道的一個採樣和右聲道的一個採樣。 – Dmitri

+0

@Dmitri不完全。一幀是一組樣本,而不是每個通道的一個樣本。 – dmitri

回答

1

從回調參數中獲取樣本數量! :)

framesPerBuffer給你的幀數。 一個框架是一組同時發生的樣本。對於立體聲流,一幀是兩個樣本。

時間戳對您的目的沒有用處,例如, Pa_GetStreamTime()以秒爲單位返回流的當前時間。該決議不會允許您計算樣本的數量。

相關問題