diff options
Diffstat (limited to 'source/math')
-rw-r--r-- | source/math/CMakeLists.txt | 3 | ||||
-rw-r--r-- | source/math/PlatformMath.cc | 60 | ||||
-rw-r--r-- | source/math/include/PlatformMath.hpp | 18 |
3 files changed, 40 insertions, 41 deletions
diff --git a/source/math/CMakeLists.txt b/source/math/CMakeLists.txt index eee8f75..462ffb3 100644 --- a/source/math/CMakeLists.txt +++ b/source/math/CMakeLists.txt @@ -33,7 +33,7 @@ target_include_directories(arm_math PUBLIC include) target_link_libraries(arm_math PRIVATE log) -if ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "cortex-m55" OR "${CMAKE_SYSTEM_ARCH}" STREQUAL "armv8.1-m.main") +if (${CMAKE_CROSSCOMPILING}) include(${CMAKE_SCRIPTS_DIR}/cmsis-dsp.cmake) target_link_libraries(arm_math PUBLIC cmsis-dsp) endif () @@ -41,5 +41,4 @@ endif () message(STATUS "*******************************************************") message(STATUS "Library : " arm_math) message(STATUS "CMAKE_SYSTEM_PROCESSOR : " ${CMAKE_SYSTEM_PROCESSOR}) -message(STATUS "CMAKE_SYSTEM_ARCH : " ${CMAKE_SYSTEM_ARCH}) message(STATUS "*******************************************************") diff --git a/source/math/PlatformMath.cc b/source/math/PlatformMath.cc index b666d29..8950941 100644 --- a/source/math/PlatformMath.cc +++ b/source/math/PlatformMath.cc @@ -24,31 +24,31 @@ namespace math { float MathUtils::CosineF32(float radians) { -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) return arm_cos_f32(radians); -#else /* ARM_MATH_DSP */ +#else /* __ARM_FEATURE_DSP */ return cosf(radians); -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ } float MathUtils::SineF32(float radians) { -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) return arm_sin_f32(radians); -#else /* ARM_MATH_DSP */ +#else /* __ARM_FEATURE_DSP */ return sinf(radians); -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ } float MathUtils::SqrtF32(float input) { -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) float output = 0.f; arm_sqrt_f32(input, &output); return output; -#else /* ARM_MATH_DSP */ +#else /* __ARM_FEATURE_DSP */ return sqrtf(input); -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ } float MathUtils::MeanF32(float* ptrSrc, const uint32_t srcLen) @@ -57,14 +57,14 @@ namespace math { return 0.f; } -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) float result = 0.f; arm_mean_f32(ptrSrc, srcLen, &result); return result; -#else /* ARM_MATH_DSP */ +#else /* __ARM_FEATURE_DSP */ float acc = std::accumulate(ptrSrc, ptrSrc + srcLen, 0.0); return acc/srcLen; -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ } float MathUtils::StdDevF32(float* ptrSrc, const uint32_t srcLen, @@ -73,7 +73,7 @@ namespace math { if (!srcLen) { return 0.f; } -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) /** * Note Standard deviation calculation can be off * by > 0.01 but less than < 0.1, according to @@ -83,7 +83,7 @@ namespace math { float stdDev = 0; arm_std_f32(ptrSrc, srcLen, &stdDev); return stdDev; -#else /* ARM_MATH_DSP */ +#else /* __ARM_FEATURE_DSP */ auto VarianceFunction = [=](float acc, const float value) { return acc + (((value - mean) * (value - mean))/ srcLen); }; @@ -92,7 +92,7 @@ namespace math { VarianceFunction); return sqrtf(acc); -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ } void MathUtils::FftInitF32(const uint16_t fftLen, @@ -104,7 +104,7 @@ namespace math { fftInstance.m_optimisedOptionAvailable = false; fftInstance.m_type = type; -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) arm_status status = ARM_MATH_ARGUMENT_ERROR; switch (fftInstance.m_type) { case FftType::real: @@ -125,7 +125,7 @@ namespace math { } else { fftInstance.m_optimisedOptionAvailable = true; } -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ debug("Optimised FFT will be used: %s.\n", fftInstance.m_optimisedOptionAvailable? "yes": "no"); @@ -203,12 +203,12 @@ namespace math { switch (fftInstance.m_type) { case FftType::real: -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) if (fftInstance.m_optimisedOptionAvailable) { arm_rfft_fast_f32(&fftInstance.m_instanceReal, input.data(), fftOutput.data(), 0); return; } -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ FftRealF32(input, fftOutput); return; @@ -217,13 +217,13 @@ namespace math { printf_err("Complex FFT instance should have input size >= (FFT len x 2)"); return; } -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) if (fftInstance.m_optimisedOptionAvailable) { fftOutput = input; /* Complex function works in-place */ arm_cfft_f32(&fftInstance.m_instanceComplex, fftOutput.data(), 0, 1); return; } -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ FftComplexF32(input, fftOutput); return; @@ -236,15 +236,15 @@ namespace math { void MathUtils::VecLogarithmF32(std::vector <float>& input, std::vector <float>& output) { -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) arm_vlog_f32(input.data(), output.data(), output.size()); -#else /* ARM_MATH_DSP */ +#else /* __ARM_FEATURE_DSP */ for (auto in = input.begin(), out = output.begin(); in != input.end() && out != output.end(); ++in, ++out) { *out = logf(*in); } -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ } float MathUtils::DotProductF32(float* srcPtrA, float* srcPtrB, @@ -252,13 +252,13 @@ namespace math { { float output = 0.f; -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) arm_dot_prod_f32(srcPtrA, srcPtrB, srcLen, &output); -#else /* ARM_MATH_DSP */ +#else /* __ARM_FEATURE_DSP */ for (uint32_t i = 0; i < srcLen; ++i) { output += *srcPtrA++ * *srcPtrB++; } -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ return output; } @@ -273,15 +273,15 @@ namespace math { return false; } -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) arm_cmplx_mag_squared_f32(ptrSrc, ptrDst, srcLen/2); -#else /* ARM_MATH_DSP */ +#else /* __ARM_FEATURE_DSP */ for (uint32_t j = 0; j < srcLen/2; ++j) { const float real = *ptrSrc++; const float im = *ptrSrc++; *ptrDst++ = real*real + im*im; } -#endif /* ARM_MATH_DSP */ +#endif /* __ARM_FEATURE_DSP */ return true; } diff --git a/source/math/include/PlatformMath.hpp b/source/math/include/PlatformMath.hpp index 2bf7733..859716f 100644 --- a/source/math/include/PlatformMath.hpp +++ b/source/math/include/PlatformMath.hpp @@ -18,12 +18,12 @@ #define PLATFORM_MATH_HPP /* See if ARM DSP functions can be used. */ -#if defined(ARM_MATH_DSP) - #include "arm_math.h" - #define M_PI (PI) -#else - #include <cmath> -#endif +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) +#include "arm_math.h" +#define M_PI (PI) +#else /* (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) */ +#include <cmath> +#endif /* (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) */ #include <vector> #include <cstdint> @@ -39,10 +39,10 @@ namespace math { }; struct FftInstance { -#if ARM_MATH_DSP +#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) arm_rfft_fast_instance_f32 m_instanceReal; arm_cfft_instance_f32 m_instanceComplex; -#endif +#endif /* (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) */ uint16_t m_fftLen{0}; FftType m_type{FftType::real}; bool m_optimisedOptionAvailable{false}; @@ -177,4 +177,4 @@ namespace math { } /* namespace app */ } /* namespace arm */ -#endif /* PLATFORM_MATH_HPP */
\ No newline at end of file +#endif /* PLATFORM_MATH_HPP */ |