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

如何在AudioKit中创建类似AVAudioUnitEQ的简易均衡器?

迁移AVAudioUnitEQ到AudioKit的解决方案

你的思路是对的,自定义类来封装多频段参数均衡+全局增益是最贴合原有AVAudioUnitEQ使用逻辑的方案,以下是具体实现思路和代码示例:

核心实现思路

AudioKit的ParametricEQ仅支持单频段,且无全局增益功能,我们可以通过以下方式复现原生均衡器的特性:

  • 用多个ParametricEQ实例对应原均衡器的每个频段
  • 新增一个Gain节点实现globalGain的全局增益控制
  • 将这些节点封装成自定义类,统一管理频段增益和全局增益的设置逻辑

自定义均衡器类代码

import AudioKit

class MultiBandParametricEQ: Node {
    let input: Node
    private var eqBands: [ParametricEQ] = []
    private let globalGain: Gain
    
    var output: Node { globalGain }
    
    /// 初始化多频段参数均衡器
    /// - Parameters:
    ///   - input: 输入节点
    ///   - frequencies: 各频段中心频率数组
    ///   - initialGlobalGain: 初始全局增益(默认0dB)
    ///   - defaultBandwidth: 每个频段默认带宽(默认1,可根据需求调整)
    init(input: Node, frequencies: [Double], initialGlobalGain: Double = 0, defaultBandwidth: Double = 1) {
        self.input = input
        self.globalGain = Gain(input, gain: initialGlobalGain)
        
        // 串联初始化每个频段的参数均衡器
        var previousNode: Node = globalGain
        for freq in frequencies {
            let eq = ParametricEQ(previousNode, frequency: freq, gain: 0, bandwidth: defaultBandwidth)
            eqBands.append(eq)
            previousNode = eq
        }
    }
    
    /// 设置指定频段的增益
    func setBandGain(at index: Int, gain: Double) {
        guard index >= 0, index < eqBands.count else { return }
        eqBands[index].gain = gain
    }
    
    /// 设置全局增益
    func setGlobalGain(_ gain: Double) {
        globalGain.gain = gain
    }
    
    /// 获取所有频段的当前增益
    func currentBandGains() -> [Double] {
        eqBands.map { $0.gain }
    }
}

使用示例

// 定义频段频率(和原AVAudioUnitEQ配置一致)
let frequencies: [Double] = [60, 170, 310, 600, 1000, 3000, 6000, 12000]

// 初始化AudioKit引擎
let engine = AudioEngine()
guard let inputNode = engine.input else {
    fatalError("音频输入不可用")
}

// 创建自定义均衡器
let eq = MultiBandParametricEQ(input: inputNode, frequencies: frequencies)

// 复现原代码的参数设置逻辑
eq.setGlobalGain(eqSettings.generalGain)
for i in 0..<frequencies.count {
    eq.setBandGain(at: i, gain: values[i])
}

// 连接输出并启动引擎
engine.output = eq.output
try? engine.start()

注意要点

  1. 带宽参数适配:原AVAudioUnitEQ的parametric滤波器默认Q值约为1,AudioKit的ParametricEQ的bandwidth参数可与Q值转换(Q = 0.5 * (freq/bandwidth + bandwidth/freq)),若需要完全匹配原均衡器的滤波特性,可调整defaultBandwidth参数。
  2. 节点顺序调整:示例中是先应用全局增益再处理频段EQ,若需要复现原AVAudioUnitEQ先处理频段再应用全局增益的逻辑,只需调整节点连接顺序:将输入先接入第一个EQ,最后接入Gain节点即可。
  3. 性能与扩展性:多个ParametricEQ串联的性能与原生AVAudioUnitEQ几乎一致,均基于Apple的AudioUnit框架;自定义类可轻松扩展频段开关(bypass)功能,只需给每个ParametricEQ添加bypass控制方法即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 05:40:22