确定音频缓冲区中的采样数

问题描述:

我正在编写一个小程序,使用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

从回调参数中获取样本数量! :)

framesPerBuffer给你的帧数。 一个框架是一组同时发生的样本。对于立体声流,一帧是两个样本。

时间戳对您的目的没有用处,例如, Pa_GetStreamTime()以秒为单位返回流的当前时间。该决议不会允许您计算样本的数量。