【发布时间】:2016-01-14 09:53:25
【问题描述】:
我正在使用 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 的任何想法?
【问题讨论】:
-
除了一些矩阵操作之外,我还没有搞砸过 Accelerate 框架,但您可能想研究一下 EZAudio 框架 (github.com/syedhali/EZAudio)。当你不需要的时候为什么要重新发明轮子:)
-
这是一个迟钝的评论,但我觉得有必要这样做! OP的问题与其说是重新发明轮子,不如说是制造自己的轮子,这(恕我直言)是一件能够做的好事。太多人只是依赖其他人的实现。
标签: ios swift signal-processing fft frequency-analysis