如何在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()
注意要点
- 带宽参数适配:原AVAudioUnitEQ的parametric滤波器默认Q值约为1,AudioKit的
ParametricEQ的bandwidth参数可与Q值转换(Q = 0.5 * (freq/bandwidth + bandwidth/freq)),若需要完全匹配原均衡器的滤波特性,可调整defaultBandwidth参数。 - 节点顺序调整:示例中是先应用全局增益再处理频段EQ,若需要复现原AVAudioUnitEQ先处理频段再应用全局增益的逻辑,只需调整节点连接顺序:将输入先接入第一个EQ,最后接入Gain节点即可。
- 性能与扩展性:多个
ParametricEQ串联的性能与原生AVAudioUnitEQ几乎一致,均基于Apple的AudioUnit框架;自定义类可轻松扩展频段开关(bypass)功能,只需给每个ParametricEQ添加bypass控制方法即可。
内容的提问来源于stack exchange,提问作者KAMIKAZE
相关产品推荐
相关产品推荐

