检测IOS中的拍手

我正在试图build立一个计数鼓掌的IOS应用程序。 我一直在观看CoreAudio上的WWDCvideo,这个话题看起来如此之大,我不太确定在哪里看。

我在这里find类似的问题在计算器。 这里是C#中用于检测门砰然响的一个 : 给定一个audiostream,find一个门砰的一声(声压级计算?)

看来我需要这样做:

  1. 把样品分成几个部分
  2. 计算每个部分的能量
  3. 取前一窗口和当前窗口之间的能量比值
  4. 如果该比率超过某个阈值,则确定存在突然的巨大噪音。

我不知道如何在Objective-C中做到这一点。 我已经能够弄清楚如何用SCListener采样audio这里是我的尝试:

- (void)levelTimerCallback:(NSTimer *)timer { [recorder updateMeters]; const double ALPHA = 0.05; double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0])); lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults; if ([recorder peakPowerForChannel:0] == 0) totalClapsLabel.text = [NSString stringWithFormat:@"%d", total++]; SCListener *listener = [SCListener sharedListener]; if (![listener isListening]) return; AudioQueueLevelMeterState *levels = [listener levels]; Float32 peak = levels[0].mPeakPower; Float32 average = levels[0].mAveragePower; lowPassResultsLabel.text = [NSString stringWithFormat:@"%f", lowPassResults]; peakInputLabel.text = [NSString stringWithFormat:@"%f", peak]; averageInputLabel.text = [NSString stringWithFormat:@"%f", average]; } 

在这里输入图像说明

虽然我看到了build议的algorithm,但我不清楚如何在Objective-C中实现它。

你没有提到你正在寻找什么样的检测保真度? 只是检查某种声音“压力”的变化可能完全满足您的需求,诚实。

请记住,碰到手机可能会成为一个非常低频率和相当高的动力冲动,使它会触发你的探测器,即使它不是一个真正的拍手。 同样是非常高频率的声源,也不可能是一个鼓掌。

这可以满足您的需求吗?

如果不是,而且您希望获得更高的保真度,那么我认为您最好对input信号进行频谱分析(FFT),然后查看更窄的频带以获得尖锐的信号峰值,这与您已经有。

我没有仔细查看这个源代码,但是这里有一些可能的开源FFT代码,你可以直接使用你的iphone应用程序:

编辑: https : //github.com/alexbw/iPhoneFFT

关于绘制频谱结果的好处是,它可以很容易地调整你真正关心的频率范围。 在我自己的一些笔记本电脑的testing中,我的掌声在1kHz – 2kHz左右有很强的尖峰。

但是如果你需要更高的保真度,那么我怀疑你不会满足于简单地追踪信号峰值而不知道首先引起信号峰值的频率范围。

干杯

我用我的应用程序https://itunes.apple.com/us/app/clapmera/id519363613?mt=8的 FFT。 在频域拍手看起来像一个(不完美)常数。

问候