C PortAudio话筒捕捉,独立通道值
我正在使用带有PortAudio的麦克风阵列(playstation eye)。我正在尝试麦克风阵列处理,在这里我可以知道每个麦克风的音量,并使用波束形成或听觉间时间延迟指定声音的方向。我很难确定每个频道的音量 下面是一些代码片段,第一个是recordCallbackC PortAudio话筒捕捉,独立通道值,c,audio,core-audio,microphone,portaudio,C,Audio,Core Audio,Microphone,Portaudio,我正在使用带有PortAudio的麦克风阵列(playstation eye)。我正在尝试麦克风阵列处理,在这里我可以知道每个麦克风的音量,并使用波束形成或听觉间时间延迟指定声音的方向。我很难确定每个频道的音量 下面是一些代码片段,第一个是recordCallback static int recordCallback( const void *inputBuffer, void *outputBuffer, unsigned long fra
static int recordCallback( const void *inputBuffer, void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
{
paTestData *data = (paTestData*)userData;
const SAMPLE *rptr = (const SAMPLE*)inputBuffer;
SAMPLE *wptr = &data->recordedSamples[data->frameIndex * NUM_CHANNELS];
long framesToCalc;
long i;
int finished;
unsigned long framesLeft = data->maxFrameIndex - data->frameIndex;
(void) outputBuffer; /* Prevent unused variable warnings. */
(void) timeInfo;
(void) statusFlags;
(void) userData;
if( framesLeft < framesPerBuffer )
{
framesToCalc = framesLeft;
finished = paComplete;
}
else
{
framesToCalc = framesPerBuffer;
finished = paContinue;
}
if( inputBuffer == NULL )
{
for( i=0; i<framesToCalc; i++ )
{
*wptr++ = SAMPLE_SILENCE; /* 1 */
if( NUM_CHANNELS =>= 2 ) *wptr++ = SAMPLE_SILENCE; /* 2 */
if( NUM_CHANNELS =>= 3 ) *wptr++ = SAMPLE_SILENCE; /* 3 */
if( NUM_CHANNELS >= 4 ) *wptr++ = SAMPLE_SILENCE; /* 4 */
}
}
else
{
for( i=0; i<framesToCalc; i++ )
{
*wptr++ = *rptr++; /* 1 */
if( NUM_CHANNELS >= 2 ) *wptr++ = *rptr++; /* 2 */
if( NUM_CHANNELS >= 3 ) *wptr++ = *rptr++; /* 3 */
if( NUM_CHANNELS >= 4 ) *wptr++ = *rptr++; /* 4 */
}
}
data->frameIndex += framesToCalc;
return finished;
}
这显然是不对的。这表明两个通道几乎相同。据我所知,当它捕获线性PCM时,它应该映射通道,例如
样品
[
{Channel1}
{Channel2}
{Channel3}
{Channel4}
]
现在的问题是,当我在audacity(使用核心音频驱动程序)上对着一个麦克风吹气时,我得到了这个。很明显,一个麦克风的峰值为1,而其他麦克风几乎没有声音
所以我不明白我做错了什么,有什么指示吗?看起来你只录制了两个频道
inputParameters.channelCount = 2; /* stereo input */
这可以解释为什么通道1和3以及通道2和4测量的是相同的电平,因为您只是跳过了同一通道中的其他每个采样。看起来您找到了解决方案,但我认为我发现了您的记录线程的问题。如果我正确地理解了您的逻辑,那么如果缓冲区中没有足够的空间,您就会丢弃新数据。考虑到您的用例,我建议从缓冲区中刷新旧数据,而不是从portaudio缓冲区中删除数据。看起来你没有阅读所有的样本。我想你需要读取NUM_CHANNELS*frames per buffer samples来获得所有的样本,但是仔细检查一下这个样本的文档。我接受了下面的解决方案,因为它修复了错误,没有看到2个通道值,但是是的,我仍然有这个程序的问题。我不知道你是什么意思,你能进一步解释一下吗?我遵循了portaudio提供1秒读取的示例,当用户缓冲区已满时,线程似乎终止。我假设您希望此应用程序无限期运行。如果是这种情况,最好扔掉排队的旧数据,而不是丢弃刚从麦克风读取的新数据。我确实希望最终无限期地运行应用程序,理想情况下,我希望连续记录或至少在循环中记录,然后在级别高于某个阈值时进行一些处理。但我不知道该怎么做才是最好的。
channel1 max amplitude = 1.00000000
sample average = 1.000000
channel2 max amplitude = 0.02542114
sample average = 0.025421
channel3 max amplitude = 1.00000000
sample average = 1.000000
channel4 max amplitude = 0.02627563
sample average = 0.026276
inputParameters.channelCount = 2; /* stereo input */