任何开源快速傅立叶变换C实现?

时间:2011-04-26 17:45:33

标签: c

我正试图在C中使用FFT找到录制声音的基频。有人会知道C中的开源实现我可以修改和使用吗?

谢谢!

5 个答案:

答案 0 :(得分:5)

FFTW可能就是你要找的东西。

答案 1 :(得分:2)

我发现Ooura's C fft packages在实际应用中优于FFTW。最佳地使用FFTW需要时间和耐心才能使FFTW的智能系统正常工作,尤其是在交叉编译时。另外,FFTW附加了viral GPL license,所以你不能在封闭源项目中使用它而不需要付出一大笔钱。

与FFTW不同,Ooura的代码具有非常宽松的许可证;此外,Ooura的工作不依赖于复杂的构建环境。除了FFTW之外,Ooura's code is either the fastest, or nearly the fastest, cross-platform FFT library.它的运行速度大约是KISS FFT库的两倍,KIST FFT库由于一些莫名其妙的原因而仍然很受欢迎。 Ooura的代码考虑了两级CPU缓存,适用于大多数现代处理器。

如果你真的觉得需要速度,那么你应该跳过FFTW和Ooura并直接向你的CPU制造商寻找他们的自定义FFT库。供应商提供的CPU特定库往往是最快的。一些示例包括Intel MKLclFFT

此外,如果您正在尝试寻找基本频率,请不要忘记良好的老式自相关。如果它对你来说效果很好,它可能比运行FFT快得多。查看classic Rabiner paper以获取概述。

有人说他们需要一个可以使用单精度浮点数和双精度浮点数的FFT库。 Armadillo可以做到这一点。如果您决定使用单精度浮点计算FFT,请完全确定您已测量并量化结果中的错误量。 FFT是一大堆乘法,并且舍入误差可以通过单精度FFT非常快速地聚合。您可以获得看起来不错但却错误的结果。考虑自己警告......

答案 2 :(得分:1)

您将在这里找到一个C / C ++实现,其中包含源代码的说明(教程): http://drdobbs.com/cpp/199500857

答案 3 :(得分:1)

另一个值得考虑的是D.J. Bernstein's。它有点复杂(在FFTW上),但在大多数测试中比大多数(包括FFTW)更快。

答案 4 :(得分:0)

可以在XFT library of algorithms找到使用优化位移的实现。值得一看的不仅仅是傅里叶变换。

相关问题