gpt4 book ai didi

iphone - 在 IOS 中检测拍手

转载 作者:技术小花猫 更新时间:2023-10-29 11:06:05 25 4
gpt4 key购买 nike

我正在尝试构建一个计算拍手次数的 IOS 应用程序。我一直在 CoreAudio 上观看 WWDC 视频,主题似乎非常广泛,以至于我不太确定要看哪里。

我在 stackoverflow 中发现了类似的问题。下面是用 C# 编写的用于检测关门声的代码: Given an audio stream, find when a door slams (sound pressure level calculation?)

看来我需要这样做:

  1. 将样本分成几个部分
  2. 计算每个部分的能量
  3. 取前一个窗口和当前窗口之间的能量比
  4. 如果比率超过某个阈值,则确定有突然的巨响。

我不确定如何在 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 中实现它。

最佳答案

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

但请记住,对手机的碰撞最终可能会成为频率非常低且功率相当高的脉冲,因此即使它不是真正的拍手,它也会触发您的检测器。对于不太可能是拍手的超高频声源也是如此。

这可以满足您的需求吗?

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

我没有仔细查看这个来源,但这里有一些可能的开源 FFT 代码,您希望可以按原样用于您的 iPhone 应用程序:

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

将频谱结果绘制成图形的好处在于,它应该可以很容易地调整您真正关心的频率范围。在我自己使用一些笔记本电脑软件进行的测试中,我的拍手在 1kHz - 2kHz 附近有一个非常强的尖峰。

对于您的需求来说可能有点矫枉过正,但如果您需要更高保真度的东西,那么我怀疑您不会满足于简单地跟踪信号尖峰而不知道首先导致信号尖峰的频率范围。

干杯

关于iphone - 在 IOS 中检测拍手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11173605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com