执行FFT以查找复音音频样本的基本频率

时间:2015-10-15 19:34:49

标签: ios swift signal-processing fft frequency-analysis

我在Swift中使用Accelerate Framework在音频文件上执行FFT。我正在尝试使用快速傅立叶变换找到复音音频文件基频

我对音频文件进行了快速傅里叶变换(我认为正确,但如果我错了,请纠正我);虽然,我不知道从哪里开始。以下是我用来执行FFT的代码:

let log2n = UInt(round(log2(Double(frameCount))))

let bufferSizePOT = Int(1 << log2n)

// Set up the transform
let fftSetup = vDSP_create_fftsetup(log2n, Int32(kFFTRadix2))

// create packed real input
var realp = [Float](count: bufferSizePOT/2, repeatedValue: 0)
var imagp = [Float](count: bufferSizePOT/2, repeatedValue: 0)
var output = DSPSplitComplex(realp: &realp, imagp: &imagp)

vDSP_ctoz(UnsafePointer<DSPComplex>(buffer.floatChannelData.memory), 2, &output, 1, UInt(bufferSizePOT / 2))

// Do the fast Fourier forward transform, packed input to packed output
vDSP_fft_zrip(fftSetup, &output, 1, log2n, Int32(FFT_FORWARD))

var fft = [Float](count:Int(bufferSizePOT / 2), repeatedValue:0.0)
let bufferOver2: vDSP_Length = vDSP_Length(bufferSizePOT / 2)

vDSP_zvmags(&output, 1, &fft, 1, bufferOver2)

// Release the setup
vDSP_destroy_fftsetup(fftSetup)

如何从此处找到基本频率?谢谢。

编辑:根据我已经完成的研究,似乎自相关是完成此任务的最佳方法。关于如何使用此代码执行autocorrelation的任何想法?

1 个答案:

答案 0 :(得分:0)

FFT(单独)不会在大多数复音音乐中找到基本的音调频率。相反,它会发现所有泛音和谐波频率,这可能在任何基本音调频率上都占主导地位。它甚至可能会错过埋在低频噪声中的一些基本音调频率。

对于比裸FFT更合适的算法,在MIREX论坛上有许多复音音高估计研究论文:http://www.music-ir.org/mirex/wiki/2015:Multiple_Fundamental_Frequency_Estimation_%26_Tracking