如何用AudioKit为麦克风添加滤波器?现有代码无法滤除100Hz以上频率求助
问题分析与解决方案
我一眼就看出你的代码核心问题:你创建了低通滤波器,但完全没把它接入音频信号的处理链路中,导致滤波操作根本没生效,频率跟踪器还是在处理原始麦克风信号,当然滤不掉100Hz以上的频率啦!
具体问题点
你当前的信号流是:麦克风 → tracker → silence(输出)
而lowFilter虽然被创建并启动了,但它的输出没有被任何后续节点使用,相当于一个“孤立”的组件,完全没参与到实际音频处理中。
修正后的完整代码
下面是调整后的代码,我把信号流改成了麦克风 → 低通滤波 → 频率跟踪 → 输出,确保滤波后的信号才会被频率跟踪器处理:
import AudioKit // 初始化麦克风输入 let microphone = AKMicrophone() // 给麦克风信号加低通滤波,cutoff设为100Hz(滤除100Hz以上频率) let lowFilter = AKLowPassFilter(microphone, cutoffFrequency: 100.0, resonance: 0) // 频率跟踪器监听经过滤波后的信号 let tracker = AKFrequencyTracker(lowFilter, hopSize: 200.0, peakCount: 2000.0) // 如果不需要监听滤波后的声音,用booster将输出静音;如果需要监听,直接把AudioKit.output设为lowFilter即可 let silence = AKBooster(tracker, gain: 0) // 设置AudioKit的输出节点 AudioKit.output = silence do { // 启动AudioKit前确保获取麦克风权限 try AKSettings.requestPermission() try AudioKit.start() // 按信号流顺序启动节点:输入 → 处理 → 输出 microphone.play() lowFilter.start() tracker.start() silence.start() // 可以在这里添加监听代码,验证滤波后的频率 Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in print("当前跟踪到的频率:\(tracker.frequency) Hz") } } catch { print("AudioKit启动失败:\(error.localizedDescription)") }
关键调整说明
- 修正信号链路:把
AKFrequencyTracker的输入从原始麦克风改成lowFilter,这样跟踪器处理的是已经滤除高频后的信号 - 启动顺序优化:按信号流的方向启动节点(麦克风→滤波器→跟踪器→输出),避免节点启动顺序导致的异常
- 添加权限请求:补充了麦克风权限请求代码,确保App能正常访问麦克风(这也是常见的排查点)
- 验证代码:添加了定时器打印当前跟踪的频率,方便你确认100Hz以上的频率已经被滤除
额外注意事项
- 如果需要监听滤波后的音频,直接把
AudioKit.output = silence改成AudioKit.output = lowFilter即可 resonance设为0是合理的,这个参数控制滤波器的Q值,0代表平坦的滤波特性,不会过度放大截止频率附近的信号
内容的提问来源于stack exchange,提问作者duiyueliu
相关产品推荐
相关产品推荐

