首页 > 解决方案 > Audiokit 小频率上的奇怪幅度值

问题描述

我正在尝试使用适用于 iOS 的 AudioKit 库构建简单的频谱分析仪:

黄线是最大值,红线是电流 - 每秒变化 10 次。

在此处输入图像描述

问题是,前几个频率点的幅度值太高,我认为这是错误的。

代码(我删除了与 AudioKit 无关的部分):

AppDelegate 初始化:

mic = AKMicrophone()

fftTap = AKFFTTap.init(mic!)
tracker = AKFrequencyTracker.init(mic)
let silence = AKBooster(tracker, gain: 0)

AudioKit.output = silence
try! AudioKit.start()

视图控制器:

let micSampleRate = 44100

var tracker: AKFrequencyTracker!
var fftTap: AKFFTTap?

var maxValues = [Double](repeating: -400, count: 255)

let timeInterval = 0.1

var isPaused = true

let FFT_SIZE = 510

override func viewDidLoad() {
    super.viewDidLoad()

    tracker = (UIApplication.shared.delegate as! AppDelegate).tracker
    fftTap = (UIApplication.shared.delegate as! AppDelegate).fftTap

    let freqPreparedValue =  self.micSampleRate * 0.5 / self.FFT_SIZE

    Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: true) { [unowned self] (timer) in
        if (!self.isPaused) {

            for i in stride(from: 0, to: self.FFT_SIZE - 2, by: 2) {

                let re = self.fftTap!.fftData[i]
                let im = self.fftTap!.fftData[i + 1]
                let normBinMag = 2.0 * sqrt(re * re + im * im)/self.FFT_SIZE
                //let freq = self.micSampleRate * 0.5 * i / self.FFT_SIZE
                let freq = freqPreparedValue * i
                let amplitude = 20.0 * log10(normBinMag)

                let i2 = i / 2
                if (self.maxValues[i2] < amplitude) {
                    self.maxValues[i2] = amplitude
                }

                //to understand, what is X and Y on image
                tickDataSeries.appendX(SCIGeneric(freq), y: SCIGeneric(amplitude))
                tickMaxDataSeries.appendX(SCIGeneric(freq), y: SCIGeneric(self.maxValues[i2]))

                print("bin: \(i/2) \t freq: \(freq)\t ampl.: \(amplitude)\t maxVal: \(self.maxValues[i2])\t re: \(re)\t im: \(im)" )
            }
        }
    }
}

部分输出(不是任何真实的声音,主要是麦克风周围的静音):

bin: 0   freq: 0.0   ampl.: -118.073654770687    maxVal: -110.92564348456614     re: 3.5231216315878555e-05  im: 0.0003163595392834395
bin: 1   freq: 86.47058823529412     ampl.: -133.15079565501773  maxVal: -132.1323399190405  re: 5.5011274525895715e-05  im: 1.1023327715520281e-05
bin: 2   freq: 172.94117647058823    ampl.: -156.47641201587314  maxVal: -144.73820841794645     re: 3.040101546503138e-06   im: 2.3225734366860706e-06
bin: 3   freq: 259.4117647058823     ampl.: -166.16880958269164  maxVal: -152.1284594880522  re: 4.182010684417037e-07   im: 1.1816056257885066e-06
bin: 4   freq: 345.88235294117646    ampl.: -160.81829961464794  maxVal: -156.8105240841191  re: 2.272412530146539e-06   im: 4.711087910891365e-07
bin: 5   freq: 432.3529411764706     ampl.: -172.891584678714    maxVal: -162.2467662380227  re: 5.55981898742175e-07    im: 1.5817417420294078e-07

看看,幅度从 -118 下降到 -172 的速度有多快,然后在 -170 - -200 值附近反弹。

是不是错了?

标签: swiftaudioaudiokit

解决方案


您正在查看 bin 0 中的 DC 偏移。这里有关于如何消除它的信息:http: //blog.originlab.com/data-handling/how-to-remove-dc-offset-before-performing-fft

至于其余的 bin,如果这是音频信号,86 Hz 及以上的声音并不难产生。它高于标准吉他的低 E,并且高于由电源产生并在大量电子设备中拾取的 60 周期嗡嗡声(欧盟为 50)。鉴于您将其描述为“麦克风周围的沉默”,您报告的信号在我看来并不典型。它可能主要由没有大量高频成分的噪声源(例如房间噪声、您在椅子上拖着脚步、电子设备中拾取的电源嗡嗡声)所主导。

所以不,这没有错。

编辑:为了进一步澄清,对于典型的房间和录音设置,您有一个非常合理的频谱,无需特殊处理。您的本底噪声比您的信号削波低 100db 以上,因此很有可能您实际上并没有在这里看到问题。


推荐阅读