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

Ios 执行FFT以查找复调音频样本的基频,ios,swift,signal-processing,fft,frequency-analysis,Ios,Swift,Signal Processing,Fft,Frequency Analysis,我正在使用Swift中的加速框架对音频文件执行操作。我试图用快速傅立叶变换找到一个合成音音频文件的基频 我已经对音频文件执行了快速傅立叶变换(我认为正确,但如果我错了,请纠正我);尽管如此,我不知道从这里该去哪里。下面是我用来执行FFT的代码: let log2n = UInt(round(log2(Double(frameCount)))) let bufferSizePOT = Int(1 << log2n) // Set up the transform let fftSe

我正在使用Swift中的加速框架对音频文件执行操作。我试图用快速傅立叶变换找到一个合成音音频文件的基频

我已经对音频文件执行了快速傅立叶变换(我认为正确,但如果我错了,请纠正我);尽管如此,我不知道从这里该去哪里。下面是我用来执行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)
让log2n=UInt(圆形(log2(双重(帧数)))
让bufferSizePOT=Int(1FFT(单独)无法在大多数复调音乐中仅找到基音频率。相反,它还可以找到所有泛音和谐波频率,这些频率可能会支配任何基音频率。它甚至可能会错过埋在低频噪声中的一些基音频率


对于比裸FFT更合适的算法,在MIREX论坛上有许多关于复调基音估计的研究论文:

除了一些矩阵操作之外,我没有搞乱加速框架,但你可能想研究EZAudio框架()。为什么不必重新发明轮子呢:)这是一个迟钝的评论,但我觉得不得不这么说!OP的问题与其说是重新发明轮子,不如说是制造自己的轮子,这(IMHO)是一件好事。太多人只是依赖其他人的实现。谢谢,我会调查一下。你建议如何找到基频?好吧,一般来说,这可能仍然是一个尚未解决或只是最近才解决的研究课题。因此,我建议学习最新的研究论文。