28 #include <arprec/mp_real.h>
35 void dft1(T* output_data,
const T* input_data,
const int_t size,
bool inverse)
37 T pi2 = (inverse) ? 2.0 * M_PI : -2.0 * M_PI;
40 for(int_t y = 0; y < size; y++) {
41 output_data[2*y] = 0.;
42 output_data[2*y+1] = 0.;
43 for(int_t x = 0; x < size; x++) {
44 a = pi2 * y * x * invs;
47 output_data[2*y] += input_data[2*x] * ca - input_data[2*x+1] * sa;
48 output_data[2*y+1] += input_data[2*x] * sa + input_data[2*x+1] * ca;
51 output_data[2*y] *= invs;
52 output_data[2*y+1] *= invs;
65 DFT_wrapper(
const double* data, int_t n) : size(n)
69 DFT_wrapper(
const std::complex<double>* data, int_t n) : size(n)
76 delete [] output_data;
79 T* getdata()
const {
return output_data; }
82 void init(
const Tp* data, int_t n)
84 input_data =
new T [n*2];
85 output_data =
new T [n*2];
87 for (int_t i=0; i < n*2; ++i) {
88 input_data[i] = data[i];
92 void init(
const std::complex<Tp>* data, int_t n)
94 input_data =
new T [n*2];
95 output_data =
new T [n*2];
97 for (int_t i=0; i < n; ++i) {
98 input_data[2*i] = data[i].real();
99 input_data[2*i+1] = data[i].imag();
105 dft1(output_data, input_data, size,
false);
111 for (int_t i=0; i<size*2; ++i)
112 data[i] -= output_data[i];
115 void diff(std::complex<Tp>* data)
117 for (int_t i=0; i<size; ++i) {
120 data[i] -= std::complex<Tp>(output_data[2*i], output_data[2*i+1]);
136 typedef T value_type;
138 FFTW_wrapper(
const double* data, int_t n) : size(n)
148 void init(
const double* data, int_t n)
150 in = (T*)fftw_malloc(
sizeof(T)*n);
151 out = (T*)fftw_malloc(
sizeof(T)*n);
153 for (int_t i=0; i < n; ++i) {
154 in[i][0] = data[2*i];
155 in[i][1] = data[2*i+1];
161 plan = fftw_plan_dft_1d(size, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
165 template<
typename OtherType>
166 void diff(OtherType* data)
168 for (int_t i=0; i<size; ++i) {
169 data[2*i] -= out[i][0];
170 data[2*i+1] -= out[i][1];
184 Arprec_wrapper(
const T* data, int_t n) : size(n)
194 T* getdata()
const {
return in; }
196 void init(
const T* data, int_t n)
202 m2 = (m - (m + 1) / 2);
204 y =
new T [(n + n1 * mp::mpnsp1) * 2];
213 for (int_t i=0; i < 2*n; ++i) {
220 mp_real::mpfft1(-1, m, m1, m2, in, y);
230 for (int_t i=0; i<2*size; ++i) {