26 : h_src(0), w_src(0), h_fftw(0), w_fftw(0), in_src(0), out_fftw(0), p_forw_src(nullptr)
46 fftw_free((fftw_complex*)out_fftw);
49 if (p_forw_src !=
nullptr)
50 fftw_destroy_plan(p_forw_src);
61 int h_src =
static_cast<int>(source.size());
62 int w_src =
static_cast<int>((source.size() ? source[0].size() : 0));
74 result.resize(
static_cast<size_t>(
ws.
h_fftw),
75 std::vector<double>(
static_cast<size_t>(
ws.
w_fftw)));
78 for (
size_t i = 0; i < static_cast<size_t>(
ws.
h_fftw); i++) {
79 size_t k =
static_cast<size_t>(
ws.
h_fftw) - i;
82 for (
size_t j = 0; j < static_cast<size_t>(
ws.
w_fftw / 2 + 1); j++) {
84 size_t l =
static_cast<size_t>(
ws.
w_fftw) - j;
86 result[k][l] = result[i][j];
99 if (result.size() % 2 == 0)
100 row_shift = result.size() / 2;
102 row_shift = result.size() / 2 + 1;
105 if (result[0].size() % 2 == 0)
106 col_shift = result[0].size() / 2;
108 col_shift = result[0].size() / 2 + 1;
111 std::rotate(result.begin(), result.begin() +
static_cast<int>(row_shift), result.end());
114 for (
size_t i = 0; i < static_cast<size_t>(
ws.
h_fftw); i++) {
115 std::rotate(result[i].begin(), result[i].begin() +
static_cast<int>(col_shift),
127 source2d.push_back(source);
130 fft(source2d, result2d);
132 if (result2d.size() != 1)
133 throw std::runtime_error(
"FourierTransform::fft -> Panic in 1d");
135 result = result2d[0];
145 if (result.size() % 2 == 0)
146 col_shift = result.size() / 2;
148 col_shift = result.size() / 2 + 1;
150 std::rotate(result.begin(), result.begin() +
static_cast<int>(col_shift), result.end());
158 if (!h_src || !w_src) {
159 std::ostringstream os;
160 os <<
"FourierTransform::init() -> Panic! Wrong dimensions " << h_src <<
" " << w_src
162 throw std::runtime_error(os.str());
174 fftw_malloc(
sizeof(fftw_complex) *
static_cast<size_t>(
ws.
h_fftw * (
ws.
w_fftw / 2 + 1))));
183 throw std::runtime_error(
184 "FourierTransform::init() -> Error! Can't initialise p_forw_src plan.");
194 throw std::runtime_error(
195 "FourierTransform::fftw_forward_FT() -> Panic! Initialisation is missed.");
197 double *ptr, *ptr_end;
204 for (
size_t row = 0; row < static_cast<size_t>(
ws.
h_src); ++row)
205 for (
size_t col = 0; col < static_cast<size_t>(
ws.
w_src); ++col)
207 + (
static_cast<int>(col) %
ws.
w_fftw)] += src[row][col];
212 double re_out, im_out;
214 ptr != ptr_end; ++ptr) {
219 *(ptr - 1) = sqrt(re_out * re_out + im_out * im_out);
221 *ptr = atan2(im_out, re_out);