21 , _fft(make_shared<fft_t>(fft_t(2 * _nN, false)))
28 _fft->assign(2 * _nN,
false);
31 void DST::fft_transform(
real data[],
real F[],
bool centerp)
const {
39 for (
int i = 0; i < _nN; ++i) {
40 data[_nN+i] = data[_nN-1-i];
41 data[2*_nN+i] = -data[i];
42 data[3*_nN+i] = -data[_nN-1-i];
46 for (
int i = 1; i < _nN; ++i)
47 data[_nN+i] = data[_nN-i];
48 for (
int i = 0; i < 2*_nN; ++i)
49 data[2*_nN+i] = -data[i];
51 vector<complex<real>> ctemp(2*_nN);
52 _fft->transform_real(data, ctemp.data());
55 for (
int i = 0, j = 1; i < _nN; ++i, j+=2)
56 ctemp[j] *= exp(complex<real>(0, j*d));
58 for (
int i = 0, j = 1; i < _nN; ++i, j+=2) {
59 F[i] = -ctemp[j].imag() / (2*_nN);
63 void DST::fft_transform2(
real data[],
real F[])
const {
68 fft_transform(data, F+_nN,
true);
70 for (
int i = 0; i < _nN; ++i) data[i] = F[i+_nN];
71 for (
int i = _nN; i < 2*_nN; ++i)
73 F[i] = (data[2*_nN-1-i] - F[2*_nN-1-i])/2;
74 for (
int i = 0; i < _nN; ++i)
76 F[i] = (data[i] + F[i])/2;
80 vector<real> data(4 * _nN);
82 for (
int i = 1; i <= _nN; ++i)
84 fft_transform(data.data(), F,
false);
88 vector<real> data(4 * _nN);
90 for (
int i = 0; i < _nN; ++i)
91 data[i] = f( (2*i + 1) * d );
92 fft_transform2(data.data(), F);
101 ar = 2 * (cosx - sinx) * (cosx + sinx),
102 y0 =
N & 1 ? F[--
N] : 0, y1 = 0;
106 y1 = ar * y0 - y1 + F[--
N];
107 y0 = ar * y1 - y0 + F[--
N];
109 return sinx * (y0 + y1);
118 ar = 2 * (cosx - sinx) * (cosx + sinx),
120 for (--
N;
N >= 0; --
N) {
121 real t = ar * y0 - y1 + F[
N]/(2*
N+1);
124 return cosx * (y1 - y0);
128 const real F[],
int N) {
132 ac = +2 * (cosy * cosx + siny * sinx) * (cosy * cosx - siny * sinx),
134 as = -2 * (siny * cosx - cosy * sinx) * (siny * cosx + cosy * sinx),
135 y0 = 0, y1 = 0, z0 = 0, z1 = 0;
136 for (--
N;
N >= 0; --
N) {
138 ty = ac * y0 + as * z0 - y1 + F[
N]/(2*
N+1),
139 tz = as * y0 + ac * z0 - z1;
149 return (y1 - y0) * (cosy - cosx) + (z1 - z0) * (cosy + cosx);
Header for GeographicLib::DST class.
GeographicLib::Math::real real
void transform(std::function< real(real)> f, real F[]) const
static real eval(real sinx, real cosx, const real F[], int N)
void refine(std::function< real(real)> f, real F[]) const
static real integral(real sinx, real cosx, const real F[], int N)
Namespace for GeographicLib.