用于高精度快速傅里叶变换的 C++ 库

计算科学 C++ 精确 傅里叶变换 fftw
2021-12-08 21:21:05

我正在寻找一个用于高精度快速傅立叶变换 (FFT) 的 C++ 库(例如,使用类似于MPFRBOOSTmpfr_t高精度真实数据类型)。首选是开源的,或者,如果不可用,至少是“免费的学术研究”图书馆。我已经尝试过标准精度优化的实现,例如 FFTW in ,但事实证明这是不够的。一个理想的解决方案将链接到 BOOST,因为我正在使用该库中的特殊功能实现。cpp_dec_floatlong double

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/