37 fftw_free((fftw_complex*)out_fftw);
40 if (p_forw_src !=
nullptr)
41 fftw_destroy_plan(p_forw_src);
52 int h_src =
static_cast<int>(source.size());
53 int w_src =
static_cast<int>((!source.empty() ? source[0].size() : 0));
67 result.resize(nh, std::vector<double>(
static_cast<size_t>(
ws.
w_fftw)));
70 for (
size_t i = 0; i < nh; i++) {
74 for (
size_t j = 0; j < static_cast<size_t>(
ws.
w_fftw / 2 + 1); j++) {
76 size_t l =
static_cast<size_t>(
ws.
w_fftw) - j;
78 result[k][l] = result[i][j];
91 if (result.size() % 2 == 0)
92 row_shift = result.size() / 2;
94 row_shift = result.size() / 2 + 1;
97 if (result[0].size() % 2 == 0)
98 col_shift = result[0].size() / 2;
100 col_shift = result[0].size() / 2 + 1;
103 std::rotate(result.begin(), result.begin() +
static_cast<int>(row_shift), result.end());
106 for (
size_t i = 0; i < static_cast<size_t>(
ws.
h_fftw); i++)
107 std::rotate(result[i].begin(), result[i].begin() +
static_cast<int>(col_shift),
118 source2d.push_back(source);
121 fft(source2d, result2d);
123 ASSERT(result2d.size() == 1);
124 result = result2d[0];
134 if (result.size() % 2 == 0)
135 col_shift = result.size() / 2;
137 col_shift = result.size() / 2 + 1;
139 std::rotate(result.begin(), result.begin() +
static_cast<int>(col_shift), result.end());
159 fftw_malloc(
sizeof(fftw_complex) *
static_cast<size_t>(
ws.
h_fftw * (
ws.
w_fftw / 2 + 1))));
179 double *ptr, *ptr_end;
186 for (
size_t row = 0; row < static_cast<size_t>(
ws.
h_src); ++row)
187 for (
size_t col = 0; col < static_cast<size_t>(
ws.
w_src); ++col)
189 + (
static_cast<int>(col) %
ws.
w_fftw)] += src[row][col];
195 ptr != ptr_end; ++ptr) {
196 double re_out = *ptr;
197 double im_out = *(++ptr);
200 *(ptr - 1) = sqrt(re_out * re_out + im_out * im_out);
202 *ptr = atan2(im_out, re_out);
Defines the macro ASSERT.
#define ASSERT(condition)