C PortAudio话筒捕捉,独立通道值

C 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

我正在使用带有PortAudio的麦克风阵列(playstation eye)。我正在尝试麦克风阵列处理,在这里我可以知道每个麦克风的音量,并使用波束形成或听觉间时间延迟指定声音的方向。我很难确定每个频道的音量

下面是一些代码片段,第一个是recordCallback

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 */