用于高精度快速傅里叶变换的 C++ 库
计算科学
C++
精确
傅里叶变换
fftw
2021-12-08 21:21:05
2个回答
您可能想看看 Eigen C++ 矩阵类库。
http://eigen.tuxfamily.org/index.php?title=Main_Page
库中不支持的部分有一个 FFT 类,但我的印象是它比较成熟。
下面是使用这个 FFT 类和 BOOST 多精度类的代码片段。
#include <vector>
#include <cmath>
#include <complex>
#include <iostream>
#include <Eigen/Core>
#include <unsupported/Eigen/FFT>
#include <boost/multiprecision/cpp_dec_float.hpp>
using boost::multiprecision::cpp_dec_float_50;
using std::cout;
using std::endl;
void twoSinTest() {
const double pi = 2.*std::acos(0.);
#if 0
typedef double FFTFloat;
#else
typedef cpp_dec_float_50 FFTFloat;
#endif
double Fs = 1000; // Sampling frequency
double T = 1 / Fs; // Sampling period
int L = 1000; // Length of signal
std::vector<FFTFloat> timebuf(L);
typedef std::complex<FFTFloat> C;
std::vector<C> freqbuf;
double t = 0;
for (int i = 0; i < L; i++) {
timebuf[i] = 0.7*std::sin(2 * pi * 50 * t) + std::sin(2 * pi * 120 * t);
t += T;
}
Eigen::FFT<FFTFloat> fft;
fft.fwd(freqbuf, timebuf);
cout << freqbuf.size() << endl;
for (int i = 0; i < freqbuf.size(); i++) {
const C &f = freqbuf[i];
cout << i << " " << f << endl;
}
}
ARPREC ( http://crd-legacy.lbl.gov/~dhbailey/mpdist/ ) 是一个任意精度的 C++/Fortran 包,包含一个 FFT 实现。
Apfloat ( http://www.apfloat.org/apfloat/ ) 是另一个包含 FFT 的 C++ 任意精度库。
上述两个软件包都已包含在 FFTW 基准测试中(http://www.fftw.org/speed/)