【问题标题】:Performing FFT to find fundamental frequencies of a polyphonic audio sample执行 FFT 以查找和弦音频样本的基本频率
【发布时间】: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


【解决方案1】:

FFT(单独)不会在大多数复调音乐中找到基本音高频率。相反,它也会发现所有的泛音和谐波频率,它们很可能会支配任何基本音高频率。它甚至可能会漏掉一些隐藏在低频噪声中的基本音高频率。

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

【讨论】:

  • 谢谢,我会调查的。您如何建议找到基本频率?
  • AFAIK,对于一般情况,这可能仍然是一个未解决的或最近才解决的研究课题。因此,我建议研究最新的研究论文。
猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 2014-08-15
相关资源
最近更新 更多