1

我一直在尝试使用 Apple 提供的 vDSP 库(加速框架)在 iPhone 上实现自相关算法。

到目前为止,我按照苹果的 auriotouch 示例创建了一个音频单元,但我想使用加速框架来执行自相关,而不是 auriotouch 示例代码中的旧实现。

IORemote 音频单元通过我的 renderCallBack 方法路由,如下所示:

{
    AudioGraphController *controller = (AudioGraphController *) inRefCon;

    // Remove DC component
for(UInt32 i = 0; i < ioData->mNumberBuffers; ++i)
    controller.dcFilter[i].InplaceFilter((SInt32*)(ioData->mBuffers[i].mData),         inNumberFrames, 1);

    OSStatus result = AudioUnitRender(controller.inputUnit, ioActionFlags, inTimeStamp, 1,     inNumberFrames, ioData);

    if (result) { printf("InputRenderCallback: error %d\n", (int)result); return result; }

    controller.manager->ProcessAudioData(inNumberFrames, ioData);

    return noErr;
}

根据这篇文章中的 c++ 片段,来自麦克风的输入数据被发送到执行自相关的 ProcessAudioData 方法:Using the Apple FFT and Accelerate Framework

但是我在理解 displaydata 数组中的信息时遇到了一些麻烦。

当我尝试访问信息时,我得到的只是 nan,我唯一了解信息的时候是当我像这样投射 displaydata 数组时:

SInt16* buf = (SInt16 *)displayData;

计算自相关的步骤我遵循以下步骤: - 将实际输入 (ioData->mBuffers[0].mData) 拆分为偶数和奇数输入。- 执行 FFT(向前) - 取 FFT 生成的值的绝对平方。- 采用 IFFT(反向/反向) - 将复数拆分转换为实数。

有人可以给我一些关于如何解释显示数据数组中的信息的指示/建议,当我检查这样的显示数据时,它们似乎都是相同的值,尽管它们确实会因麦克风输入而异。

麦克风的输入预期是带有原始信号的一些回声的信号,自相关的目标是确定自相关峰值的滞后,以便我可以确定回声与原始信号的偏移量。

我是否应该首先创建信号的回声版本(带有一些偏移)并在 FFT 的多个值中使用它?

我很感激任何意见,如果你能指导我获得更清楚地解释这一点的信息,因为我对 vDSP 技术相当陌生,尤其是在 iPhone 上。我确实有卷积和傅立叶变换的数学经验,但苹果的就地包装让我猜测我在哪里可以找到我希望从这个计算中获得的信息。

4

1 回答 1

1

检查您调用的每个例程(vDSP 等)的数据类型,并确保您提供了正确的 C 数据类型。使用调试器检查每个子例程的输入,在获得 NaN 结果之前开始并向后工作,以确保输入数据正确(类型和比例等)。您还可以将数据复制到/从缓冲区复制出于调试目的,您可以根据自己的喜好进行更多格式设置,以便您可以看到之前/之后的结果,即使是就地计算。

另请注意,inNumberFrames 可能与您想要自相关的向量的长度无关,具体取决于您想要的结果信息。您可能需要额外的矢量缓冲区。

于 2011-10-27T17:17:58.473 回答