23 , m_idft_plan(nullptr)
32 , m_idft_plan(nullptr)
39 , m_Nfrom (rhs.m_Nfrom)
40 , m_dft_plan (rhs.m_dft_plan)
41 , m_idft_plan (rhs.m_idft_plan)
42 , m_in_spec (std::move(rhs.m_in_spec))
43 , m_in (std::move(rhs.m_in))
44 , m_out (std::move(rhs.m_out))
45 , m_out_spec (std::move(rhs.m_out_spec))
47 rhs.m_idft_plan =
nullptr;
48 rhs.m_dft_plan =
nullptr;
58 m_Nfrom = rhs.m_Nfrom;
73 m_Nfrom = rhs.m_Nfrom;
76 m_idft_plan = rhs.m_idft_plan;
77 m_dft_plan = rhs.m_dft_plan;
79 m_in_spec = std::move(rhs.m_in_spec);
80 m_in = std::move(rhs.m_in);
81 m_out = std::move(rhs.m_out);
82 m_out_spec = std::move(rhs.m_out_spec);
84 rhs.m_idft_plan =
nullptr;
85 rhs.m_dft_plan =
nullptr;
94 if (from.rows() != 2 * (2 * m_Nfrom) + 1)
95 throw std::runtime_error(
"Invalid size of idft input vector");
98 fftw_execute_dft(m_idft_plan, (fftw_complex *)from.data(),
99 (fftw_complex *)m_in.data());
100 m_in /= std::complex<double>(
double(2 * (2 * m_Nfrom) + 1));
104 size_t L = std::min(m_Nfrom, m_Nto);
105 m_out.head(L + 1) = m_in.head(L + 1);
106 m_out.tail(L) = m_in.tail(L);
109 fftw_execute_dft(m_dft_plan, (fftw_complex *)m_out.data(),
110 (fftw_complex *)m_out_spec.data());
115 void spectral_interpolate::init()
117 m_in_spec.resize(2 * (2 * m_Nfrom) + 1, 1);
118 m_in.resize(2 * (2 * m_Nfrom) + 1, 1);
119 m_out.resize(2 * (2 * m_Nto) + 1, 1);
120 m_out_spec.resize(2 * (2 * m_Nto) + 1, 1);
122 m_idft_plan = fftw_plan_dft_1d(2 * (2 *
int(m_Nfrom)) + 1,
123 (fftw_complex *)m_in_spec.data(),
124 (fftw_complex *)m_in.data(), FFTW_BACKWARD, FFTW_MEASURE);
126 m_dft_plan = fftw_plan_dft_1d(2 * (2 *
int(m_Nto)) + 1,
127 (fftw_complex *)m_out.data(),
128 (fftw_complex *)m_out_spec.data(), FFTW_FORWARD, FFTW_MEASURE);
133 void spectral_interpolate::destroy()
135 if (m_dft_plan !=
nullptr)
137 fftw_destroy_plan(m_dft_plan);
138 m_dft_plan =
nullptr;
140 if (m_idft_plan !=
nullptr)
142 fftw_destroy_plan(m_idft_plan);
143 m_dft_plan =
nullptr;