From 0f0eaf7a5e3b67bac4880a7885d5a2c487a0529b Mon Sep 17 00:00:00 2001 From: Christophe Favergeon Date: Wed, 17 Nov 2021 14:02:21 +0100 Subject: [PATCH] CMSIS-DSP: Updated PythonWrapper Added the new function abs max/min with no index. --- PythonWrapper/cmsisdsp_pkg/src/cmsismodule.h | 365 +++++++++++++++++++ PythonWrapper/testdsp2.py | 4 +- PythonWrapper/testdsp4.py | 71 ++++ 3 files changed, 438 insertions(+), 2 deletions(-) create mode 100755 PythonWrapper/testdsp4.py diff --git a/PythonWrapper/cmsisdsp_pkg/src/cmsismodule.h b/PythonWrapper/cmsisdsp_pkg/src/cmsismodule.h index cae19b20..9fe6f22b 100644 --- a/PythonWrapper/cmsisdsp_pkg/src/cmsismodule.h +++ b/PythonWrapper/cmsisdsp_pkg/src/cmsismodule.h @@ -16218,6 +16218,33 @@ cmsis_arm_min_q7(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_min_no_idx_q7(PyObject *obj, PyObject *args) +{ + PyObject *pSrc=NULL; // input + q7_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q7_t pResult; + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_BYTE,int8_t,q7_t); + blockSize = arraySizepSrc ; + + + + arm_min_no_idx_q7(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("i",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_absmin_q7(PyObject *obj, PyObject *args) { @@ -16254,6 +16281,35 @@ cmsis_arm_absmin_q7(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_absmin_no_idx_q7(PyObject *obj, PyObject *args) +{ + PyObject *pSrc=NULL; // input + q7_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q7_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_BYTE,int8_t,q7_t); + blockSize = arraySizepSrc ; + + + + + + arm_absmin_no_idx_q7(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("i",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_min_q15(PyObject *obj, PyObject *args) @@ -16292,6 +16348,36 @@ cmsis_arm_min_q15(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_min_no_idx_q15(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q15_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q15_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_INT16,int16_t,int16_t); + blockSize = arraySizepSrc ; + + + + + + arm_min_no_idx_q15(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("h",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_absmin_q15(PyObject *obj, PyObject *args) { @@ -16329,6 +16415,36 @@ cmsis_arm_absmin_q15(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_absmin_no_idx_q15(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q15_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q15_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_INT16,int16_t,int16_t); + blockSize = arraySizepSrc ; + + + + + + arm_absmin_no_idx_q15(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("h",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_min_q31(PyObject *obj, PyObject *args) @@ -16367,6 +16483,36 @@ cmsis_arm_min_q31(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_min_no_idx_q31(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q31_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q31_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_INT32,int32_t,int32_t); + blockSize = arraySizepSrc ; + + + + + + arm_min_no_idx_q31(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("i",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_absmin_q31(PyObject *obj, PyObject *args) { @@ -16404,6 +16550,35 @@ cmsis_arm_absmin_q31(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_absmin_no_idx_q31(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q31_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q31_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_INT32,int32_t,int32_t); + blockSize = arraySizepSrc ; + + + + + arm_absmin_no_idx_q31(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("i",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_min_f32(PyObject *obj, PyObject *args) @@ -16517,6 +16692,36 @@ cmsis_arm_max_q7(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_max_no_idx_q7(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q7_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q7_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_BYTE,int8_t,q7_t); + blockSize = arraySizepSrc ; + + + + + + arm_max_no_idx_q7(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("i",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_absmax_q7(PyObject *obj, PyObject *args) { @@ -16554,6 +16759,36 @@ cmsis_arm_absmax_q7(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_absmax_no_idx_q7(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q7_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q7_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_BYTE,int8_t,q7_t); + blockSize = arraySizepSrc ; + + + + + + arm_absmax_no_idx_q7(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("i",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_max_q15(PyObject *obj, PyObject *args) @@ -16592,6 +16827,36 @@ cmsis_arm_max_q15(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_max_no_idx_q15(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q15_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q15_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_INT16,int16_t,int16_t); + blockSize = arraySizepSrc ; + + + + + + arm_max_no_idx_q15(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("h",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_absmax_q15(PyObject *obj, PyObject *args) { @@ -16629,6 +16894,35 @@ cmsis_arm_absmax_q15(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_absmax_no_idx_q15(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q15_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q15_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_INT16,int16_t,int16_t); + blockSize = arraySizepSrc ; + + + + + arm_absmax_no_idx_q15(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("h",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_max_q31(PyObject *obj, PyObject *args) @@ -16667,6 +16961,36 @@ cmsis_arm_max_q31(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_max_no_idx_q31(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q31_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q31_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_INT32,int32_t,int32_t); + blockSize = arraySizepSrc ; + + + + + + arm_max_no_idx_q31(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("i",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_absmax_q31(PyObject *obj, PyObject *args) { @@ -16704,6 +17028,35 @@ cmsis_arm_absmax_q31(PyObject *obj, PyObject *args) return(NULL); } +static PyObject * +cmsis_arm_absmax_no_idx_q31(PyObject *obj, PyObject *args) +{ + + PyObject *pSrc=NULL; // input + q31_t *pSrc_converted=NULL; // input + uint32_t blockSize; // input + q31_t pResult; // output + + if (PyArg_ParseTuple(args,"O",&pSrc)) + { + + GETARGUMENT(pSrc,NPY_INT32,int32_t,int32_t); + blockSize = arraySizepSrc ; + + + + + arm_absmax_no_idx_q31(pSrc_converted,blockSize,&pResult); + PyObject* pResultOBJ=Py_BuildValue("i",pResult); + + + FREEARGUMENT(pSrc_converted); + return(pResultOBJ); + + } + return(NULL); +} + static PyObject * cmsis_arm_max_f32(PyObject *obj, PyObject *args) @@ -17876,12 +18229,18 @@ static PyMethodDef CMSISMLMethods[] = { {"arm_cmplx_mult_real_q31", cmsis_arm_cmplx_mult_real_q31, METH_VARARGS,""}, {"arm_cmplx_mult_real_f32", cmsis_arm_cmplx_mult_real_f32, METH_VARARGS,""}, {"arm_min_q7", cmsis_arm_min_q7, METH_VARARGS,""}, +{"arm_min_no_idx_q7", cmsis_arm_min_no_idx_q7, METH_VARARGS,""}, +{"arm_min_no_idx_q15", cmsis_arm_min_no_idx_q15, METH_VARARGS,""}, +{"arm_min_no_idx_q31", cmsis_arm_min_no_idx_q31, METH_VARARGS,""}, {"arm_min_q15", cmsis_arm_min_q15, METH_VARARGS,""}, {"arm_min_q31", cmsis_arm_min_q31, METH_VARARGS,""}, {"arm_min_f32", cmsis_arm_min_f32, METH_VARARGS,""}, {"arm_absmin_q7", cmsis_arm_absmin_q7, METH_VARARGS,""}, {"arm_absmin_q15", cmsis_arm_absmin_q15, METH_VARARGS,""}, {"arm_absmin_q31", cmsis_arm_absmin_q31, METH_VARARGS,""}, +{"arm_absmin_no_idx_q7", cmsis_arm_absmin_no_idx_q7, METH_VARARGS,""}, +{"arm_absmin_no_idx_q15", cmsis_arm_absmin_no_idx_q15, METH_VARARGS,""}, +{"arm_absmin_no_idx_q31", cmsis_arm_absmin_no_idx_q31, METH_VARARGS,""}, {"arm_absmin_f32", cmsis_arm_absmin_f32, METH_VARARGS,""}, {"arm_max_q7", cmsis_arm_max_q7, METH_VARARGS,""}, {"arm_max_q15", cmsis_arm_max_q15, METH_VARARGS,""}, @@ -17891,6 +18250,12 @@ static PyMethodDef CMSISMLMethods[] = { {"arm_absmax_q31", cmsis_arm_absmax_q31, METH_VARARGS,""}, {"arm_max_f32", cmsis_arm_max_f32, METH_VARARGS,""}, {"arm_absmax_f32", cmsis_arm_absmax_f32, METH_VARARGS,""}, +{"arm_max_no_idx_q7", cmsis_arm_max_no_idx_q7, METH_VARARGS,""}, +{"arm_max_no_idx_q15", cmsis_arm_max_no_idx_q15, METH_VARARGS,""}, +{"arm_max_no_idx_q31", cmsis_arm_max_no_idx_q31, METH_VARARGS,""}, +{"arm_absmax_no_idx_q7", cmsis_arm_absmax_no_idx_q7, METH_VARARGS,""}, +{"arm_absmax_no_idx_q15", cmsis_arm_absmax_no_idx_q15, METH_VARARGS,""}, +{"arm_absmax_no_idx_q31", cmsis_arm_absmax_no_idx_q31, METH_VARARGS,""}, {"arm_cmplx_mult_cmplx_q15", cmsis_arm_cmplx_mult_cmplx_q15, METH_VARARGS,""}, {"arm_cmplx_mult_cmplx_q31", cmsis_arm_cmplx_mult_cmplx_q31, METH_VARARGS,""}, {"arm_cmplx_mult_cmplx_f32", cmsis_arm_cmplx_mult_cmplx_f32, METH_VARARGS,""}, diff --git a/PythonWrapper/testdsp2.py b/PythonWrapper/testdsp2.py index 0a56bf32..41aa6237 100755 --- a/PythonWrapper/testdsp2.py +++ b/PythonWrapper/testdsp2.py @@ -57,8 +57,8 @@ a31 = f.toQ31(a) i=dsp.arm_absmax_q31(a31) print(f.Q31toF32(i[0]),i[1]) -a8 = f.toQ15(a) -i=dsp.arm_absmax_q15(a8) +a15 = f.toQ15(a) +i=dsp.arm_absmax_q15(a15) print(f.Q15toF32(i[0]),i[1]) a7 = f.toQ7(a) diff --git a/PythonWrapper/testdsp4.py b/PythonWrapper/testdsp4.py new file mode 100755 index 00000000..5d76d733 --- /dev/null +++ b/PythonWrapper/testdsp4.py @@ -0,0 +1,71 @@ +import cmsisdsp as dsp +import numpy as np +from scipy import signal +from scipy.fftpack import dct +import cmsisdsp.fixedpoint as f +from pyquaternion import Quaternion + +import colorama +from colorama import init,Fore, Back, Style +import statsmodels.tsa.stattools + +import scipy.spatial + + +init() + +def printTitle(s): + print("\n" + Fore.GREEN + Style.BRIGHT + s + Style.RESET_ALL) + +def printSubTitle(s): + print("\n" + Style.BRIGHT + s + Style.RESET_ALL) + +printTitle("Max and AbsMax") +a=np.array([1.,-3.,4.,0.,-10.,8.]) +i=dsp.arm_absmax_f32(a) + +printSubTitle("Fixed point tests") +# Normalize for fixed point tests +a = a / i[0] + +a7 = f.toQ7(a) +a15 = f.toQ15(a) +a31 = f.toQ31(a) + +print(a31) +print(dsp.arm_absmax_no_idx_q31(a31)) +print(dsp.arm_max_no_idx_q31(a31)) + +print(a15) +print(dsp.arm_absmax_no_idx_q15(a15)) +print(dsp.arm_max_no_idx_q15(a15)) + +print(a7) +print(dsp.arm_absmax_no_idx_q7(a7)) +print(dsp.arm_max_no_idx_q7(a7)) + +printTitle("Min and AbsMin") +a=np.array([1.,-3.,4.,0.5,-10.,8.]) +i=dsp.arm_absmax_f32(a) + +printSubTitle("Fixed point tests") + +# Normalize for fixed point tests +a = a / i[0] + + +a7 = f.toQ7(a) +a15 = f.toQ15(a) +a31 = f.toQ31(a) + +print(a31) +print(dsp.arm_absmin_no_idx_q31(a31)) +print(dsp.arm_min_no_idx_q31(a31)) + +print(a15) +print(dsp.arm_absmin_no_idx_q15(a15)) +print(dsp.arm_min_no_idx_q15(a15)) + +print(a7) +print(dsp.arm_absmin_no_idx_q7(a7)) +print(dsp.arm_min_no_idx_q7(a7)) \ No newline at end of file