AudioKit (iOS) - 为频率/幅度变化添加观察者

Posted

技术标签:

【中文标题】AudioKit (iOS) - 为频率/幅度变化添加观察者【英文标题】:AudioKit (iOS) - Add observer for frequency / amplitude change 【发布时间】:2018-01-12 14:44:28 【问题描述】:

我正在使用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 with 0.05s 时遇到了很多问题,比如我的 iPhone 升温超快,这绝对不是我想要的。

记住:仅使用另一个 timeInterval 例如一秒 (timeInterval: 1.0) 是不可能的,因为我的应用程序必须能够尽快检测到特定的声音。 (某些输入声音可能很短 [0.5 秒或更短]。)

也许 AudioKit 开发人员添加了一些事件,如果输入获得特定的频率/幅度,则可以触发。

或者也许可以在AKFrequencyTracker-subclass 中添加类似 Swift 观察者的东西..

我不知道如何继续,非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

您应该让 DSP 为您检查您的情况,而不是使用计时器。为此,您必须编辑频率跟踪器或创建自己的副本。好消息是,AudioKit 的幅度跟踪器已经做了类似的事情,只要听到某个音量,即调用一个函数。达到幅度阈值:

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

如果您以一般方式执行此操作,您甚至可以发出拉取请求并将代码提交回 AudioKit。实际上,如果您想这样做,我可以帮助您进一步朝着正确的方向前进。但是,我认为使用幅度跟踪器作为模板可以走得更远。

【讨论】:

感谢您的快速回答 Aurelius。 Tbh我对c ++一无所知,但我相信这不会那么糟糕,因为你的hpp文件看起来没有那么大..但是我也不确定我必须在哪里编辑你的代码,因为我得到了2 .framework-files 由我的 Xcode 显示。请看看这张照片,因为我相信你会知道答案:) imgur.com 如果要更改源代码,您需要将 AudioKit 用作包含的 Xcode 项目,而不是作为预构建框架。

以上是关于AudioKit (iOS) - 为频率/幅度变化添加观察者的主要内容,如果未能解决你的问题,请参考以下文章

使用AudioKit测量声音(频率加权)的声音水平

试图了解 AudioKit 中 AKFFTTap 的输出

AudioKit - 获取特定频率的问题(高于 20kHz)

AKAmplitudeTracker 幅度使用 audioKit 获得 0.0

AudioKit 示例 MicrophoneAnalysis 的最大频率

如何获得 iOS Accelerate FFT 结果的频率幅度?