Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在IOS中检测到clap_Iphone_Ios_Algorithm_Core Audio - Fatal编程技术网

Iphone 在IOS中检测到clap

Iphone 在IOS中检测到clap,iphone,ios,algorithm,core-audio,Iphone,Ios,Algorithm,Core Audio,我正在尝试构建一个计算CLAP的IOS应用程序。我一直在看CoreAudio上的WWDC视频,主题似乎太广泛了,我不太确定该去哪里看 我在stackoverflow中发现了类似的问题。这里有一个C#用于检测门砰的一声: 看来我需要这样做: 将样品分成若干部分 计算每个部分的能量 取上一个窗口和当前窗口之间的能量比 如果比率超过某个阈值,则确定有突然的大噪音 我不知道如何在Objective-C中实现这一点。 我已经能够找出如何使用SCListener对音频进行采样 以下是我的尝试: - (vo

我正在尝试构建一个计算CLAP的IOS应用程序。我一直在看CoreAudio上的WWDC视频,主题似乎太广泛了,我不太确定该去哪里看

我在stackoverflow中发现了类似的问题。这里有一个C#用于检测门砰的一声:

看来我需要这样做:

  • 将样品分成若干部分
  • 计算每个部分的能量
  • 取上一个窗口和当前窗口之间的能量比
  • 如果比率超过某个阈值,则确定有突然的大噪音 我不知道如何在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];
    
    }
    


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

    你没有提到你想要什么样的检测保真度?老实说,仅仅检查一下声音“压力”的变化就完全可以满足你的需要

    但是,请记住,手机上的碰撞可能最终是一个非常低的频率和相当高的功率脉冲,这样它会触发你的探测器,即使它不是一个实际的拍击。对于不太可能是拍手声的甚高频声源也是如此

    这适合你的需要吗

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

    我还没有仔细研究过这个源代码,但这里有一些可能的开源FFT代码,您可以在iphone应用程序中原样使用:

    编辑:

    绘制光谱结果的好处在于,它应该可以很容易地调整你真正关心的频率范围。在我自己使用一些笔记本电脑软件进行的测试中,我的CLAP在1kHz-2kHz左右有一个非常强的峰值

    对于您的需求,可能有过多的杀伤力,但是如果您需要更高的保真度,那么我怀疑您不会满足于仅仅跟踪信号尖峰,而不知道什么频率范围首先导致了信号尖峰

    干杯

    我在应用程序中使用了FFT。频域中的Clap看起来像一个(不完美的)常数


    关于

    算法很清楚,可能只需要调整。在Objective-C中实现它有什么问题?Objective-C不是普通C的超集吗?如果你能用普通的C语言来做,你应该能用Objective-C来做。试试这个[教程:当用户对着麦克风吹气时进行检测]()为了找到一些可能的方法,你到mobileOrchard.com的链接为我找到了404。@john.k.doe试试这个(.@Nathan Clark,你能告诉我这是如何解决的吗?objective-c方法很棘手,因为在AVAudioFoundation框架中没有一种简单的方法来实现算法。oscopeapp链接不再有效。嗨,JDischler。我正在创建一个基于鼓掌的应用程序。但是我有点搞不清楚如何使用它使用它。那么你能给我提供一个完整的基于鼓掌的例子,或者提供任何例子链接,让我可以实现。thnx–