AudioKit (iOS) - Добавить наблюдателя для изменения частоты / амплитуды

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

Прямо сейчас я использую этот простой код Swift для своего приложения:

mic = AKMicrophone()
tracker = AKFrequencyTracker(mic)
silence = AKBooster(tracker, gain: 1)
AKSettings.audioInputEnabled = true
AudioKit.output = silence
AudioKit.start()

let t = Timer.scheduledTimer( timeInterval: 0.05, target: self, selector: #selector(self.checkFrequencyAmplitude), userInfo: nil, repeats: true)

func checkFrequencyAmplitude() {
   let frequency = tracker.frequency,
       amplitude = tracker.amplitude
   if (frequency > 1000 && frequency < 1200 && amplitude > 0 && amplitude < 0.2) {
      // do stuff if the specific tone appeared
   }
}

Но, честно говоря, у меня возникли серьезные проблемы с использованием timeInterval с 0,05 с, например, мой iPhone очень быстро нагревается, и это совсем не то, что я хочу.

  • Имейте в виду: просто использовать другой timeInterval, например, одну секунду (timeInterval: 1.0), невозможно, потому что мое приложение должно уметь как можно быстрее определять конкретный звук. (Некоторые входные звуки могут быть довольно короткими [0,5 секунды или меньше].)

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

Или, может быть, можно добавить что-то вроде наблюдателя Swift в AKFrequencyTracker-подкласс ..

Я не знаю, что делать дальше, и буду очень благодарен за помощь.


person Community    schedule 12.01.2018    source источник


Ответы (1)


Вместо использования таймера вы должны позволить DSP проверять ваши условия за вас. Для этого вам придется отредактировать частотомер или создать свою копию. Хорошей новостью является то, что трекер амплитуды AudioKit уже делает что-то подобное, вызывая функцию всякий раз, когда слышен определенный уровень громкости, т.е. достигается порог амплитуды:

https://github.com/AudioKit/AudioKit/blob/master/AudioKit/Common/Nodes/Analysis/Amplitude%20Tracker/AKAmplitudeTrackerDSPKernel.hpp#L97

Если вы сделаете это обычным образом, вы даже можете сделать запрос на перенос и передать код обратно в AudioKit. На самом деле, если вы хотите это сделать, я могу помочь вам направить вас в правильном направлении. Но я думаю, что вы можете довольно далеко продвинуться, используя трекер амплитуды в качестве шаблона.

person Aurelius Prochazka    schedule 12.01.2018
comment
Спасибо за быстрый ответ, Аврелий. Tbh Я понятия не имею о C ++, но я уверен, что это будет не так уж плохо, потому что ваши hpp-файлы не выглядят такими большими .. Однако я также не совсем уверен, где мне нужно редактировать ваш код, потому что я получаю 2 .framework-files отображается моим Xcode. Взгляните на это изображение, потому что я уверен, что вы знаете ответ :) imgur.com - person ; 13.01.2018
comment
Вам нужно будет использовать AudioKit как включенный проект Xcode, а не как предварительно созданный фреймворк, если вы собираетесь вносить изменения в исходный код. - person Aurelius Prochazka; 14.01.2018