【问题标题】:Understanding autocorrelation using the FFT and accelerate framework - iPhone使用 FFT 和加速框架理解自相关 - iPhone
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的意见。在我阅读您的调试建议之前,我认为 NAN 可能是由我进行前向傅立叶变换之前的输入值引起的。调试 C 数据类型显示来自麦克风的输入是“SInt16”值,我正在检查浮点数。将此输入转换为浮点值解决了该问题。谢谢!
    猜你喜欢
    • 2012-06-04
    • 2012-12-16
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2011-09-15
    • 2011-02-02
    相关资源
    最近更新 更多