目前我正在使用AVAudioEngine从麦克风中获取音频样本,并成功地实现了快速傅立叶变换。为了获得稳定的频率值,我还在FFT之前对音频样本实现了一个Hann窗口。现在我想在音频样本上实现低通滤波器,以消除高频。我在iOS中做了一些关于低通滤波器的研究,但大多数答案都是用AVAudioUnit找到的。这让我很困惑,有没有可能只在AVAudioEngine中实现一个低通滤波器?是否可以在音频样本上应用低通滤波器?如果是,我们需要遵循哪种方法?提前谢谢。
发布于 2020-05-04 14:15:01
欢迎来到文档匮乏的AVAudioEngine世界。
不确定你是如何设置你的AVAudioEngine的,但作为一个快速浏览,我猜你会看到一些东西,这些行很长:
创建引擎let engine = AVAudioEngine()创建效果节点var equalizer = AVAudioUnitEQ(numberOfBands: 1)附加节点engine.attach(equalizer)连接节点engine.connect(equalizer, to: engine.mainMixerNode, format: audioFormat)准备并启动引擎。您还将为您的音频样本附加和连接playerNode。
至于你的问题。AVAudioUnits是效果节点用于让AVAudioEngine操纵音频的子类。您可以通过所操纵的节点间接地将其与AVAudioEngine一起使用。
为了让AVAudioEngine操作低通滤波器,您可以使用一个频带实例化一个AVAudioUnitEQ (如上所述)。然后用一个改变滤波器频率的函数来操纵效果:
func setLowPassFilter(frequency: Float){
filter.bands[0].filterType = .lowPass
filter.bands[0].frequency = frequency
filter.bands[0].bypass = false
}这些旁路效果的关键是设置AVAudioUnitEQ = false,否则它将忽略您的效果。
我希望这能帮到你。AVAudioEngine世界非常孤单,所以我想向你推荐这个免费的应用程序:Phonique
这是一个由真正的AudioEngine专家Chris Davis创建的应用程序,它可以让你轻松地试验AVAudioEngine来找到你的效果,然后检查他干净的生成的代码是如何连接的。在this的帖子中,他解释了它是如何工作的。它并不总是提供对您自己的代码的替代,但它是查看应该如何连接的完美位置。祝好运
https://stackoverflow.com/questions/60409092
复制相似问题