AVAudioUnitEQ / .BandPass filter doesn't work

2019-07-24 14:26发布

问题:

I can't get the AVAudioUnitEQ to work.

Here's a piece of code that should filter out everything except 659.255Hz +/-0.05 octaves:

// Create Audio Engine

var audioEngine = AVAudioEngine()

// Create Equalizer Node

var equalizerNode = AVAudioUnitEQ(numberOfBands: 1) 
var epualizerParameters: AVAudioUnitEQFilterParameters = equalizerNode.bands.first as AVAudioUnitEQFilterParameters
epualizerParameters.filterType = .BandPass
epualizerParameters.frequency = 659.255
epualizerParameters.bandwidth = 0.05
epualizerParameters.bypass = false
audioEngine.attachNode(equalizerNode)

// Configure Audio Engine

var format = audioEngine.inputNode.inputFormatForBus(0)
audioEngine.connect(audioEngine.inputNode, to: equalizerNode, format: format)
audioEngine.connect(equalizerNode, to: audioEngine.outputNode, format: format)


// Start Audio Engine

var error:NSError?
audioEngine.startAndReturnError(&error)

However, when I run it, put on my headphones and sing into the microphone, I can hear myself loud and clear.

Now, according to Wikipedia, the Band Pass filter is:

... a device that passes frequencies within a certain range and rejects (attenuates) frequencies outside that range.

What am I doing wrong? I want to filter out everything except given frequency range.

回答1:

It was your EQ params.

I created a github project with sliders and switches. You can hear the difference. Try it.



回答2:

This works in my project which uses a playerNode.

var format =  engine.mainMixerNode.outputFormatForBus(0)
engine.connect(playerNode, to: EQNode, format: format )
engine.connect(EQNode, to: engine.mainMixerNode, format: format)

I see you're using the engine's inputNode. Try swapping out these few lines (hook into the mixer instead of the outputNode) and let us know if it works.