我正在尝试构建一个计数拍手的 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 中实现它。