检测IOS中的拍手

时间:2012-06-23 22:47:52

标签: iphone ios algorithm core-audio

我正在尝试构建一个计算claps的IOS应用程序。我一直在观看CoreAudio上的WWDC视频,主题看起来很大,我不太确定在哪里看。

我在stackoverflow中发现了类似的问题。这是用于检测门砰击的C#中的一个: Given an audio stream, find when a door slams (sound pressure level calculation?)

似乎我需要这样做:

  1. 将样本分为几个部分
  2. 计算每个部分的能量
  3. 取上一个窗口和当前窗口之间的能量比率
  4. 如果比率超过某个阈值,请确定突然发出巨响。
  5. 我不确定如何在Objective-C中完成此任务。 我已经能够弄清楚如何使用 SCListener 对音频进行采样 这是我的尝试:

    - (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];
    
    }
    

    enter image description here

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

2 个答案:

答案 0 :(得分:4)

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

请记住,手机碰撞可能会导致非常低的频率和相当高功率的脉冲,即使它不是真正的拍手也会触发探测器。同样适用于非常高频的声源,也不太可能是拍手。

这可以满足您的需求吗?

如果没有,并且你希望获得更高保真度的东西,我认为你最好对输入信号进行频谱分析(FFT),然后在更窄的频带中寻找尖锐的信号尖峰,类似于你已经拥有的部分。

我没有密切关注这个来源,但是这里有一些可能的开源FFT代码,你可能希望按原样使用你的iphone应用程序:

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

关于绘制光谱结果的好处是它应该可以很容易地调整你真正关心的频率范围。在我自己的一些笔记本电脑软件的测试中,我的拍手在1kHz - 2kHz附近有很强的尖峰。

可能需要满足你的需求,但如果你需要更高保真度的东西,那么我怀疑你不会满足于只是跟踪信号尖峰而不知道什么频率范围导致信号尖峰。

干杯

答案 1 :(得分:0)

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

此致