Audiokit在小频率上存在奇怪的振幅值

9
我正在尝试使用iOS的AudioKit库构建简单的频谱分析器: 黄线是最大值,红色是当前值——每秒更改10次。

enter image description here

问题在于,前几个频率点的振幅值太高,我认为这是错误的。
代码(我删除了与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之间反弹。

这难道不对吗?

1个回答

1
您正在查看第0个bin中的直流偏移量。这里有关于如何消除它的信息:http://blog.originlab.com/data-handling/how-to-remove-dc-offset-before-performing-fft 至于其他的bins,如果这是一个音频信号,86赫兹及以上的声音并不难产生。它高于标准吉他上的低E音,也高于由电网产生的(欧盟为50赫兹)60赫兹电磁干扰,在许多电子设备中都会被捕捉到。考虑到您将其描述为“麦克风周围的静默”,您报告的信号在我看来并不不寻常。它很可能被噪声源(例如房间噪声、您在椅子上晃动、电子设备中的电磁干扰)所主导,并没有太多高频内容。
所以,不,这并没有错。
编辑:为了进一步澄清,对于一个典型的房间和录音设置而言,您拥有一个相当合理的频谱,而不需要特殊处理。您的信噪比比您的信号削波100db还要高,因此您实际上可能并没有遇到问题。

感谢您的回答。至少现在清楚了研究的方向。 - Vadim
当然。你最好使用实际的声源进行分析(正弦波、粉红噪声、音乐、语音),而不是试图解释“无声”信号。 - user11563547
我将歌曲的图表与专业声音分析应用进行了比较,发现它们的模式大多相同,只是在不同的频率上。例如,在我的应用程序中,1k-2k Hz处有大幅度的峰值,在专业应用程序中则在0.5k-1.5k处。 可能是因为FFT大小不同 - 我的大小为510(也制作了1k和2k,但在2k时手机会发热,而1k则可以接受),而应用程序的FFT大小为2、4、8k。 - Vadim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接