我一直在尝试使用Apple提供的vDSP库(Accelerate框架)在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-&gt; mBuffers [0] .mData)拆分为偶数和奇数输入。 - 执行FFT(前进) - 取FFT生成的值的绝对平方。 - 采取IFFT(反向/反向) - 将复数分割转换为实数。
有人可以给我一些指示/建议,如何解释displaydata数组中的信息,当我检查这样的显示数据时,它们似乎都是相同的值,但它们确实根据麦克风输入而变化。
预计麦克风的输入是具有原始信号的一些回波的信号,自相关的目标是确定自相关峰值的滞后,以便我可以确定回波与原始信号的偏移。信号。
我应该先创建一个信号的回声版本(有一些偏移量)并使用它来得到FFT的多个值吗?
我感谢任何输入,如果你可以引导我更清楚地解释这一点的信息,因为我相当新的vDSP技术,特别是在iPhone上。我确实有卷积和傅立叶变换的数学经验,但Apple的包装正在让我猜测我可以在哪里找到我希望从这个计算中得到的信息。
答案 0 :(得分:1)
检查您调用的每个例程(vDSP等)的数据类型,并确保提供正确的C数据类型。使用调试器检查每个子例程的输入,在获得NaN结果之前开始并向后工作,以确保输入数据正确(类型和比例等)。您还可以将数据复制到缓冲区或从缓冲区复制数据。格式更符合您的喜好,以便进行调试,以便您可以在结果之前/之后查看,甚至是就地计算。
另请注意,inNumberFrames可能与您要自动相关的矢量长度无关,具体取决于您想要的结果信息。您可能需要额外的矢量缓冲区。