我一直在尝试使用 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 上。我确实有卷积和傅立叶变换的数学经验,但苹果的就地包装让我猜测我在哪里可以找到我希望从这个计算中获得的信息。