| 150 | */ |
| 151 | template <typename T> |
| 152 | void idft_1d_step(const T *src_ptr, T *dst_ptr, size_t N) |
| 153 | { |
| 154 | #if defined(_OPENMP) |
| 155 | #pragma omp parallel for |
| 156 | #endif /* _OPENMP */ |
| 157 | for (unsigned int n = 0; n < N; ++n) |
| 158 | { |
| 159 | float xr = 0; |
| 160 | float xi = 0; |
| 161 | for (unsigned int k = 0; k < N; ++k) |
| 162 | { |
| 163 | const float alpha = (2 * M_PI * k * n) / N; |
| 164 | const float cos_alpha = cos(alpha); |
| 165 | const float sin_alpha = sin(alpha); |
| 166 | const float val_r = src_ptr[2 * k]; |
| 167 | const float val_i = src_ptr[2 * k + 1]; |
| 168 | |
| 169 | xr += val_r * cos_alpha - val_i * sin_alpha; |
| 170 | xi += val_i * cos_alpha + val_r * sin_alpha; |
| 171 | } |
| 172 | |
| 173 | dst_ptr[2 * n] = xr; |
| 174 | dst_ptr[2 * n + 1] = xi; |
| 175 | } |
| 176 | } |
| 177 | |
| 178 | template <typename T> |
| 179 | SimpleTensor<T> rdft_1d_core(const SimpleTensor<T> &src, FFTDirection direction, bool is_odd) |
no test coverage detected