| 177 | |
| 178 | template <typename T> |
| 179 | SimpleTensor<T> rdft_1d_core(const SimpleTensor<T> &src, FFTDirection direction, bool is_odd) |
| 180 | { |
| 181 | // Performs only rdft |
| 182 | ARM_COMPUTE_ERROR_ON(direction == FFTDirection::Forward && src.num_channels() != 1); |
| 183 | ARM_COMPUTE_ERROR_ON(direction == FFTDirection::Inverse && src.num_channels() != 2); |
| 184 | |
| 185 | const unsigned int inverse_tail = is_odd ? 1 : 0; |
| 186 | const unsigned int N = src.shape()[0]; |
| 187 | const unsigned int K = direction == FFTDirection::Forward ? N / 2 + 1 : (N - 1) * 2 + inverse_tail; |
| 188 | const unsigned int num_channels = direction == FFTDirection::Forward ? 2 : 1; |
| 189 | |
| 190 | TensorShape dst_shape = src.shape(); |
| 191 | dst_shape.set(0, K); |
| 192 | |
| 193 | SimpleTensor<T> dst(dst_shape, src.data_type(), num_channels); |
| 194 | |
| 195 | const unsigned int upper_dims = src.shape().total_size_upper(1); |
| 196 | #if defined(_OPENMP) |
| 197 | #pragma omp parallel for |
| 198 | #endif /* _OPENMP */ |
| 199 | for (unsigned int du = 0; du < upper_dims; ++du) |
| 200 | { |
| 201 | const T *src_row_ptr = src.data() + du * N * src.num_channels(); |
| 202 | T *dst_row_ptr = dst.data() + du * K * dst.num_channels(); |
| 203 | direction == FFTDirection::Forward ? rdft_1d_step(src_row_ptr, N, dst_row_ptr, K) |
| 204 | : irdft_1d_step(src_row_ptr, N, dst_row_ptr, K); |
| 205 | } |
| 206 | |
| 207 | return dst; |
| 208 | } |
| 209 | |
| 210 | template <typename T> |
| 211 | SimpleTensor<T> dft_1d_core(const SimpleTensor<T> &src, FFTDirection direction) |
no test coverage detected