我正在編寫一個小程序,使用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
似乎可以用來計算樣本數量,如果我能夠找到一個框架中有多少個樣本,但是我平淡無力地管理這個樣本。
同樣,我怎麼能確定有多少樣本是在緩衝區?作爲免責聲明,我是音頻編程的新手。我可能混合了一些術語或概念,導致更有經驗的人撓頭。 (我很抱歉!)
一個「幀」是一個樣本,IIRC – Dmitri
也就是說,一幀是每個通道的一個樣本;例如。對於立體聲,左聲道的一個採樣和右聲道的一個採樣。 – Dmitri
@Dmitri不完全。一幀是一組樣本,而不是每個通道的一個樣本。 – dmitri