| 80 | */ |
| 81 | template <typename T> |
| 82 | void dft_1d_step(const T *src_ptr, T *dst_ptr, size_t N) |
| 83 | { |
| 84 | #if defined(_OPENMP) |
| 85 | #pragma omp parallel for |
| 86 | #endif /* _OPENMP */ |
| 87 | for (unsigned int k = 0; k < N; ++k) |
| 88 | { |
| 89 | float Xr = 0; |
| 90 | float Xi = 0; |
| 91 | for (unsigned int n = 0; n < N; ++n) |
| 92 | { |
| 93 | const float alpha = (2 * M_PI * k * n) / N; |
| 94 | const float val_r = src_ptr[2 * n]; |
| 95 | const float val_i = src_ptr[2 * n + 1]; |
| 96 | const float cos_alpha = cos(alpha); |
| 97 | const float sin_alpha = sin(alpha); |
| 98 | |
| 99 | Xr += val_r * cos_alpha + val_i * sin_alpha; |
| 100 | Xi += val_i * cos_alpha - val_r * sin_alpha; |
| 101 | } |
| 102 | |
| 103 | dst_ptr[k * 2] = Xr; |
| 104 | dst_ptr[k * 2 + 1] = Xi; |
| 105 | } |
| 106 | } |
| 107 | |
| 108 | /** Performs an one dimensional inverse DFT on a given real sequence. |
| 109 | * |
no test coverage detected