1 /* 2 * Copyright (c) 2019-2021 Arm Limited. 3 * 4 * SPDX-License-Identifier: MIT 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a copy 7 * of this software and associated documentation files (the "Software"), to 8 * deal in the Software without restriction, including without limitation the 9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10 * sell copies of the Software, and to permit persons to whom the Software is 11 * furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included in all 14 * copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24 #ifndef ARM_COMPUTE_NEFFT1D_H 25 #define ARM_COMPUTE_NEFFT1D_H 26 27 #include "arm_compute/runtime/IFunction.h" 28 29 #include "arm_compute/runtime/FunctionDescriptors.h" 30 #include "arm_compute/runtime/MemoryGroup.h" 31 #include "arm_compute/runtime/Tensor.h" 32 33 #include <memory> 34 35 namespace arm_compute 36 { 37 // Forward declaration 38 class ITensor; 39 class NEFFTDigitReverseKernel; 40 class NEFFTRadixStageKernel; 41 class NEFFTScaleKernel; 42 43 /** Basic function to execute one dimensional FFT. This function calls the following kernels: 44 * 45 * -# @ref NEFFTDigitReverseKernel Performs digit reverse 46 * -# @ref NEFFTRadixStageKernel A list of FFT kernels depending on the radix decomposition 47 * -# @ref NEFFTScaleKernel Performs output scaling in case of in inverse FFT 48 */ 49 class NEFFT1D : public IFunction 50 { 51 public: 52 /** Default Constructor */ 53 NEFFT1D(std::shared_ptr<IMemoryManager> memory_manager = nullptr); 54 /** Prevent instances of this class from being copied (As this class contains pointers) */ 55 NEFFT1D(const NEFFT1D &) = delete; 56 /** Prevent instances of this class from being copied (As this class contains pointers) */ 57 NEFFT1D &operator=(const NEFFT1D &) = delete; 58 /** Prevent instances of this class from being moved (As this class contains non movable objects) */ 59 NEFFT1D(NEFFT1D &&) = delete; 60 /** Prevent instances of this class from being moved (As this class contains non movable objects) */ 61 NEFFT1D &operator=(NEFFT1D &&) = delete; 62 /** Default destructor */ 63 ~NEFFT1D(); 64 /** Initialise the function's source and destinations. 65 * 66 * Valid data layouts: 67 * - All 68 * 69 * Valid data type configurations: 70 * |src |dst | 71 * |:------|:------| 72 * |F32 |F32 | 73 * 74 * @param[in] input Source tensor. Data types supported: F32. Number of channels supported: 1 (real tensor) or 2 (complex tensor). 75 * @param[out] output Destination tensor. Data types and data layouts supported: Same as @p input. 76 * Number of channels supported: 1 (real tensor) or 2 (complex tensor).If @p input is real, @p output must be complex. 77 * @param[in] config FFT related configuration 78 */ 79 void configure(const ITensor *input, ITensor *output, const FFT1DInfo &config); 80 /** Static function to check if given info will lead to a valid configuration of @ref NEFFT1D. 81 * 82 * @param[in] input Source tensor info. Data types supported: F32. 83 * @param[in] output Destination tensor info. Data types and data layouts supported: Same as @p input. 84 * @param[in] config FFT related configuration 85 * 86 * @return a status 87 */ 88 static Status validate(const ITensorInfo *input, const ITensorInfo *output, const FFT1DInfo &config); 89 90 // Inherited methods overridden: 91 void run() override; 92 93 protected: 94 MemoryGroup _memory_group; 95 std::unique_ptr<NEFFTDigitReverseKernel> _digit_reverse_kernel; 96 std::vector<std::unique_ptr<NEFFTRadixStageKernel>> _fft_kernels; 97 std::unique_ptr<NEFFTScaleKernel> _scale_kernel; 98 Tensor _digit_reversed_input; 99 Tensor _digit_reverse_indices; 100 unsigned int _num_ffts; 101 unsigned int _axis; 102 bool _run_scale; 103 }; 104 } // namespace arm_compute 105 #endif /*ARM_COMPUTE_NEFFT1D_H */ 106