确定音频缓冲区中的采样数
问题描述:
我正在编写一个小程序,使用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
似乎可以用来计算样本数量,如果我能够找到一个框架中有多少个样本,但是我平淡无力地管理这个样本。
同样,我怎么能确定有多少样本是在缓冲区?作为免责声明,我是音频编程的新手。我可能混合了一些术语或概念,导致更有经验的人挠头。 (我很抱歉!)
答
从回调参数中获取样本数量! :)
framesPerBuffer
给你的帧数。 一个框架是一组同时发生的样本。对于立体声流,一帧是两个样本。
时间戳对您的目的没有用处,例如, Pa_GetStreamTime()
以秒为单位返回流的当前时间。该决议不会允许您计算样本的数量。
一个“帧”是一个样本,IIRC – Dmitri
也就是说,一帧是每个通道的一个样本;例如。对于立体声,左声道的一个采样和右声道的一个采样。 – Dmitri
@Dmitri不完全。一帧是一组样本,而不是每个通道的一个样本。 – dmitri