diff options
author | Ali Labbene <ali.labbene@st.com> | 2019-12-11 08:59:21 +0100 |
---|---|---|
committer | Ali Labbene <ali.labbene@st.com> | 2019-12-16 16:35:24 +0100 |
commit | 9f95ff5b6ba01db09552b84a0ab79607060a2666 (patch) | |
tree | 8a6e0dda832555c692307869aed49d07ee7facfe /DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions | |
parent | 76177aa280494bb36d7a0bcbda1078d4db717020 (diff) | |
download | st-cmsis-core-lowfat-9f95ff5b6ba01db09552b84a0ab79607060a2666.tar.gz st-cmsis-core-lowfat-9f95ff5b6ba01db09552b84a0ab79607060a2666.tar.bz2 st-cmsis-core-lowfat-9f95ff5b6ba01db09552b84a0ab79607060a2666.zip |
Official ARM version: v5.4.0
Add CMSIS V5.4.0, please refer to index.html available under \docs folder.
Note: content of \CMSIS\Core\Include has been copied under \Include to keep the same structure
used in existing projects, and thus avoid projects mass update
Note: the following components have been removed from ARM original delivery (as not used in ST packages)
- CMSIS_EW2018.pdf
- .gitattributes
- .gitignore
- \Device
- \CMSIS
- \CoreValidation
- \DAP
- \Documentation
- \DoxyGen
- \Driver
- \Pack
- \RTOS\CMSIS_RTOS_Tutorial.pdf
- \RTOS\RTX
- \RTOS\Template
- \RTOS2\RTX
- \Utilities
- All ARM/GCC projects files are deleted from \DSP, \RTOS and \RTOS2
Change-Id: Ia026c3f0f0d016627a4fb5a9032852c33d24b4d3
Diffstat (limited to 'DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions')
7 files changed, 501 insertions, 0 deletions
diff --git a/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/max.c b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/max.c new file mode 100644 index 0000000..a4739d7 --- /dev/null +++ b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/max.c @@ -0,0 +1,85 @@ +#include "ref.h" + +void ref_max_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + float32_t max=-FLT_MAX; + + for(i=0;i<blockSize;i++) + { + if (max < pSrc[i]) + { + max = pSrc[i]; + ind = i; + } + } + *pResult = max; + *pIndex = ind; +} + +void ref_max_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + q31_t max=INT_MIN; + + for(i=0;i<blockSize;i++) + { + if (max < pSrc[i]) + { + max = pSrc[i]; + ind = i; + } + } + *pResult = max; + *pIndex = ind; +} + +void ref_max_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + q15_t max=SHRT_MIN; + + for(i=0;i<blockSize;i++) + { + if (max < pSrc[i]) + { + max = pSrc[i]; + ind = i; + } + } + *pResult = max; + *pIndex = ind; +} + +void ref_max_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + q7_t max=SCHAR_MIN; + + for(i=0;i<blockSize;i++) + { + if (max < pSrc[i]) + { + max = pSrc[i]; + ind = i; + } + } + *pResult = max; + *pIndex = ind; +} diff --git a/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/mean.c b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/mean.c new file mode 100644 index 0000000..33d4a70 --- /dev/null +++ b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/mean.c @@ -0,0 +1,61 @@ +#include "ref.h" + +void ref_mean_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t i; + float32_t sum=0; + + for(i=0;i<blockSize;i++) + { + sum += pSrc[i]; + } + *pResult = sum / (float32_t)blockSize; +} + +void ref_mean_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t i; + q63_t sum=0; + + for(i=0;i<blockSize;i++) + { + sum += pSrc[i]; + } + *pResult = (q31_t) (sum / (int32_t) blockSize); +} + +void ref_mean_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t i; + q31_t sum=0; + + for(i=0;i<blockSize;i++) + { + sum += pSrc[i]; + } + *pResult = (q15_t) (sum / (int32_t) blockSize); +} + +void ref_mean_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult) +{ + uint32_t i; + q31_t sum=0; + + for(i=0;i<blockSize;i++) + { + sum += pSrc[i]; + } + *pResult = (q7_t) (sum / (int32_t) blockSize); +} diff --git a/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/min.c b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/min.c new file mode 100644 index 0000000..28c5949 --- /dev/null +++ b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/min.c @@ -0,0 +1,85 @@ +#include "ref.h" + +void ref_min_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + float32_t min=FLT_MAX; + + for(i=0;i<blockSize;i++) + { + if (min > pSrc[i]) + { + min = pSrc[i]; + ind = i; + } + } + *pResult = min; + *pIndex = ind; +} + +void ref_min_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + q31_t min=INT_MAX; + + for(i=0;i<blockSize;i++) + { + if (min > pSrc[i]) + { + min = pSrc[i]; + ind = i; + } + } + *pResult = min; + *pIndex = ind; +} + +void ref_min_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + q15_t min=SHRT_MAX; + + for(i=0;i<blockSize;i++) + { + if (min > pSrc[i]) + { + min = pSrc[i]; + ind = i; + } + } + *pResult = min; + *pIndex = ind; +} + +void ref_min_q7( + q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex) +{ + uint32_t i, ind=0; + q7_t min=SCHAR_MAX; + + for(i=0;i<blockSize;i++) + { + if (min > pSrc[i]) + { + min = pSrc[i]; + ind = i; + } + } + *pResult = min; + *pIndex = ind; +} diff --git a/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/power.c b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/power.c new file mode 100644 index 0000000..6160bfe --- /dev/null +++ b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/power.c @@ -0,0 +1,61 @@ +#include "ref.h" + +void ref_power_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t i; + float32_t sumsq=0; + + for(i=0;i<blockSize;i++) + { + sumsq += pSrc[i] * pSrc[i]; + } + *pResult = sumsq; +} + +void ref_power_q31( + q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult) +{ + uint32_t i; + q63_t sumsq=0; + + for(i=0;i<blockSize;i++) + { + sumsq += ((q63_t)pSrc[i] * pSrc[i]) >> 14; + } + *pResult = sumsq; +} + +void ref_power_q15( + q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult) +{ + uint32_t i; + q63_t sumsq=0; + + for(i=0;i<blockSize;i++) + { + sumsq += (q63_t)pSrc[i] * pSrc[i]; + } + *pResult = sumsq; +} + +void ref_power_q7( + q7_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t i; + q31_t sumsq=0; + + for(i=0;i<blockSize;i++) + { + sumsq += (q31_t)pSrc[i] * pSrc[i]; + } + *pResult = sumsq; +} diff --git a/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/rms.c b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/rms.c new file mode 100644 index 0000000..7b91163 --- /dev/null +++ b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/rms.c @@ -0,0 +1,65 @@ +#include "ref.h" + +void ref_rms_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t i; + float32_t sumsq=0; + + for(i=0;i<blockSize;i++) + { + sumsq += pSrc[i] * pSrc[i]; + } + *pResult = sqrtf(sumsq / (float32_t)blockSize); +} + +void ref_rms_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t i; + q63_t sumsq=0; + q63_t tmp1; + q31_t tmp2; + + float help_float; + + for(i=0;i<blockSize;i++) + { + sumsq += (q63_t)pSrc[i] * pSrc[i]; + } + tmp1 = (sumsq / (q63_t)blockSize) >> 31; + tmp2 = ref_sat_q31(tmp1); + + /* GCC M0 problem: __aeabi_f2iz(QNAN) returns not 0 */ + help_float = (sqrtf((float)tmp2 / 2147483648.0f) * 2147483648.0f); + /* Checking for a NAN value in help_float */ + if (((*((int *)(&help_float))) & 0x7FC00000) == 0x7FC00000) { + help_float = 0; + } + *pResult = (q31_t)(help_float); + +// *pResult = (q31_t)(sqrtf((float)tmp2 / 2147483648.0f) * 2147483648.0f); +} + +void ref_rms_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t i; + q63_t sumsq=0; + q31_t tmp1; + q15_t tmp2; + + for(i=0;i<blockSize;i++) + { + sumsq += (q63_t)pSrc[i] * pSrc[i]; + } + tmp1 = (sumsq / (q63_t)blockSize) >> 15; + tmp2 = ref_sat_q15(tmp1); + *pResult = (q15_t)(sqrtf((float)tmp2 / 32768.0f) * 32768.0f); +} diff --git a/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/std.c b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/std.c new file mode 100644 index 0000000..148b5c7 --- /dev/null +++ b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/std.c @@ -0,0 +1,74 @@ +#include "ref.h" + +void ref_std_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t i; + float32_t sum=0, sumsq=0; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i<blockSize;i++) + { + sum += pSrc[i]; + sumsq += pSrc[i] * pSrc[i]; + } + *pResult = sqrtf((sumsq - sum * sum / (float32_t)blockSize) / ((float32_t)blockSize - 1)); +} + +void ref_std_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t i; + q63_t sum=0, sumsq=0; + q31_t in; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i<blockSize;i++) + { + in = pSrc[i] >> 8; + sum += in; + sumsq += (q63_t)in * in; + } + sumsq /= (q63_t)(blockSize - 1); + sum = sum * sum / (q63_t)(blockSize * (blockSize - 1)); + *pResult = (q31_t)(sqrtf((float)( (sumsq - sum) >> 15) / 2147483648.0f ) * 2147483648.0f); +} + +void ref_std_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t i; + q31_t sum=0; + q63_t sumsq=0; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i<blockSize;i++) + { + sum += pSrc[i]; + sumsq += (q63_t)pSrc[i] * pSrc[i]; + } + sumsq /= (q63_t)(blockSize - 1); + sum = (q31_t)((q63_t)sum * sum / (q63_t)(blockSize * (blockSize - 1))); + *pResult = (q15_t)(sqrtf((float)ref_sat_q15( (sumsq - sum) >> 15) / 32768.0f ) * 32768.0f); +} diff --git a/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/var.c b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/var.c new file mode 100644 index 0000000..0dfb015 --- /dev/null +++ b/DSP/DSP_Lib_TestSuite/RefLibs/src/StatisticsFunctions/var.c @@ -0,0 +1,70 @@ +#include "ref.h" + +void ref_var_f32( + float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult) +{ + uint32_t i; + float32_t sum=0, sumsq=0; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i<blockSize;i++) + { + sum += pSrc[i]; + sumsq += pSrc[i] * pSrc[i]; + } + *pResult = (sumsq - sum * sum / (float32_t)blockSize) / ((float32_t)blockSize - 1); +} + +void ref_var_q31( + q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult) +{ + uint32_t i; + q63_t sum=0, sumsq=0; + q31_t in; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i<blockSize;i++) + { + in = pSrc[i] >> 8; + sum += in; + sumsq += (q63_t)in * in; + } + *pResult = (sumsq - sum * sum / (q31_t)blockSize) / ((q31_t)blockSize - 1) >> 15; +} + +void ref_var_q15( + q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult) +{ + uint32_t i; + q31_t sum=0; + q63_t sumsq=0; + + if (blockSize == 1) + { + *pResult = 0; + return; + } + + for(i=0;i<blockSize;i++) + { + sum += pSrc[i]; + sumsq += (q63_t)pSrc[i] * pSrc[i]; + } + *pResult = (q31_t)((sumsq - (q63_t)sum * sum / (q63_t)blockSize) / ((q63_t)blockSize - 1)) >> 15; +} |