You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)")
}

关键调整说明

  1. 修正信号链路:把AKFrequencyTracker的输入从原始麦克风改成lowFilter,这样跟踪器处理的是已经滤除高频后的信号
  2. 启动顺序优化:按信号流的方向启动节点(麦克风→滤波器→跟踪器→输出),避免节点启动顺序导致的异常
  3. 添加权限请求:补充了麦克风权限请求代码,确保App能正常访问麦克风(这也是常见的排查点)
  4. 验证代码:添加了定时器打印当前跟踪的频率,方便你确认100Hz以上的频率已经被滤除

额外注意事项

  • 如果需要监听滤波后的音频,直接把AudioKit.output = silence改成AudioKit.output = lowFilter即可
  • resonance设为0是合理的,这个参数控制滤波器的Q值,0代表平坦的滤波特性,不会过度放大截止频率附近的信号

内容的提问来源于stack exchange,提问作者duiyueliu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:29:47