Обнаружение хлопа в IOS

Я пытаюсь создать приложение IOS, которое учитывает claps. Я смотрю видео WWDC на CoreAudio, и тема кажется такой огромной, что я не совсем уверен, где искать.

Я нашел похожие проблемы здесь в stackoverflow. Вот один из них в С# для обнаружения дверного шлема: Учитывая аудиопоток, найдите, когда дверь захлопывает (расчет уровня звукового давления?)

Кажется, мне нужно это сделать:

  • Разделите образцы на разделы
  • Вычислить энергию каждого раздела
  • Возьмите отношение энергий между предыдущим окном и текущим окном
  • Если отношение превышает некоторый порог, определите, что произошел внезапный громкий шум.

Я не уверен, как это сделать в 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.

Ответ 1

Вы не указали, какую именно верность обнаружения вы ищете? Честно говоря, просто проверка на какое-то звуковое изменение давления может быть вполне адекватной для ваших нужд.

Имейте в виду, однако, что удары по телефону могут оказаться очень низкой частотой и довольно мощным импульсом, так что он вызовет ваш детектор, даже если это не настоящий хлопок. То же самое для очень высокочастотных источников звука, которые также вряд ли будут хлопать.

Это нормально для ваших нужд?

Если нет, и вы надеетесь на что-то более высокую точность, я думаю, что вам лучше сделать спектральный анализ (FFT) входного сигнала, а затем смотреть в гораздо более узком диапазоне частот для резкого всплеска сигнала, аналогичного часть, которую вы уже имеете.

Я не смотрел внимательно на этот источник, но здесь можно найти какой-то возможный код с открытым кодом FFT, который вы, возможно, можете использовать как-будто для своего приложения iphone:

Изменить: https://github.com/alexbw/iPhoneFFT

Хорошая роль в графическом отображении спектрального результата заключается в том, что он должен упростить настройку того диапазона частот, который вам действительно нужен. В моих собственных тестах с некоторым программным обеспечением для ноутбуков у меня есть, у моих хлопок очень сильный всплеск вокруг 1 кГц - 2 кГц.

Возможно, вам нужно пережить, но если вам нужна что-то более высокая точность, я подозреваю, что вас не устраивает просто отслеживание сигнала, не зная, какой диапазон частот привел к сигнальному шипу в первую очередь.

Приветствия