【发布时间】:2011-12-16 09:38:42
【问题描述】:
我一直在尝试使用 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++ sn-p:Using the Apple FFT and Accelerate Framework
,来自麦克风的输入数据被发送到执行自相关的 ProcessAudioData 方法但是我在理解 displaydata 数组中的信息时遇到了一些麻烦。
当我尝试访问信息时,我得到的只是 nan,我唯一了解信息的时候是当我像这样投射 displaydata 数组时:
SInt16* buf = (SInt16 *)displayData;
计算自相关的步骤我遵循以下步骤: - 将实际输入 (ioData->mBuffers[0].mData) 拆分为偶数和奇数输入。 - 执行 FFT(前向) - 取 FFT 生成的值的绝对平方。 - 参加IFFT(向后/反向) - 将复数拆分为实数。
有人可以给我一些指示/建议,说明如何解释 displaydata 数组中的信息,当我检查这样的显示数据时,它们似乎都是相同的值,尽管它们确实因麦克风输入而异。
麦克风的输入预期是带有原始信号的一些回声的信号,自相关的目标是确定自相关峰值的滞后,以便我可以确定回声与原始信号的偏移量信号。
我是否应该首先创建信号的回显版本(带有一些偏移)并在 FFT 中使用它来倍增 FFT 的值?
感谢您的任何意见,如果您能指导我获得更清楚地解释这一点的信息,因为我对 vDSP 技术相当陌生,尤其是在 iPhone 上。我确实有卷积和傅立叶变换的数学经验,但是 Apple 的就地包装让我猜测在哪里可以找到我希望从这个计算中获得的信息。
【问题讨论】:
标签: iphone fft accelerate-framework cross-correlation