Objective-C 峰值检测加速框架
Posted
技术标签:
【中文标题】Objective-C 峰值检测加速框架【英文标题】:Objective-C Peak Detection Accelerate Framework 【发布时间】:2013-01-02 16:59:55 【问题描述】:我在这里不是数学大师,所以我想问任何熟悉数字信号处理的人,检测实时峰值的最佳方法是什么。我每秒得到大约 30 帧/值,我尝试实现斜率算法来检测峰值,它工作正常,大约 80% 的情况,但它真的不够好:(。
从我搜索的内容来看,应该使用快速傅立叶变换,但我不知道如何开始使用它,也许我错过了在这种情况下应该如何使用 FFT 的一般想法。
在 ios 中,我们有这个惊人的 Accelerate 框架,它应该可以帮助我做 FFT 的事情,但只要我不明白它对我来说几乎没有用处。
谁能给我指出正确的方向来启发我:-)?
非常感谢,新年快乐!
【问题讨论】:
你在这里输入什么,音频信号?峰值是指此输入中的最大音量点吗? 布拉德,实际上你不会相信 :D 我的输入基本上是来自 iPhone 相机的光值,它只是一个浮点数。峰值是指最大值(一个节拍),我正在编写一个心跳检测器(周末项目:])。有趣的是,我正在使用你的 GPUImage 库,这太棒了! :) FFT 在这里帮不了你。 @Andy - 处理相机的平均亮度可能有点棘手,因为我发现 iOS 相机的自动增益和白平衡设置往往会调整一些东西,以便图像几乎总是有 50% 的亮度。这可能会使识别波峰和波谷变得更加困难,但心跳的速度可能足以超过相机增益和曝光调整。 @BradLarson mmmm,我只能将其更改为红色通道,但据我所见,这些值非常好。 【参考方案1】:因此,您每秒生成一个包含 30 个样本的相机光值浮点数组。你想知道每秒的峰值是多少?还是曾经?要使用加速计算向量中的最大值,您可以使用vDSP_maxv
函数。
或者您是否尝试检测每秒高于给定阈值的所有峰值?在这种情况下,您可以生成一个包含阈值的向量,该向量的长度与搜索峰值的向量相同。然后您可以使用vDSP_vmax
函数查找所有高于此阈值的值。
如果这还不够好,还有很多更复杂的技术可以在时间序列中找到峰值,这里讨论一些简单的技术:
Peak Detection in Time Series
我可能会尝试计算梯度并使用 vDSP_nzcros
寻找 0 个交叉点。
【讨论】:
是的,我每秒有 30 个样本,但我将它们保存在一个数组中,并且仅在检测到一个节拍后才释放值,或者如果未检测到节拍,我只需将新值添加到数组的末尾,我从头开始删除旧的(与添加的值相同的数量)。基本上我必须在内存中存储足够的值,因为我需要实时节拍检测。我将研究 vDSP_maxv,看看我能找到什么。谢谢!以上是关于Objective-C 峰值检测加速框架的主要内容,如果未能解决你的问题,请参考以下文章