cmsisdsp_matrix.c 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308
  1. /* ----------------------------------------------------------------------
  2. * Project: CMSIS DSP Python Wrapper
  3. * Title: cmsismodule.h
  4. * Description: C code for the CMSIS-DSP Python wrapper
  5. *
  6. * $Date: 27 April 2021
  7. * $Revision: V1.0
  8. *
  9. * Target Processor: Cortex-M cores
  10. * -------------------------------------------------------------------- */
  11. /*
  12. * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
  13. *
  14. * SPDX-License-Identifier: Apache-2.0
  15. *
  16. * Licensed under the Apache License, Version 2.0 (the License); you may
  17. * not use this file except in compliance with the License.
  18. * You may obtain a copy of the License at
  19. *
  20. * www.apache.org/licenses/LICENSE-2.0
  21. *
  22. * Unless required by applicable law or agreed to in writing, software
  23. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  24. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  25. * See the License for the specific language governing permissions and
  26. * limitations under the License.
  27. */
  28. #define MODNAME "cmsisdsp_matrix"
  29. #define MODINITNAME cmsisdsp_matrix
  30. #include "cmsisdsp_module.h"
  31. MATRIXFROMNUMPY(f32,float32_t,double,NPY_DOUBLE);
  32. MATRIXFROMNUMPY(f64,float64_t,double,NPY_DOUBLE);
  33. MATRIXFROMNUMPY(q31,q31_t,int32_t,NPY_INT32);
  34. MATRIXFROMNUMPY(q15,q15_t,int16_t,NPY_INT16);
  35. MATRIXFROMNUMPY(q7,q7_t,int8_t,NPY_BYTE);
  36. CREATEMATRIX(f32,float32_t);
  37. CREATEMATRIX(f64,float64_t);
  38. CREATEMATRIX(q31,q31_t);
  39. CREATEMATRIX(q15,q15_t);
  40. CREATEMATRIX(q7,q7_t);
  41. NUMPYVECTORFROMBUFFER(f32,float32_t,NPY_FLOAT);
  42. NUMPYARRAYFROMMATRIX(f32,NPY_FLOAT);
  43. NUMPYARRAYFROMMATRIX(f64,NPY_DOUBLE);
  44. NUMPYARRAYFROMMATRIX(q31,NPY_INT32);
  45. NUMPYARRAYFROMMATRIX(q15,NPY_INT16);
  46. NUMPYARRAYFROMMATRIX(q7,NPY_BYTE);
  47. typedef struct {
  48. PyObject_HEAD
  49. arm_matrix_instance_f32 *instance;
  50. } dsp_arm_matrix_instance_f32Object;
  51. static void
  52. arm_matrix_instance_f32_dealloc(dsp_arm_matrix_instance_f32Object* self)
  53. {
  54. //printf("Dealloc called\n");
  55. if (self->instance)
  56. {
  57. if (self->instance->pData)
  58. {
  59. PyMem_Free(self->instance->pData);
  60. }
  61. PyMem_Free(self->instance);
  62. }
  63. Py_TYPE(self)->tp_free((PyObject*)self);
  64. }
  65. static PyObject *
  66. arm_matrix_instance_f32_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
  67. {
  68. dsp_arm_matrix_instance_f32Object *self;
  69. //printf("New called\n");
  70. self = (dsp_arm_matrix_instance_f32Object *)type->tp_alloc(type, 0);
  71. //printf("alloc called\n");
  72. if (self != NULL) {
  73. self->instance = PyMem_Malloc(sizeof(arm_matrix_instance_f32));
  74. self->instance->pData = NULL;
  75. }
  76. return (PyObject *)self;
  77. }
  78. static int
  79. arm_matrix_instance_f32_init(dsp_arm_matrix_instance_f32Object *self, PyObject *args, PyObject *kwds)
  80. {
  81. PyObject *pData=NULL;
  82. char *kwlist[] = {
  83. "numRows","numCols","pData",NULL
  84. };
  85. if (PyArg_ParseTupleAndKeywords(args, kwds, "|hhO", kwlist,&self->instance->numRows
  86. ,&self->instance->numCols
  87. ,&pData
  88. ))
  89. {
  90. INITARRAYFIELD(pData,NPY_DOUBLE,double,float32_t);
  91. }
  92. return 0;
  93. }
  94. GETFIELD(arm_matrix_instance_f32,numRows,"h");
  95. GETFIELD(arm_matrix_instance_f32,numCols,"h");
  96. static PyMethodDef arm_matrix_instance_f32_methods[] = {
  97. {"numRows", (PyCFunction) Method_arm_matrix_instance_f32_numRows,METH_NOARGS,"numRows"},
  98. {"numCols", (PyCFunction) Method_arm_matrix_instance_f32_numCols,METH_NOARGS,"numCols"},
  99. {NULL} /* Sentinel */
  100. };
  101. DSPType(arm_matrix_instance_f32,arm_matrix_instance_f32_new,arm_matrix_instance_f32_dealloc,arm_matrix_instance_f32_init,arm_matrix_instance_f32_methods);
  102. typedef struct {
  103. PyObject_HEAD
  104. arm_matrix_instance_f64 *instance;
  105. } dsp_arm_matrix_instance_f64Object;
  106. static void
  107. arm_matrix_instance_f64_dealloc(dsp_arm_matrix_instance_f64Object* self)
  108. {
  109. //printf("Dealloc called\n");
  110. if (self->instance)
  111. {
  112. if (self->instance->pData)
  113. {
  114. PyMem_Free(self->instance->pData);
  115. }
  116. PyMem_Free(self->instance);
  117. }
  118. Py_TYPE(self)->tp_free((PyObject*)self);
  119. }
  120. static PyObject *
  121. arm_matrix_instance_f64_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
  122. {
  123. dsp_arm_matrix_instance_f64Object *self;
  124. //printf("New called\n");
  125. self = (dsp_arm_matrix_instance_f64Object *)type->tp_alloc(type, 0);
  126. //printf("alloc called\n");
  127. if (self != NULL) {
  128. self->instance = PyMem_Malloc(sizeof(arm_matrix_instance_f64));
  129. self->instance->pData = NULL;
  130. }
  131. return (PyObject *)self;
  132. }
  133. static int
  134. arm_matrix_instance_f64_init(dsp_arm_matrix_instance_f64Object *self, PyObject *args, PyObject *kwds)
  135. {
  136. PyObject *pData=NULL;
  137. char *kwlist[] = {
  138. "numRows","numCols","pData",NULL
  139. };
  140. if (PyArg_ParseTupleAndKeywords(args, kwds, "|hhO", kwlist,&self->instance->numRows
  141. ,&self->instance->numCols
  142. ,&pData
  143. ))
  144. {
  145. INITARRAYFIELD(pData,NPY_FLOAT64,float64_t,float64_t);
  146. }
  147. return 0;
  148. }
  149. GETFIELD(arm_matrix_instance_f64,numRows,"h");
  150. GETFIELD(arm_matrix_instance_f64,numCols,"h");
  151. static PyMethodDef arm_matrix_instance_f64_methods[] = {
  152. {"numRows", (PyCFunction) Method_arm_matrix_instance_f64_numRows,METH_NOARGS,"numRows"},
  153. {"numCols", (PyCFunction) Method_arm_matrix_instance_f64_numCols,METH_NOARGS,"numCols"},
  154. {NULL} /* Sentinel */
  155. };
  156. DSPType(arm_matrix_instance_f64,arm_matrix_instance_f64_new,arm_matrix_instance_f64_dealloc,arm_matrix_instance_f64_init,arm_matrix_instance_f64_methods);
  157. typedef struct {
  158. PyObject_HEAD
  159. arm_matrix_instance_q15 *instance;
  160. } dsp_arm_matrix_instance_q15Object;
  161. static void
  162. arm_matrix_instance_q15_dealloc(dsp_arm_matrix_instance_q15Object* self)
  163. {
  164. //printf("Dealloc called\n");
  165. if (self->instance)
  166. {
  167. if (self->instance->pData)
  168. {
  169. PyMem_Free(self->instance->pData);
  170. }
  171. PyMem_Free(self->instance);
  172. }
  173. Py_TYPE(self)->tp_free((PyObject*)self);
  174. }
  175. static PyObject *
  176. arm_matrix_instance_q15_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
  177. {
  178. dsp_arm_matrix_instance_q15Object *self;
  179. //printf("New called\n");
  180. self = (dsp_arm_matrix_instance_q15Object *)type->tp_alloc(type, 0);
  181. //printf("alloc called\n");
  182. if (self != NULL) {
  183. self->instance = PyMem_Malloc(sizeof(arm_matrix_instance_q15));
  184. self->instance->pData = NULL;
  185. }
  186. return (PyObject *)self;
  187. }
  188. static int
  189. arm_matrix_instance_q15_init(dsp_arm_matrix_instance_q15Object *self, PyObject *args, PyObject *kwds)
  190. {
  191. PyObject *pData=NULL;
  192. char *kwlist[] = {
  193. "numRows","numCols","pData",NULL
  194. };
  195. if (PyArg_ParseTupleAndKeywords(args, kwds, "|hhO", kwlist,&self->instance->numRows
  196. ,&self->instance->numCols
  197. ,&pData
  198. ))
  199. {
  200. INITARRAYFIELD(pData,NPY_INT16,int16_t,int16_t);
  201. }
  202. return 0;
  203. }
  204. GETFIELD(arm_matrix_instance_q15,numRows,"h");
  205. GETFIELD(arm_matrix_instance_q15,numCols,"h");
  206. static PyMethodDef arm_matrix_instance_q15_methods[] = {
  207. {"numRows", (PyCFunction) Method_arm_matrix_instance_q15_numRows,METH_NOARGS,"numRows"},
  208. {"numCols", (PyCFunction) Method_arm_matrix_instance_q15_numCols,METH_NOARGS,"numCols"},
  209. {NULL} /* Sentinel */
  210. };
  211. DSPType(arm_matrix_instance_q15,arm_matrix_instance_q15_new,arm_matrix_instance_q15_dealloc,arm_matrix_instance_q15_init,arm_matrix_instance_q15_methods);
  212. typedef struct {
  213. PyObject_HEAD
  214. arm_matrix_instance_q31 *instance;
  215. } dsp_arm_matrix_instance_q31Object;
  216. static void
  217. arm_matrix_instance_q31_dealloc(dsp_arm_matrix_instance_q31Object* self)
  218. {
  219. //printf("Dealloc called\n");
  220. if (self->instance)
  221. {
  222. if (self->instance->pData)
  223. {
  224. PyMem_Free(self->instance->pData);
  225. }
  226. PyMem_Free(self->instance);
  227. }
  228. Py_TYPE(self)->tp_free((PyObject*)self);
  229. }
  230. static PyObject *
  231. arm_matrix_instance_q31_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
  232. {
  233. dsp_arm_matrix_instance_q31Object *self;
  234. //printf("New called\n");
  235. self = (dsp_arm_matrix_instance_q31Object *)type->tp_alloc(type, 0);
  236. //printf("alloc called\n");
  237. if (self != NULL) {
  238. self->instance = PyMem_Malloc(sizeof(arm_matrix_instance_q31));
  239. self->instance->pData = NULL;
  240. }
  241. return (PyObject *)self;
  242. }
  243. static int
  244. arm_matrix_instance_q31_init(dsp_arm_matrix_instance_q31Object *self, PyObject *args, PyObject *kwds)
  245. {
  246. PyObject *pData=NULL;
  247. char *kwlist[] = {
  248. "numRows","numCols","pData",NULL
  249. };
  250. if (PyArg_ParseTupleAndKeywords(args, kwds, "|hhO", kwlist,&self->instance->numRows
  251. ,&self->instance->numCols
  252. ,&pData
  253. ))
  254. {
  255. INITARRAYFIELD(pData,NPY_INT32,int32_t,int32_t);
  256. }
  257. return 0;
  258. }
  259. GETFIELD(arm_matrix_instance_q31,numRows,"h");
  260. GETFIELD(arm_matrix_instance_q31,numCols,"h");
  261. static PyMethodDef arm_matrix_instance_q31_methods[] = {
  262. {"numRows", (PyCFunction) Method_arm_matrix_instance_q31_numRows,METH_NOARGS,"numRows"},
  263. {"numCols", (PyCFunction) Method_arm_matrix_instance_q31_numCols,METH_NOARGS,"numCols"},
  264. {NULL} /* Sentinel */
  265. };
  266. DSPType(arm_matrix_instance_q31,arm_matrix_instance_q31_new,arm_matrix_instance_q31_dealloc,arm_matrix_instance_q31_init,arm_matrix_instance_q31_methods);
  267. void typeRegistration(PyObject *module) {
  268. ADDTYPE(arm_matrix_instance_f32);
  269. ADDTYPE(arm_matrix_instance_f64);
  270. ADDTYPE(arm_matrix_instance_q15);
  271. ADDTYPE(arm_matrix_instance_q31);
  272. }
  273. static PyObject *
  274. cmsis_arm_mat_add_f32(PyObject *obj, PyObject *args)
  275. {
  276. PyObject *pSrcA=NULL; // input
  277. arm_matrix_instance_f32 pSrcA_converted; // input
  278. PyObject *pSrcB=NULL; // input
  279. arm_matrix_instance_f32 pSrcB_converted; // input
  280. arm_matrix_instance_f32 pDst_converted;
  281. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  282. {
  283. f32MatrixFromNumpy(&pSrcA_converted,pSrcA);
  284. f32MatrixFromNumpy(&pSrcB_converted,pSrcB);
  285. uint32_t row = pSrcA_converted.numRows ;
  286. uint32_t column = pSrcB_converted.numCols ;
  287. createf32Matrix(&pDst_converted,row,column);
  288. arm_status returnValue = arm_mat_add_f32(&pSrcA_converted,&pSrcB_converted,&pDst_converted);
  289. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  290. PyObject* pDstOBJ=NumpyArrayFromf32Matrix(&pDst_converted);
  291. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  292. Py_DECREF(theReturnOBJ);
  293. FREEMATRIX(&pSrcA_converted);
  294. FREEMATRIX(&pSrcB_converted);
  295. Py_DECREF(pDstOBJ);
  296. return(pythonResult);
  297. }
  298. Py_RETURN_NONE;
  299. }
  300. static PyObject *
  301. cmsis_arm_mat_add_q15(PyObject *obj, PyObject *args)
  302. {
  303. PyObject *pSrcA=NULL; // input
  304. arm_matrix_instance_q15 pSrcA_converted; // input
  305. PyObject *pSrcB=NULL; // input
  306. arm_matrix_instance_q15 pSrcB_converted; // input
  307. arm_matrix_instance_q15 pDst_converted;
  308. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  309. {
  310. q15MatrixFromNumpy(&pSrcA_converted,pSrcA);
  311. q15MatrixFromNumpy(&pSrcB_converted,pSrcB);
  312. uint32_t row = pSrcA_converted.numRows ;
  313. uint32_t column = pSrcB_converted.numCols ;
  314. createq15Matrix(&pDst_converted,row,column);
  315. arm_status returnValue = arm_mat_add_q15(&pSrcA_converted,
  316. &pSrcB_converted,
  317. &pDst_converted);
  318. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  319. PyObject* pDstOBJ=NumpyArrayFromq15Matrix(&pDst_converted);
  320. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  321. Py_DECREF(theReturnOBJ);
  322. FREEMATRIX(&pSrcA_converted);
  323. FREEMATRIX(&pSrcB_converted);
  324. Py_DECREF(pDstOBJ);
  325. return(pythonResult);
  326. }
  327. Py_RETURN_NONE;
  328. }
  329. static PyObject *
  330. cmsis_arm_mat_add_q31(PyObject *obj, PyObject *args)
  331. {
  332. PyObject *pSrcA=NULL; // input
  333. arm_matrix_instance_q31 pSrcA_converted; // input
  334. PyObject *pSrcB=NULL; // input
  335. arm_matrix_instance_q31 pSrcB_converted; // input
  336. arm_matrix_instance_q31 pDst_converted;
  337. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  338. {
  339. q31MatrixFromNumpy(&pSrcA_converted,pSrcA);
  340. q31MatrixFromNumpy(&pSrcB_converted,pSrcB);
  341. uint32_t row = pSrcA_converted.numRows ;
  342. uint32_t column = pSrcB_converted.numCols ;
  343. createq31Matrix(&pDst_converted,row,column);
  344. arm_status returnValue = arm_mat_add_q31(&pSrcA_converted,
  345. &pSrcB_converted,
  346. &pDst_converted);
  347. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  348. PyObject* pDstOBJ=NumpyArrayFromq31Matrix(&pDst_converted);
  349. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  350. Py_DECREF(theReturnOBJ);
  351. FREEMATRIX(&pSrcA_converted);
  352. FREEMATRIX(&pSrcB_converted);
  353. Py_DECREF(pDstOBJ);
  354. return(pythonResult);
  355. }
  356. Py_RETURN_NONE;
  357. }
  358. static PyObject *
  359. cmsis_arm_mat_cmplx_trans_f32(PyObject *obj, PyObject *args)
  360. {
  361. PyObject *pSrc=NULL; // input
  362. arm_matrix_instance_f32 pSrc_converted; // input
  363. arm_matrix_instance_f32 pDst_converted;
  364. if (PyArg_ParseTuple(args,"O",&pSrc))
  365. {
  366. f32MatrixFromNumpy(&pSrc_converted,pSrc);
  367. pSrc_converted.numCols = pSrc_converted.numCols / 2;
  368. uint32_t row = pSrc_converted.numCols ;
  369. uint32_t column = pSrc_converted.numRows*2 ;
  370. createf32Matrix(&pDst_converted,row,column);
  371. /*
  372. Dimensions in matrix instance are not correct but they are not used
  373. by CMSIS-DSP since the library is not compiled with ARM_MATRIX_CHECK.
  374. So only source dimensions are used for the computation.
  375. The dimensions are correct for createf32Matrix since we need to create
  376. a bigger buffer and createf32Matrix only knows real.
  377. */
  378. arm_status returnValue = arm_mat_cmplx_trans_f32(&pSrc_converted,&pDst_converted);
  379. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  380. PyObject* pDstOBJ=NumpyArrayFromf32Matrix(&pDst_converted);
  381. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  382. Py_DECREF(theReturnOBJ);
  383. FREEMATRIX(&pSrc_converted);
  384. Py_DECREF(pDstOBJ);
  385. return(pythonResult);
  386. }
  387. Py_RETURN_NONE;
  388. }
  389. static PyObject *
  390. cmsis_arm_mat_cmplx_trans_q31(PyObject *obj, PyObject *args)
  391. {
  392. PyObject *pSrc=NULL; // input
  393. arm_matrix_instance_q31 pSrc_converted; // input
  394. arm_matrix_instance_q31 pDst_converted;
  395. if (PyArg_ParseTuple(args,"O",&pSrc))
  396. {
  397. q31MatrixFromNumpy(&pSrc_converted,pSrc);
  398. pSrc_converted.numCols = pSrc_converted.numCols / 2;
  399. uint32_t row = pSrc_converted.numCols ;
  400. uint32_t column = pSrc_converted.numRows*2 ;
  401. createq31Matrix(&pDst_converted,row,column);
  402. /*
  403. Dimensions in matrix instance are not correct but they are not used
  404. by CMSIS-DSP since the library is not compiled with ARM_MATRIX_CHECK.
  405. So only source dimensions are used for the computation.
  406. The dimensions are correct for createf32Matrix since we need to create
  407. a bigger buffer and createf32Matrix only knows real.
  408. */
  409. arm_status returnValue = arm_mat_cmplx_trans_q31(&pSrc_converted,&pDst_converted);
  410. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  411. PyObject* pDstOBJ=NumpyArrayFromq31Matrix(&pDst_converted);
  412. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  413. Py_DECREF(theReturnOBJ);
  414. FREEMATRIX(&pSrc_converted);
  415. Py_DECREF(pDstOBJ);
  416. return(pythonResult);
  417. }
  418. Py_RETURN_NONE;
  419. }
  420. static PyObject *
  421. cmsis_arm_mat_cmplx_trans_q15(PyObject *obj, PyObject *args)
  422. {
  423. PyObject *pSrc=NULL; // input
  424. arm_matrix_instance_q15 pSrc_converted; // input
  425. arm_matrix_instance_q15 pDst_converted;
  426. if (PyArg_ParseTuple(args,"O",&pSrc))
  427. {
  428. q15MatrixFromNumpy(&pSrc_converted,pSrc);
  429. pSrc_converted.numCols = pSrc_converted.numCols / 2;
  430. uint32_t row = pSrc_converted.numCols ;
  431. uint32_t column = pSrc_converted.numRows*2 ;
  432. createq15Matrix(&pDst_converted,row,column);
  433. /*
  434. Dimensions in matrix instance are not correct but they are not used
  435. by CMSIS-DSP since the library is not compiled with ARM_MATRIX_CHECK.
  436. So only source dimensions are used for the computation.
  437. The dimensions are correct for createf32Matrix since we need to create
  438. a bigger buffer and createf32Matrix only knows real.
  439. */
  440. arm_status returnValue = arm_mat_cmplx_trans_q15(&pSrc_converted,&pDst_converted);
  441. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  442. PyObject* pDstOBJ=NumpyArrayFromq15Matrix(&pDst_converted);
  443. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  444. Py_DECREF(theReturnOBJ);
  445. FREEMATRIX(&pSrc_converted);
  446. Py_DECREF(pDstOBJ);
  447. return(pythonResult);
  448. }
  449. Py_RETURN_NONE;
  450. }
  451. static PyObject *
  452. cmsis_arm_mat_cmplx_mult_f32(PyObject *obj, PyObject *args)
  453. {
  454. PyObject *pSrcA=NULL; // input
  455. arm_matrix_instance_f32 pSrcA_converted; // input
  456. PyObject *pSrcB=NULL; // input
  457. arm_matrix_instance_f32 pSrcB_converted; // input
  458. arm_matrix_instance_f32 pDst_converted;
  459. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  460. {
  461. f32MatrixFromNumpy(&pSrcA_converted,pSrcA);
  462. f32MatrixFromNumpy(&pSrcB_converted,pSrcB);
  463. pSrcA_converted.numCols = pSrcA_converted.numCols / 2;
  464. pSrcB_converted.numCols = pSrcB_converted.numCols / 2;
  465. uint32_t row = pSrcA_converted.numRows ;
  466. uint32_t column = pSrcB_converted.numCols * 2;
  467. createf32Matrix(&pDst_converted,row,column);
  468. arm_status returnValue = arm_mat_cmplx_mult_f32(&pSrcA_converted,
  469. &pSrcB_converted,&pDst_converted);
  470. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  471. PyObject* pDstOBJ=NumpyArrayFromf32Matrix(&pDst_converted);
  472. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  473. Py_DECREF(theReturnOBJ);
  474. FREEMATRIX(&pSrcA_converted);
  475. FREEMATRIX(&pSrcB_converted);
  476. Py_DECREF(pDstOBJ);
  477. return(pythonResult);
  478. }
  479. Py_RETURN_NONE;
  480. }
  481. static PyObject *
  482. cmsis_arm_mat_cmplx_mult_q15(PyObject *obj, PyObject *args)
  483. {
  484. PyObject *pSrcA=NULL; // input
  485. arm_matrix_instance_q15 pSrcA_converted; // input
  486. PyObject *pSrcB=NULL; // input
  487. arm_matrix_instance_q15 pSrcB_converted; // input
  488. PyObject *pScratch=NULL; // input
  489. q15_t *pScratch_converted=NULL; // input
  490. arm_matrix_instance_q15 pDst_converted;
  491. if (PyArg_ParseTuple(args,"OOO",&pSrcA,&pSrcB,&pScratch))
  492. {
  493. q15MatrixFromNumpy(&pSrcA_converted,pSrcA);
  494. q15MatrixFromNumpy(&pSrcB_converted,pSrcB);
  495. GETARGUMENT(pScratch,NPY_INT16,int16_t,int16_t);
  496. pSrcA_converted.numCols = pSrcA_converted.numCols / 2;
  497. pSrcB_converted.numCols = pSrcB_converted.numCols / 2;
  498. uint32_t row = pSrcA_converted.numRows ;
  499. uint32_t column = pSrcB_converted.numCols * 2;
  500. createq15Matrix(&pDst_converted,row,column);
  501. arm_status returnValue = arm_mat_cmplx_mult_q15(&pSrcA_converted,
  502. &pSrcB_converted,&pDst_converted,pScratch_converted);
  503. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  504. PyObject* pDstOBJ=NumpyArrayFromq15Matrix(&pDst_converted);
  505. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  506. Py_DECREF(theReturnOBJ);
  507. FREEMATRIX(&pSrcA_converted);
  508. FREEMATRIX(&pSrcB_converted);
  509. Py_DECREF(pDstOBJ);
  510. FREEARGUMENT(pScratch_converted);
  511. return(pythonResult);
  512. }
  513. Py_RETURN_NONE;
  514. }
  515. static PyObject *
  516. cmsis_arm_mat_cmplx_mult_q31(PyObject *obj, PyObject *args)
  517. {
  518. PyObject *pSrcA=NULL; // input
  519. arm_matrix_instance_q31 pSrcA_converted; // input
  520. PyObject *pSrcB=NULL; // input
  521. arm_matrix_instance_q31 pSrcB_converted; // input
  522. arm_matrix_instance_q31 pDst_converted;
  523. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  524. {
  525. q31MatrixFromNumpy(&pSrcA_converted,pSrcA);
  526. q31MatrixFromNumpy(&pSrcB_converted,pSrcB);
  527. pSrcA_converted.numCols = pSrcA_converted.numCols / 2;
  528. pSrcB_converted.numCols = pSrcB_converted.numCols / 2;
  529. uint32_t row = pSrcA_converted.numRows ;
  530. uint32_t column = pSrcB_converted.numCols * 2;
  531. createq31Matrix(&pDst_converted,row,column);
  532. arm_status returnValue = arm_mat_cmplx_mult_q31(&pSrcA_converted,
  533. &pSrcB_converted,&pDst_converted);
  534. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  535. PyObject* pDstOBJ=NumpyArrayFromq31Matrix(&pDst_converted);
  536. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  537. Py_DECREF(theReturnOBJ);
  538. FREEMATRIX(&pSrcA_converted);
  539. FREEMATRIX(&pSrcB_converted);
  540. Py_DECREF(pDstOBJ);
  541. return(pythonResult);
  542. }
  543. Py_RETURN_NONE;
  544. }
  545. static PyObject *
  546. cmsis_arm_mat_trans_f32(PyObject *obj, PyObject *args)
  547. {
  548. PyObject *pSrc=NULL; // input
  549. arm_matrix_instance_f32 pSrc_converted; // input
  550. arm_matrix_instance_f32 pDst_converted;
  551. if (PyArg_ParseTuple(args,"O",&pSrc))
  552. {
  553. f32MatrixFromNumpy(&pSrc_converted,pSrc);
  554. uint32_t row = pSrc_converted.numCols ;
  555. uint32_t column = pSrc_converted.numRows ;
  556. createf32Matrix(&pDst_converted,row,column);
  557. arm_status returnValue = arm_mat_trans_f32(&pSrc_converted,&pDst_converted);
  558. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  559. PyObject* pDstOBJ=NumpyArrayFromf32Matrix(&pDst_converted);
  560. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  561. Py_DECREF(theReturnOBJ);
  562. FREEMATRIX(&pSrc_converted);
  563. Py_DECREF(pDstOBJ);
  564. return(pythonResult);
  565. }
  566. Py_RETURN_NONE;
  567. }
  568. static PyObject *
  569. cmsis_arm_mat_trans_f64(PyObject *obj, PyObject *args)
  570. {
  571. PyObject *pSrc=NULL; // input
  572. arm_matrix_instance_f64 pSrc_converted; // input
  573. arm_matrix_instance_f64 pDst_converted;
  574. if (PyArg_ParseTuple(args,"O",&pSrc))
  575. {
  576. f64MatrixFromNumpy(&pSrc_converted,pSrc);
  577. uint32_t row = pSrc_converted.numCols ;
  578. uint32_t column = pSrc_converted.numRows ;
  579. createf64Matrix(&pDst_converted,row,column);
  580. arm_status returnValue = arm_mat_trans_f64(&pSrc_converted,&pDst_converted);
  581. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  582. PyObject* pDstOBJ=NumpyArrayFromf64Matrix(&pDst_converted);
  583. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  584. Py_DECREF(theReturnOBJ);
  585. FREEMATRIX(&pSrc_converted);
  586. Py_DECREF(pDstOBJ);
  587. return(pythonResult);
  588. }
  589. Py_RETURN_NONE;
  590. }
  591. static PyObject *
  592. cmsis_arm_mat_trans_q7(PyObject *obj, PyObject *args)
  593. {
  594. PyObject *pSrc=NULL; // input
  595. arm_matrix_instance_q7 pSrc_converted; // input
  596. arm_matrix_instance_q7 pDst_converted;
  597. if (PyArg_ParseTuple(args,"O",&pSrc))
  598. {
  599. q7MatrixFromNumpy(&pSrc_converted,pSrc);
  600. uint32_t row = pSrc_converted.numCols ;
  601. uint32_t column = pSrc_converted.numRows ;
  602. createq7Matrix(&pDst_converted,row,column);
  603. arm_status returnValue = arm_mat_trans_q7(&pSrc_converted,&pDst_converted);
  604. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  605. PyObject* pDstOBJ=NumpyArrayFromq7Matrix(&pDst_converted);
  606. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  607. Py_DECREF(theReturnOBJ);
  608. FREEMATRIX(&pSrc_converted);
  609. Py_DECREF(pDstOBJ);
  610. return(pythonResult);
  611. }
  612. Py_RETURN_NONE;
  613. }
  614. static PyObject *
  615. cmsis_arm_mat_trans_q15(PyObject *obj, PyObject *args)
  616. {
  617. PyObject *pSrc=NULL; // input
  618. arm_matrix_instance_q15 pSrc_converted; // input
  619. arm_matrix_instance_q15 pDst_converted;
  620. if (PyArg_ParseTuple(args,"O",&pSrc))
  621. {
  622. q15MatrixFromNumpy(&pSrc_converted,pSrc);
  623. uint32_t row = pSrc_converted.numCols ;
  624. uint32_t column = pSrc_converted.numRows ;
  625. createq15Matrix(&pDst_converted,row,column);
  626. arm_status returnValue = arm_mat_trans_q15(&pSrc_converted,&pDst_converted);
  627. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  628. PyObject* pDstOBJ=NumpyArrayFromq15Matrix(&pDst_converted);
  629. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  630. Py_DECREF(theReturnOBJ);
  631. FREEMATRIX(&pSrc_converted);
  632. Py_DECREF(pDstOBJ);
  633. return(pythonResult);
  634. }
  635. Py_RETURN_NONE;
  636. }
  637. static PyObject *
  638. cmsis_arm_mat_trans_q31(PyObject *obj, PyObject *args)
  639. {
  640. PyObject *pSrc=NULL; // input
  641. arm_matrix_instance_q31 pSrc_converted; // input
  642. arm_matrix_instance_q31 pDst_converted;
  643. if (PyArg_ParseTuple(args,"O",&pSrc))
  644. {
  645. q31MatrixFromNumpy(&pSrc_converted,pSrc);
  646. uint32_t row = pSrc_converted.numCols ;
  647. uint32_t column = pSrc_converted.numRows ;
  648. createq31Matrix(&pDst_converted,row,column);
  649. arm_status returnValue = arm_mat_trans_q31(&pSrc_converted,&pDst_converted);
  650. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  651. PyObject* pDstOBJ=NumpyArrayFromq31Matrix(&pDst_converted);
  652. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  653. Py_DECREF(theReturnOBJ);
  654. FREEMATRIX(&pSrc_converted);
  655. Py_DECREF(pDstOBJ);
  656. return(pythonResult);
  657. }
  658. Py_RETURN_NONE;
  659. }
  660. static PyObject *
  661. cmsis_arm_mat_vec_mult_f32(PyObject *obj, PyObject *args)
  662. {
  663. PyObject *pSrcA=NULL; // input
  664. arm_matrix_instance_f32 pSrcA_converted; // input
  665. PyObject *pSrcB=NULL; // input
  666. float32_t *pSrcB_converted=NULL; // input
  667. float32_t *pDst=NULL; // output
  668. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  669. {
  670. f32MatrixFromNumpy(&pSrcA_converted,pSrcA);
  671. GETARGUMENT(pSrcB,NPY_DOUBLE,double,float32_t);
  672. uint32_t row = pSrcA_converted.numRows ;
  673. uint32_t column = pSrcA_converted.numCols ;
  674. pDst=PyMem_Malloc(sizeof(float32_t)*row);
  675. arm_mat_vec_mult_f32(&pSrcA_converted,pSrcB_converted,pDst);
  676. FLOATARRAY1(pDstOBJ,row,pDst);
  677. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  678. FREEMATRIX(&pSrcA_converted);
  679. FREEARGUMENT(pSrcB_converted);
  680. Py_DECREF(pDstOBJ);
  681. return(pythonResult);
  682. }
  683. Py_RETURN_NONE;
  684. }
  685. static PyObject *
  686. cmsis_arm_mat_mult_f32(PyObject *obj, PyObject *args)
  687. {
  688. PyObject *pSrcA=NULL; // input
  689. arm_matrix_instance_f32 pSrcA_converted; // input
  690. PyObject *pSrcB=NULL; // input
  691. arm_matrix_instance_f32 pSrcB_converted; // input
  692. arm_matrix_instance_f32 pDst_converted;
  693. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  694. {
  695. f32MatrixFromNumpy(&pSrcA_converted,pSrcA);
  696. f32MatrixFromNumpy(&pSrcB_converted,pSrcB);
  697. uint32_t row = pSrcA_converted.numRows ;
  698. uint32_t column = pSrcB_converted.numCols ;
  699. createf32Matrix(&pDst_converted,row,column);
  700. arm_status returnValue = arm_mat_mult_f32(&pSrcA_converted,
  701. &pSrcB_converted,
  702. &pDst_converted);
  703. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  704. PyObject* pDstOBJ=NumpyArrayFromf32Matrix(&pDst_converted);
  705. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  706. Py_DECREF(theReturnOBJ);
  707. FREEMATRIX(&pSrcA_converted);
  708. FREEMATRIX(&pSrcB_converted);
  709. Py_DECREF(pDstOBJ);
  710. return(pythonResult);
  711. }
  712. Py_RETURN_NONE;
  713. }
  714. static PyObject *
  715. cmsis_arm_mat_mult_f64(PyObject *obj, PyObject *args)
  716. {
  717. PyObject *pSrcA=NULL; // input
  718. arm_matrix_instance_f64 pSrcA_converted; // input
  719. PyObject *pSrcB=NULL; // input
  720. arm_matrix_instance_f64 pSrcB_converted; // input
  721. arm_matrix_instance_f64 pDst_converted ;
  722. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  723. {
  724. f64MatrixFromNumpy(&pSrcA_converted,pSrcA);
  725. f64MatrixFromNumpy(&pSrcB_converted,pSrcB);
  726. uint32_t row = pSrcA_converted.numRows ;
  727. uint32_t column = pSrcB_converted.numCols ;
  728. createf64Matrix(&pDst_converted,row,column);
  729. arm_status returnValue = arm_mat_mult_f64(&pSrcA_converted,
  730. &pSrcB_converted,&pDst_converted);
  731. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  732. PyObject* pDstOBJ=NumpyArrayFromf64Matrix(&pDst_converted);
  733. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  734. Py_DECREF(theReturnOBJ);
  735. FREEMATRIX(&pSrcA_converted);
  736. FREEMATRIX(&pSrcB_converted);
  737. Py_DECREF(pDstOBJ);
  738. return(pythonResult);
  739. }
  740. Py_RETURN_NONE;
  741. }
  742. static PyObject *
  743. cmsis_arm_mat_vec_mult_q15(PyObject *obj, PyObject *args)
  744. {
  745. PyObject *pSrcA=NULL; // input
  746. arm_matrix_instance_q15 pSrcA_converted; // input
  747. PyObject *pSrcB=NULL; // input
  748. q15_t *pSrcB_converted=NULL; // input
  749. q15_t *pDst=NULL; // output
  750. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  751. {
  752. q15MatrixFromNumpy(&pSrcA_converted,pSrcA);
  753. GETARGUMENT(pSrcB,NPY_INT16,int16_t,q15_t);
  754. uint32_t row = pSrcA_converted.numRows ;
  755. uint32_t column = pSrcA_converted.numCols ;
  756. pDst=PyMem_Malloc(sizeof(q15_t)*row);
  757. arm_mat_vec_mult_q15(&pSrcA_converted,pSrcB_converted,pDst);
  758. INT16ARRAY1(pDstOBJ,row,pDst);
  759. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  760. FREEMATRIX(&pSrcA_converted);
  761. FREEARGUMENT(pSrcB_converted);
  762. Py_DECREF(pDstOBJ);
  763. return(pythonResult);
  764. }
  765. Py_RETURN_NONE;
  766. }
  767. static PyObject *
  768. cmsis_arm_mat_vec_mult_q7(PyObject *obj, PyObject *args)
  769. {
  770. PyObject *pSrcA=NULL; // input
  771. arm_matrix_instance_q7 pSrcA_converted; // input
  772. PyObject *pSrcB=NULL; // input
  773. q7_t *pSrcB_converted=NULL; // input
  774. q7_t *pDst=NULL; // output
  775. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  776. {
  777. q7MatrixFromNumpy(&pSrcA_converted,pSrcA);
  778. GETARGUMENT(pSrcB,NPY_BYTE,int8_t,q7_t);
  779. uint32_t row = pSrcA_converted.numRows ;
  780. uint32_t column = pSrcA_converted.numCols ;
  781. pDst=PyMem_Malloc(sizeof(q7_t)*row);
  782. arm_mat_vec_mult_q7(&pSrcA_converted,pSrcB_converted,pDst);
  783. INT8ARRAY1(pDstOBJ,row,pDst);
  784. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  785. FREEMATRIX(&pSrcA_converted);
  786. FREEARGUMENT(pSrcB_converted);
  787. Py_DECREF(pDstOBJ);
  788. return(pythonResult);
  789. }
  790. Py_RETURN_NONE;
  791. }
  792. static PyObject *
  793. cmsis_arm_mat_mult_q7(PyObject *obj, PyObject *args)
  794. {
  795. PyObject *pSrcA=NULL; // input
  796. arm_matrix_instance_q7 pSrcA_converted; // input
  797. PyObject *pSrcB=NULL; // input
  798. arm_matrix_instance_q7 pSrcB_converted; // input
  799. PyObject *pState=NULL; // input
  800. q7_t *pState_converted=NULL; // input
  801. arm_matrix_instance_q7 pDst_converted;
  802. if (PyArg_ParseTuple(args,"OOO",&pSrcA,&pSrcB,&pState))
  803. {
  804. q7MatrixFromNumpy(&pSrcA_converted,pSrcA);
  805. q7MatrixFromNumpy(&pSrcB_converted,pSrcB);
  806. GETARGUMENT(pState,NPY_BYTE,int8_t,q7_t);
  807. uint32_t row = pSrcA_converted.numRows ;
  808. uint32_t column = pSrcB_converted.numCols ;
  809. createq7Matrix(&pDst_converted,row,column);
  810. arm_status returnValue = arm_mat_mult_q7(&pSrcA_converted,
  811. &pSrcB_converted,
  812. &pDst_converted,pState_converted);
  813. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  814. PyObject* pDstOBJ=NumpyArrayFromq7Matrix(&pDst_converted);
  815. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  816. Py_DECREF(theReturnOBJ);
  817. FREEMATRIX(&pSrcA_converted);
  818. FREEMATRIX(&pSrcB_converted);
  819. Py_DECREF(pDstOBJ);
  820. FREEARGUMENT(pState_converted);
  821. return(pythonResult);
  822. }
  823. Py_RETURN_NONE;
  824. }
  825. static PyObject *
  826. cmsis_arm_mat_mult_q15(PyObject *obj, PyObject *args)
  827. {
  828. PyObject *pSrcA=NULL; // input
  829. arm_matrix_instance_q15 pSrcA_converted; // input
  830. PyObject *pSrcB=NULL; // input
  831. arm_matrix_instance_q15 pSrcB_converted; // input
  832. PyObject *pState=NULL; // input
  833. q15_t *pState_converted=NULL; // input
  834. arm_matrix_instance_q15 pDst_converted;
  835. if (PyArg_ParseTuple(args,"OOO",&pSrcA,&pSrcB,&pState))
  836. {
  837. q15MatrixFromNumpy(&pSrcA_converted,pSrcA);
  838. q15MatrixFromNumpy(&pSrcB_converted,pSrcB);
  839. GETARGUMENT(pState,NPY_INT16,int16_t,int16_t);
  840. uint32_t row = pSrcA_converted.numRows ;
  841. uint32_t column = pSrcB_converted.numCols ;
  842. createq15Matrix(&pDst_converted,row,column);
  843. arm_status returnValue = arm_mat_mult_q15(&pSrcA_converted,
  844. &pSrcB_converted,&pDst_converted,pState_converted);
  845. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  846. PyObject* pDstOBJ=NumpyArrayFromq15Matrix(&pDst_converted);
  847. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  848. Py_DECREF(theReturnOBJ);
  849. FREEMATRIX(&pSrcA_converted);
  850. FREEMATRIX(&pSrcB_converted);
  851. Py_DECREF(pDstOBJ);
  852. FREEARGUMENT(pState_converted);
  853. return(pythonResult);
  854. }
  855. Py_RETURN_NONE;
  856. }
  857. static PyObject *
  858. cmsis_arm_mat_mult_fast_q15(PyObject *obj, PyObject *args)
  859. {
  860. PyObject *pSrcA=NULL; // input
  861. arm_matrix_instance_q15 pSrcA_converted; // input
  862. PyObject *pSrcB=NULL; // input
  863. arm_matrix_instance_q15 pSrcB_converted; // input
  864. PyObject *pState=NULL; // input
  865. q15_t *pState_converted=NULL; // input
  866. arm_matrix_instance_q15 pDst_converted;
  867. if (PyArg_ParseTuple(args,"OOO",&pSrcA,&pSrcB,&pState))
  868. {
  869. q15MatrixFromNumpy(&pSrcA_converted,pSrcA);
  870. q15MatrixFromNumpy(&pSrcB_converted,pSrcB);
  871. GETARGUMENT(pState,NPY_INT16,int16_t,int16_t);
  872. uint32_t row = pSrcA_converted.numRows ;
  873. uint32_t column = pSrcB_converted.numCols ;
  874. createq15Matrix(&pDst_converted,row,column);
  875. arm_status returnValue = arm_mat_mult_fast_q15(&pSrcA_converted,
  876. &pSrcB_converted,&pDst_converted,pState_converted);
  877. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  878. PyObject* pDstOBJ=NumpyArrayFromq15Matrix(&pDst_converted);
  879. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  880. Py_DECREF(theReturnOBJ);
  881. FREEMATRIX(&pSrcA_converted);
  882. FREEMATRIX(&pSrcB_converted);
  883. Py_DECREF(pDstOBJ);
  884. FREEARGUMENT(pState_converted);
  885. return(pythonResult);
  886. }
  887. Py_RETURN_NONE;
  888. }
  889. static PyObject *
  890. cmsis_arm_mat_vec_mult_q31(PyObject *obj, PyObject *args)
  891. {
  892. PyObject *pSrcA=NULL; // input
  893. arm_matrix_instance_q31 pSrcA_converted; // input
  894. PyObject *pSrcB=NULL; // input
  895. q31_t *pSrcB_converted=NULL; // input
  896. q31_t *pDst=NULL; // output
  897. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  898. {
  899. q31MatrixFromNumpy(&pSrcA_converted,pSrcA);
  900. GETARGUMENT(pSrcB,NPY_INT32,int32_t,q31_t);
  901. uint32_t row = pSrcA_converted.numRows ;
  902. uint32_t column = pSrcA_converted.numCols ;
  903. pDst=PyMem_Malloc(sizeof(q31_t)*row);
  904. arm_mat_vec_mult_q31(&pSrcA_converted,pSrcB_converted,pDst);
  905. INT32ARRAY1(pDstOBJ,row,pDst);
  906. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  907. FREEMATRIX(&pSrcA_converted);
  908. FREEARGUMENT(pSrcB_converted);
  909. Py_DECREF(pDstOBJ);
  910. return(pythonResult);
  911. }
  912. Py_RETURN_NONE;
  913. }
  914. static PyObject *
  915. cmsis_arm_mat_mult_q31(PyObject *obj, PyObject *args)
  916. {
  917. PyObject *pSrcA=NULL; // input
  918. arm_matrix_instance_q31 pSrcA_converted; // input
  919. PyObject *pSrcB=NULL; // input
  920. arm_matrix_instance_q31 pSrcB_converted; // input
  921. arm_matrix_instance_q31 pDst_converted;
  922. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  923. {
  924. q31MatrixFromNumpy(&pSrcA_converted,pSrcA);
  925. q31MatrixFromNumpy(&pSrcB_converted,pSrcB);
  926. uint32_t row = pSrcA_converted.numRows ;
  927. uint32_t column = pSrcB_converted.numCols ;
  928. createq31Matrix(&pDst_converted,row,column);
  929. arm_status returnValue = arm_mat_mult_q31(&pSrcA_converted,&pSrcB_converted,
  930. &pDst_converted);
  931. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  932. PyObject* pDstOBJ=NumpyArrayFromq31Matrix(&pDst_converted);
  933. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  934. Py_DECREF(theReturnOBJ);
  935. FREEMATRIX(&pSrcA_converted);
  936. FREEMATRIX(&pSrcB_converted);
  937. Py_DECREF(pDstOBJ);
  938. return(pythonResult);
  939. }
  940. Py_RETURN_NONE;
  941. }
  942. static PyObject *
  943. cmsis_arm_mat_mult_opt_q31(PyObject *obj, PyObject *args)
  944. {
  945. PyObject *pSrcA=NULL; // input
  946. arm_matrix_instance_q31 pSrcA_converted; // input
  947. PyObject *pSrcB=NULL; // input
  948. arm_matrix_instance_q31 pSrcB_converted; // input
  949. PyObject *pState=NULL; // input
  950. q31_t *pState_converted=NULL; // input
  951. arm_matrix_instance_q31 pDst_converted;
  952. if (PyArg_ParseTuple(args,"OOO",&pSrcA,&pSrcB,&pState))
  953. {
  954. q31MatrixFromNumpy(&pSrcA_converted,pSrcA);
  955. q31MatrixFromNumpy(&pSrcB_converted,pSrcB);
  956. GETARGUMENT(pState,NPY_INT32,int32_t,int32_t);
  957. uint32_t row = pSrcA_converted.numRows ;
  958. uint32_t column = pSrcB_converted.numCols ;
  959. createq31Matrix(&pDst_converted,row,column);
  960. arm_status returnValue = arm_mat_mult_opt_q31(&pSrcA_converted,
  961. &pSrcB_converted,&pDst_converted,pState_converted);
  962. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  963. PyObject* pDstOBJ=NumpyArrayFromq31Matrix(&pDst_converted);
  964. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  965. Py_DECREF(theReturnOBJ);
  966. FREEMATRIX(&pSrcA_converted);
  967. FREEMATRIX(&pSrcB_converted);
  968. Py_DECREF(pDstOBJ);
  969. FREEARGUMENT(pState_converted);
  970. return(pythonResult);
  971. }
  972. Py_RETURN_NONE;
  973. }
  974. static PyObject *
  975. cmsis_arm_mat_mult_fast_q31(PyObject *obj, PyObject *args)
  976. {
  977. PyObject *pSrcA=NULL; // input
  978. arm_matrix_instance_q31 pSrcA_converted; // input
  979. PyObject *pSrcB=NULL; // input
  980. arm_matrix_instance_q31 pSrcB_converted; // input
  981. arm_matrix_instance_q31 pDst_converted;
  982. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  983. {
  984. q31MatrixFromNumpy(&pSrcA_converted,pSrcA);
  985. q31MatrixFromNumpy(&pSrcB_converted,pSrcB);
  986. uint32_t row = pSrcA_converted.numRows ;
  987. uint32_t column = pSrcB_converted.numCols ;
  988. createq31Matrix(&pDst_converted,row,column);
  989. arm_status returnValue = arm_mat_mult_fast_q31(&pSrcA_converted,
  990. &pSrcB_converted,&pDst_converted);
  991. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  992. PyObject* pDstOBJ=NumpyArrayFromq31Matrix(&pDst_converted);
  993. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  994. Py_DECREF(theReturnOBJ);
  995. FREEMATRIX(&pSrcA_converted);
  996. FREEMATRIX(&pSrcB_converted);
  997. Py_DECREF(pDstOBJ);
  998. return(pythonResult);
  999. }
  1000. Py_RETURN_NONE;
  1001. }
  1002. static PyObject *
  1003. cmsis_arm_mat_sub_f32(PyObject *obj, PyObject *args)
  1004. {
  1005. PyObject *pSrcA=NULL; // input
  1006. arm_matrix_instance_f32 pSrcA_converted; // input
  1007. PyObject *pSrcB=NULL; // input
  1008. arm_matrix_instance_f32 pSrcB_converted; // input
  1009. arm_matrix_instance_f32 pDst_converted;
  1010. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  1011. {
  1012. f32MatrixFromNumpy(&pSrcA_converted,pSrcA);
  1013. f32MatrixFromNumpy(&pSrcB_converted,pSrcB);
  1014. uint32_t row = pSrcA_converted.numRows ;
  1015. uint32_t column = pSrcB_converted.numCols ;
  1016. createf32Matrix(&pDst_converted,row,column);
  1017. arm_status returnValue = arm_mat_sub_f32(&pSrcA_converted,
  1018. &pSrcB_converted,&pDst_converted);
  1019. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1020. PyObject* pDstOBJ=NumpyArrayFromf32Matrix(&pDst_converted);
  1021. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1022. Py_DECREF(theReturnOBJ);
  1023. FREEMATRIX(&pSrcA_converted);
  1024. FREEMATRIX(&pSrcB_converted);
  1025. Py_DECREF(pDstOBJ);
  1026. return(pythonResult);
  1027. }
  1028. Py_RETURN_NONE;
  1029. }
  1030. static PyObject *
  1031. cmsis_arm_mat_sub_f64(PyObject *obj, PyObject *args)
  1032. {
  1033. PyObject *pSrcA=NULL; // input
  1034. arm_matrix_instance_f64 pSrcA_converted; // input
  1035. PyObject *pSrcB=NULL; // input
  1036. arm_matrix_instance_f64 pSrcB_converted; // input
  1037. arm_matrix_instance_f64 pDst_converted;
  1038. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  1039. {
  1040. f64MatrixFromNumpy(&pSrcA_converted,pSrcA);
  1041. f64MatrixFromNumpy(&pSrcB_converted,pSrcB);
  1042. uint32_t row = pSrcA_converted.numRows ;
  1043. uint32_t column = pSrcB_converted.numCols ;
  1044. createf64Matrix(&pDst_converted,row,column);
  1045. arm_status returnValue = arm_mat_sub_f64(&pSrcA_converted,
  1046. &pSrcB_converted,&pDst_converted);
  1047. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1048. PyObject* pDstOBJ=NumpyArrayFromf64Matrix(&pDst_converted);
  1049. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1050. Py_DECREF(theReturnOBJ);
  1051. FREEMATRIX(&pSrcA_converted);
  1052. FREEMATRIX(&pSrcB_converted);
  1053. Py_DECREF(pDstOBJ);
  1054. return(pythonResult);
  1055. }
  1056. Py_RETURN_NONE;
  1057. }
  1058. static PyObject *
  1059. cmsis_arm_mat_sub_q15(PyObject *obj, PyObject *args)
  1060. {
  1061. PyObject *pSrcA=NULL; // input
  1062. arm_matrix_instance_q15 pSrcA_converted; // input
  1063. PyObject *pSrcB=NULL; // input
  1064. arm_matrix_instance_q15 pSrcB_converted; // input
  1065. arm_matrix_instance_q15 pDst_converted;
  1066. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  1067. {
  1068. q15MatrixFromNumpy(&pSrcA_converted,pSrcA);
  1069. q15MatrixFromNumpy(&pSrcB_converted,pSrcB);
  1070. uint32_t row = pSrcA_converted.numRows ;
  1071. uint32_t column = pSrcB_converted.numCols ;
  1072. createq15Matrix(&pDst_converted,row,column);
  1073. arm_status returnValue = arm_mat_sub_q15(&pSrcA_converted,&pSrcB_converted,
  1074. &pDst_converted);
  1075. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1076. PyObject* pDstOBJ=NumpyArrayFromq15Matrix(&pDst_converted);
  1077. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1078. Py_DECREF(theReturnOBJ);
  1079. FREEMATRIX(&pSrcA_converted);
  1080. FREEMATRIX(&pSrcB_converted);
  1081. Py_DECREF(pDstOBJ);
  1082. return(pythonResult);
  1083. }
  1084. Py_RETURN_NONE;
  1085. }
  1086. static PyObject *
  1087. cmsis_arm_mat_sub_q31(PyObject *obj, PyObject *args)
  1088. {
  1089. PyObject *pSrcA=NULL; // input
  1090. arm_matrix_instance_q31 pSrcA_converted; // input
  1091. PyObject *pSrcB=NULL; // input
  1092. arm_matrix_instance_q31 pSrcB_converted; // input
  1093. arm_matrix_instance_q31 pDst_converted;
  1094. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  1095. {
  1096. q31MatrixFromNumpy(&pSrcA_converted,pSrcA);
  1097. q31MatrixFromNumpy(&pSrcB_converted,pSrcB);
  1098. uint32_t row = pSrcA_converted.numRows ;
  1099. uint32_t column = pSrcB_converted.numCols ;
  1100. createq31Matrix(&pDst_converted,row,column);
  1101. arm_status returnValue = arm_mat_sub_q31(&pSrcA_converted,
  1102. &pSrcB_converted,&pDst_converted);
  1103. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1104. PyObject* pDstOBJ=NumpyArrayFromq31Matrix(&pDst_converted);
  1105. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1106. Py_DECREF(theReturnOBJ);
  1107. FREEMATRIX(&pSrcA_converted);
  1108. FREEMATRIX(&pSrcB_converted);
  1109. Py_DECREF(pDstOBJ);
  1110. return(pythonResult);
  1111. }
  1112. Py_RETURN_NONE;
  1113. }
  1114. static PyObject *
  1115. cmsis_arm_mat_scale_f32(PyObject *obj, PyObject *args)
  1116. {
  1117. PyObject *pSrc=NULL; // input
  1118. arm_matrix_instance_f32 pSrc_converted; // input
  1119. float32_t scale; // input
  1120. arm_matrix_instance_f32 pDst_converted;
  1121. if (PyArg_ParseTuple(args,"Of",&pSrc,&scale))
  1122. {
  1123. f32MatrixFromNumpy(&pSrc_converted,pSrc);
  1124. uint32_t row = pSrc_converted.numRows ;
  1125. uint32_t column = pSrc_converted.numCols ;
  1126. createf32Matrix(&pDst_converted,row,column);
  1127. arm_status returnValue = arm_mat_scale_f32(&pSrc_converted,scale,&pDst_converted);
  1128. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1129. PyObject* pDstOBJ=NumpyArrayFromf32Matrix(&pDst_converted);
  1130. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1131. Py_DECREF(theReturnOBJ);
  1132. FREEMATRIX(&pSrc_converted);
  1133. Py_DECREF(pDstOBJ);
  1134. return(pythonResult);
  1135. }
  1136. Py_RETURN_NONE;
  1137. }
  1138. static PyObject *
  1139. cmsis_arm_mat_scale_q15(PyObject *obj, PyObject *args)
  1140. {
  1141. PyObject *pSrc=NULL; // input
  1142. arm_matrix_instance_q15 pSrc_converted; // input
  1143. q15_t scaleFract; // input
  1144. int32_t shift; // input
  1145. arm_matrix_instance_q15 pDst_converted;
  1146. if (PyArg_ParseTuple(args,"Ohi",&pSrc,&scaleFract,&shift))
  1147. {
  1148. q15MatrixFromNumpy(&pSrc_converted,pSrc);
  1149. uint32_t row = pSrc_converted.numRows ;
  1150. uint32_t column = pSrc_converted.numCols ;
  1151. createq15Matrix(&pDst_converted,row,column);
  1152. arm_status returnValue = arm_mat_scale_q15(&pSrc_converted,scaleFract,shift,&pDst_converted);
  1153. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1154. PyObject* pDstOBJ=NumpyArrayFromq15Matrix(&pDst_converted);
  1155. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1156. Py_DECREF(theReturnOBJ);
  1157. FREEMATRIX(&pSrc_converted);
  1158. Py_DECREF(pDstOBJ);
  1159. return(pythonResult);
  1160. }
  1161. Py_RETURN_NONE;
  1162. }
  1163. static PyObject *
  1164. cmsis_arm_mat_scale_q31(PyObject *obj, PyObject *args)
  1165. {
  1166. PyObject *pSrc=NULL; // input
  1167. arm_matrix_instance_q31 pSrc_converted; // input
  1168. q31_t scaleFract; // input
  1169. int32_t shift; // input
  1170. arm_matrix_instance_q31 pDst_converted;
  1171. if (PyArg_ParseTuple(args,"Oii",&pSrc,&scaleFract,&shift))
  1172. {
  1173. q31MatrixFromNumpy(&pSrc_converted,pSrc);
  1174. uint32_t row = pSrc_converted.numRows ;
  1175. uint32_t column = pSrc_converted.numCols ;
  1176. createq31Matrix(&pDst_converted,row,column);
  1177. arm_status returnValue = arm_mat_scale_q31(&pSrc_converted,scaleFract,shift,&pDst_converted);
  1178. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1179. PyObject* pDstOBJ=NumpyArrayFromq31Matrix(&pDst_converted);
  1180. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1181. Py_DECREF(theReturnOBJ);
  1182. FREEMATRIX(&pSrc_converted);
  1183. Py_DECREF(pDstOBJ);
  1184. return(pythonResult);
  1185. }
  1186. Py_RETURN_NONE;
  1187. }
  1188. static PyObject *
  1189. cmsis_arm_mat_qr_f64(PyObject *obj, PyObject *args)
  1190. {
  1191. PyObject *src=NULL;
  1192. arm_matrix_instance_f64 src_converted;
  1193. PyObject *pTmpaIn=NULL;
  1194. float64_t *pTmpaIn_converted=NULL;
  1195. PyObject *pTmpbIn=NULL;
  1196. float64_t *pTmpbIn_converted=NULL;
  1197. float64_t threshold;
  1198. arm_matrix_instance_f64 Q_converted;
  1199. arm_matrix_instance_f64 R_converted;
  1200. if (PyArg_ParseTuple(args,"OdOO",&src,&threshold,&pTmpaIn,&pTmpbIn))
  1201. {
  1202. f64MatrixFromNumpy(&src_converted,src);
  1203. uint64_t column = src_converted.numCols ;
  1204. uint64_t row = src_converted.numRows ;
  1205. GETARGUMENT(pTmpaIn,NPY_DOUBLE,double,float64_t);
  1206. GETARGUMENT(pTmpbIn,NPY_DOUBLE,double,float64_t);
  1207. int tmpALength=arraySizepTmpaIn ;
  1208. int tmpBLength=arraySizepTmpbIn ;
  1209. createf64Matrix(&Q_converted,row,row);
  1210. createf64Matrix(&R_converted,row,column);
  1211. float64_t *pTau=PyMem_Malloc(sizeof(float64_t)*column);
  1212. float64_t *pTmpa=PyMem_Malloc(sizeof(float64_t)*tmpALength);
  1213. float64_t *pTmpb=PyMem_Malloc(sizeof(float64_t)*tmpBLength);
  1214. arm_status returnValue = arm_mat_qr_f64(&src_converted,threshold,
  1215. &R_converted,&Q_converted,pTau,pTmpa,pTmpb);
  1216. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1217. PyObject* ROBJ=NumpyArrayFromf64Matrix(&R_converted);
  1218. PyObject* QOBJ=NumpyArrayFromf64Matrix(&Q_converted);
  1219. FLOAT64ARRAY1(pTauOBJ,column,pTau);
  1220. PyObject *pythonResult = Py_BuildValue("OOOO",theReturnOBJ,ROBJ,QOBJ,pTauOBJ);
  1221. Py_DECREF(theReturnOBJ);
  1222. Py_DECREF(ROBJ);
  1223. Py_DECREF(QOBJ);
  1224. Py_DECREF(pTauOBJ);
  1225. FREEMATRIX(&src_converted);
  1226. FREEARGUMENT(pTmpaIn_converted);
  1227. FREEARGUMENT(pTmpbIn_converted);
  1228. PyMem_Free(pTmpa);
  1229. PyMem_Free(pTmpb);
  1230. return(pythonResult);
  1231. }
  1232. Py_RETURN_NONE;
  1233. }
  1234. static PyObject *
  1235. cmsis_arm_mat_qr_f32(PyObject *obj, PyObject *args)
  1236. {
  1237. PyObject *src=NULL;
  1238. arm_matrix_instance_f32 src_converted;
  1239. PyObject *pTmpaIn=NULL;
  1240. float32_t *pTmpaIn_converted=NULL;
  1241. PyObject *pTmpbIn=NULL;
  1242. float32_t *pTmpbIn_converted=NULL;
  1243. float32_t threshold;
  1244. arm_matrix_instance_f32 Q_converted;
  1245. arm_matrix_instance_f32 R_converted;
  1246. if (PyArg_ParseTuple(args,"OfOO",&src,&threshold,&pTmpaIn,&pTmpbIn))
  1247. {
  1248. f32MatrixFromNumpy(&src_converted,src);
  1249. uint32_t column = src_converted.numCols ;
  1250. uint32_t row = src_converted.numRows ;
  1251. GETARGUMENT(pTmpaIn,NPY_DOUBLE,double,float32_t);
  1252. GETARGUMENT(pTmpbIn,NPY_DOUBLE,double,float32_t);
  1253. int tmpALength=arraySizepTmpaIn ;
  1254. int tmpBLength=arraySizepTmpbIn ;
  1255. createf32Matrix(&Q_converted,row,row);
  1256. createf32Matrix(&R_converted,row,column);
  1257. float32_t *pTau=PyMem_Malloc(sizeof(float32_t)*column);
  1258. float32_t *pTmpa=PyMem_Malloc(sizeof(float32_t)*tmpALength);
  1259. float32_t *pTmpb=PyMem_Malloc(sizeof(float32_t)*tmpBLength);
  1260. arm_status returnValue = arm_mat_qr_f32(&src_converted,threshold,
  1261. &R_converted,&Q_converted,pTau,pTmpa,pTmpb);
  1262. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1263. PyObject* ROBJ=NumpyArrayFromf32Matrix(&R_converted);
  1264. PyObject* QOBJ=NumpyArrayFromf32Matrix(&Q_converted);
  1265. FLOATARRAY1(pTauOBJ,column,pTau);
  1266. PyObject *pythonResult = Py_BuildValue("OOOO",theReturnOBJ,ROBJ,QOBJ,pTauOBJ);
  1267. Py_DECREF(theReturnOBJ);
  1268. Py_DECREF(ROBJ);
  1269. Py_DECREF(QOBJ);
  1270. Py_DECREF(pTauOBJ);
  1271. FREEMATRIX(&src_converted);
  1272. FREEARGUMENT(pTmpaIn_converted);
  1273. FREEARGUMENT(pTmpbIn_converted);
  1274. PyMem_Free(pTmpa);
  1275. PyMem_Free(pTmpb);
  1276. return(pythonResult);
  1277. }
  1278. Py_RETURN_NONE;
  1279. }
  1280. static PyObject *
  1281. cmsis_arm_householder_f64(PyObject *obj, PyObject *args)
  1282. {
  1283. PyObject *pSrc=NULL; // input
  1284. float64_t *pSrc_converted=NULL; // input
  1285. uint32_t blockSize; // input
  1286. float64_t pResult; // output
  1287. float64_t *pDst=NULL; // output
  1288. float64_t threshold;
  1289. if (PyArg_ParseTuple(args,"Od",&pSrc,&threshold))
  1290. {
  1291. GETARGUMENT(pSrc,NPY_DOUBLE,double,float64_t);
  1292. blockSize = arraySizepSrc ;
  1293. pDst=PyMem_Malloc(sizeof(float64_t)*blockSize);
  1294. pResult=arm_householder_f64(pSrc_converted,threshold,blockSize,pDst);
  1295. PyObject* pResultOBJ=Py_BuildValue("d",pResult);
  1296. FLOAT64ARRAY1(pDstOBJ,blockSize,pDst);
  1297. PyObject *betaResult = Py_BuildValue("O",pResultOBJ);
  1298. PyObject *vecResult = Py_BuildValue("O",pDstOBJ);
  1299. PyObject *pythonResult = Py_BuildValue("OO",betaResult,vecResult);
  1300. FREEARGUMENT(pSrc_converted);
  1301. Py_DECREF(pResultOBJ);
  1302. Py_DECREF(pDstOBJ);
  1303. return(pythonResult);
  1304. }
  1305. Py_RETURN_NONE;
  1306. }
  1307. static PyObject *
  1308. cmsis_arm_householder_f32(PyObject *obj, PyObject *args)
  1309. {
  1310. PyObject *pSrc=NULL; // input
  1311. float32_t *pSrc_converted=NULL; // input
  1312. uint32_t blockSize; // input
  1313. float32_t pResult; // output
  1314. float32_t *pDst=NULL; // output
  1315. float32_t threshold;
  1316. if (PyArg_ParseTuple(args,"Of",&pSrc,&threshold))
  1317. {
  1318. GETARGUMENT(pSrc,NPY_DOUBLE,double,float32_t);
  1319. blockSize = arraySizepSrc ;
  1320. pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
  1321. pResult=arm_householder_f32(pSrc_converted,threshold,blockSize,pDst);
  1322. PyObject* pResultOBJ=Py_BuildValue("f",pResult);
  1323. FLOATARRAY1(pDstOBJ,blockSize,pDst);
  1324. PyObject *betaResult = Py_BuildValue("O",pResultOBJ);
  1325. PyObject *vecResult = Py_BuildValue("O",pDstOBJ);
  1326. PyObject *pythonResult = Py_BuildValue("OO",betaResult,vecResult);
  1327. FREEARGUMENT(pSrc_converted);
  1328. Py_DECREF(pResultOBJ);
  1329. Py_DECREF(pDstOBJ);
  1330. return(pythonResult);
  1331. }
  1332. Py_RETURN_NONE;
  1333. }
  1334. static PyObject *
  1335. cmsis_arm_mat_inverse_f32(PyObject *obj, PyObject *args)
  1336. {
  1337. PyObject *src=NULL; // input
  1338. arm_matrix_instance_f32 src_converted; // input
  1339. arm_matrix_instance_f32 dst_converted;
  1340. if (PyArg_ParseTuple(args,"O",&src))
  1341. {
  1342. f32MatrixFromNumpy(&src_converted,src);
  1343. uint32_t row = src_converted.numCols ;
  1344. uint32_t column = src_converted.numRows ;
  1345. createf32Matrix(&dst_converted,row,column);
  1346. arm_status returnValue = arm_mat_inverse_f32(&src_converted,&dst_converted);
  1347. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1348. PyObject* dstOBJ=NumpyArrayFromf32Matrix(&dst_converted);
  1349. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,dstOBJ);
  1350. Py_DECREF(theReturnOBJ);
  1351. FREEMATRIX(&src_converted);
  1352. Py_DECREF(dstOBJ);
  1353. return(pythonResult);
  1354. }
  1355. Py_RETURN_NONE;
  1356. }
  1357. static PyObject *
  1358. cmsis_arm_mat_inverse_f64(PyObject *obj, PyObject *args)
  1359. {
  1360. PyObject *src=NULL; // input
  1361. arm_matrix_instance_f64 src_converted; // input
  1362. arm_matrix_instance_f64 dst_converted;
  1363. if (PyArg_ParseTuple(args,"O",&src))
  1364. {
  1365. f64MatrixFromNumpy(&src_converted,src);
  1366. uint32_t row = src_converted.numCols ;
  1367. uint32_t column = src_converted.numRows ;
  1368. createf64Matrix(&dst_converted,row,column);
  1369. arm_status returnValue = arm_mat_inverse_f64(&src_converted,&dst_converted);
  1370. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1371. PyObject* dstOBJ=NumpyArrayFromf64Matrix(&dst_converted);
  1372. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,dstOBJ);
  1373. Py_DECREF(theReturnOBJ);
  1374. FREEMATRIX(&src_converted);
  1375. Py_DECREF(dstOBJ);
  1376. return(pythonResult);
  1377. }
  1378. Py_RETURN_NONE;
  1379. }
  1380. static PyObject *
  1381. cmsis_arm_mat_cholesky_f32(PyObject *obj, PyObject *args)
  1382. {
  1383. PyObject *src=NULL; // input
  1384. arm_matrix_instance_f32 src_converted; // input
  1385. arm_matrix_instance_f32 dst_converted;
  1386. if (PyArg_ParseTuple(args,"O",&src))
  1387. {
  1388. f32MatrixFromNumpy(&src_converted,src);
  1389. uint32_t column = src_converted.numCols ;
  1390. uint32_t row = src_converted.numRows ;
  1391. createf32Matrix(&dst_converted,row,column);
  1392. arm_status returnValue = arm_mat_cholesky_f32(&src_converted,&dst_converted);
  1393. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1394. PyObject* dstOBJ=NumpyArrayFromf32Matrix(&dst_converted);
  1395. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,dstOBJ);
  1396. Py_DECREF(theReturnOBJ);
  1397. FREEMATRIX(&src_converted);
  1398. Py_DECREF(dstOBJ);
  1399. return(pythonResult);
  1400. }
  1401. Py_RETURN_NONE;
  1402. }
  1403. static PyObject *
  1404. cmsis_arm_mat_cholesky_f64(PyObject *obj, PyObject *args)
  1405. {
  1406. PyObject *src=NULL; // input
  1407. arm_matrix_instance_f64 src_converted; // input
  1408. arm_matrix_instance_f64 dst_converted;
  1409. if (PyArg_ParseTuple(args,"O",&src))
  1410. {
  1411. f64MatrixFromNumpy(&src_converted,src);
  1412. uint32_t column = src_converted.numCols ;
  1413. uint32_t row = src_converted.numRows ;
  1414. createf64Matrix(&dst_converted,row,column);
  1415. arm_status returnValue = arm_mat_cholesky_f64(&src_converted,&dst_converted);
  1416. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1417. PyObject* dstOBJ=NumpyArrayFromf64Matrix(&dst_converted);
  1418. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,dstOBJ);
  1419. Py_DECREF(theReturnOBJ);
  1420. FREEMATRIX(&src_converted);
  1421. Py_DECREF(dstOBJ);
  1422. return(pythonResult);
  1423. }
  1424. Py_RETURN_NONE;
  1425. }
  1426. static PyObject *
  1427. cmsis_arm_mat_ldlt_f32(PyObject *obj, PyObject *args)
  1428. {
  1429. PyObject *src=NULL; // input
  1430. arm_matrix_instance_f32 src_converted; // input
  1431. arm_matrix_instance_f32 l_converted;
  1432. arm_matrix_instance_f32 d_converted;
  1433. if (PyArg_ParseTuple(args,"O",&src))
  1434. {
  1435. f32MatrixFromNumpy(&src_converted,src);
  1436. uint32_t column = src_converted.numCols ;
  1437. uint32_t row = src_converted.numRows ;
  1438. createf32Matrix(&l_converted,row,column);
  1439. createf32Matrix(&d_converted,row,column);
  1440. uint16_t *pPerm=(uint16_t *)PyMem_Malloc(sizeof(uint16_t)*row);
  1441. INT16ARRAY1(pPermOBJ,row,pPerm);
  1442. arm_status returnValue = arm_mat_ldlt_f32(&src_converted,&l_converted,&d_converted,pPerm);
  1443. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1444. PyObject* lOBJ=NumpyArrayFromf32Matrix(&l_converted);
  1445. PyObject* dOBJ=NumpyArrayFromf32Matrix(&d_converted);
  1446. PyObject *pythonResult = Py_BuildValue("OOOO",theReturnOBJ,lOBJ,dOBJ,pPermOBJ);
  1447. Py_DECREF(theReturnOBJ);
  1448. FREEMATRIX(&src_converted);
  1449. Py_DECREF(lOBJ);
  1450. Py_DECREF(dOBJ);
  1451. Py_DECREF(pPermOBJ);
  1452. return(pythonResult);
  1453. }
  1454. Py_RETURN_NONE;
  1455. }
  1456. static PyObject *
  1457. cmsis_arm_mat_ldlt_f64(PyObject *obj, PyObject *args)
  1458. {
  1459. PyObject *src=NULL; // input
  1460. arm_matrix_instance_f64 src_converted; // input
  1461. arm_matrix_instance_f64 l_converted;
  1462. arm_matrix_instance_f64 d_converted;
  1463. if (PyArg_ParseTuple(args,"O",&src))
  1464. {
  1465. f64MatrixFromNumpy(&src_converted,src);
  1466. uint32_t column = src_converted.numCols ;
  1467. uint32_t row = src_converted.numRows ;
  1468. createf64Matrix(&l_converted,row,column);
  1469. createf64Matrix(&d_converted,row,column);
  1470. uint16_t *pPerm=(uint16_t *)PyMem_Malloc(sizeof(uint16_t)*row);
  1471. INT16ARRAY1(pPermOBJ,row,pPerm);
  1472. arm_status returnValue = arm_mat_ldlt_f64(&src_converted,&l_converted,&d_converted,pPerm);
  1473. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1474. PyObject* lOBJ=NumpyArrayFromf64Matrix(&l_converted);
  1475. PyObject* dOBJ=NumpyArrayFromf64Matrix(&d_converted);
  1476. PyObject *pythonResult = Py_BuildValue("OOOO",theReturnOBJ,lOBJ,dOBJ,pPermOBJ);
  1477. Py_DECREF(theReturnOBJ);
  1478. FREEMATRIX(&src_converted);
  1479. Py_DECREF(lOBJ);
  1480. Py_DECREF(dOBJ);
  1481. Py_DECREF(pPermOBJ);
  1482. return(pythonResult);
  1483. }
  1484. Py_RETURN_NONE;
  1485. }
  1486. static PyObject *
  1487. cmsis_arm_mat_solve_lower_triangular_f32(PyObject *obj, PyObject *args)
  1488. {
  1489. PyObject *pSrcA=NULL; // input
  1490. arm_matrix_instance_f32 pSrcA_converted; // input
  1491. PyObject *pSrcB=NULL; // input
  1492. arm_matrix_instance_f32 pSrcB_converted; // input
  1493. arm_matrix_instance_f32 pDst_converted;
  1494. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  1495. {
  1496. f32MatrixFromNumpy(&pSrcA_converted,pSrcA);
  1497. f32MatrixFromNumpy(&pSrcB_converted,pSrcB);
  1498. uint32_t column = pSrcB_converted.numCols ;
  1499. uint32_t row = pSrcA_converted.numRows ;
  1500. createf32Matrix(&pDst_converted,row,column);
  1501. arm_status returnValue = arm_mat_solve_lower_triangular_f32(&pSrcA_converted,
  1502. &pSrcB_converted,&pDst_converted);
  1503. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1504. PyObject* pDstOBJ=NumpyArrayFromf32Matrix(&pDst_converted);
  1505. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1506. Py_DECREF(theReturnOBJ);
  1507. FREEMATRIX(&pSrcA_converted);
  1508. FREEMATRIX(&pSrcB_converted);
  1509. Py_DECREF(pDstOBJ);
  1510. return(pythonResult);
  1511. }
  1512. Py_RETURN_NONE;
  1513. }
  1514. static PyObject *
  1515. cmsis_arm_mat_solve_lower_triangular_f64(PyObject *obj, PyObject *args)
  1516. {
  1517. PyObject *pSrcA=NULL; // input
  1518. arm_matrix_instance_f64 pSrcA_converted; // input
  1519. PyObject *pSrcB=NULL; // input
  1520. arm_matrix_instance_f64 pSrcB_converted; // input
  1521. arm_matrix_instance_f64 pDst_converted;
  1522. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  1523. {
  1524. f64MatrixFromNumpy(&pSrcA_converted,pSrcA);
  1525. f64MatrixFromNumpy(&pSrcB_converted,pSrcB);
  1526. uint32_t column = pSrcB_converted.numCols ;
  1527. uint32_t row = pSrcA_converted.numRows ;
  1528. createf64Matrix(&pDst_converted,row,column);
  1529. arm_status returnValue = arm_mat_solve_lower_triangular_f64(&pSrcA_converted,
  1530. &pSrcB_converted,&pDst_converted);
  1531. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1532. PyObject* pDstOBJ=NumpyArrayFromf64Matrix(&pDst_converted);
  1533. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1534. Py_DECREF(theReturnOBJ);
  1535. FREEMATRIX(&pSrcA_converted);
  1536. FREEMATRIX(&pSrcB_converted);
  1537. Py_DECREF(pDstOBJ);
  1538. return(pythonResult);
  1539. }
  1540. Py_RETURN_NONE;
  1541. }
  1542. static PyObject *
  1543. cmsis_arm_mat_solve_upper_triangular_f32(PyObject *obj, PyObject *args)
  1544. {
  1545. PyObject *pSrcA=NULL; // input
  1546. arm_matrix_instance_f32 pSrcA_converted; // input
  1547. PyObject *pSrcB=NULL; // input
  1548. arm_matrix_instance_f32 pSrcB_converted; // input
  1549. arm_matrix_instance_f32 pDst_converted;
  1550. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  1551. {
  1552. f32MatrixFromNumpy(&pSrcA_converted,pSrcA);
  1553. f32MatrixFromNumpy(&pSrcB_converted,pSrcB);
  1554. uint32_t column = pSrcB_converted.numCols ;
  1555. uint32_t row = pSrcA_converted.numRows ;
  1556. createf32Matrix(&pDst_converted,row,column);
  1557. arm_status returnValue = arm_mat_solve_upper_triangular_f32(&pSrcA_converted,
  1558. &pSrcB_converted,&pDst_converted);
  1559. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1560. PyObject* pDstOBJ=NumpyArrayFromf32Matrix(&pDst_converted);
  1561. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1562. Py_DECREF(theReturnOBJ);
  1563. FREEMATRIX(&pSrcA_converted);
  1564. FREEMATRIX(&pSrcB_converted);
  1565. Py_DECREF(pDstOBJ);
  1566. return(pythonResult);
  1567. }
  1568. Py_RETURN_NONE;
  1569. }
  1570. static PyObject *
  1571. cmsis_arm_mat_solve_upper_triangular_f64(PyObject *obj, PyObject *args)
  1572. {
  1573. PyObject *pSrcA=NULL; // input
  1574. arm_matrix_instance_f64 pSrcA_converted; // input
  1575. PyObject *pSrcB=NULL; // input
  1576. arm_matrix_instance_f64 pSrcB_converted; // input
  1577. arm_matrix_instance_f64 pDst_converted;
  1578. if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
  1579. {
  1580. f64MatrixFromNumpy(&pSrcA_converted,pSrcA);
  1581. f64MatrixFromNumpy(&pSrcB_converted,pSrcB);
  1582. uint32_t column = pSrcB_converted.numCols ;
  1583. uint32_t row = pSrcA_converted.numRows ;
  1584. createf64Matrix(&pDst_converted,row,column);
  1585. arm_status returnValue = arm_mat_solve_upper_triangular_f64(&pSrcA_converted,
  1586. &pSrcB_converted,&pDst_converted);
  1587. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  1588. PyObject* pDstOBJ=NumpyArrayFromf64Matrix(&pDst_converted);
  1589. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pDstOBJ);
  1590. Py_DECREF(theReturnOBJ);
  1591. FREEMATRIX(&pSrcA_converted);
  1592. FREEMATRIX(&pSrcB_converted);
  1593. Py_DECREF(pDstOBJ);
  1594. return(pythonResult);
  1595. }
  1596. Py_RETURN_NONE;
  1597. }
  1598. static PyMethodDef CMSISDSPMethods[] = {
  1599. {"arm_mat_add_f32", cmsis_arm_mat_add_f32, METH_VARARGS,""},
  1600. {"arm_mat_add_q15", cmsis_arm_mat_add_q15, METH_VARARGS,""},
  1601. {"arm_mat_add_q31", cmsis_arm_mat_add_q31, METH_VARARGS,""},
  1602. {"arm_mat_cmplx_mult_f32", cmsis_arm_mat_cmplx_mult_f32, METH_VARARGS,""},
  1603. {"arm_mat_cmplx_mult_q15", cmsis_arm_mat_cmplx_mult_q15, METH_VARARGS,""},
  1604. {"arm_mat_cmplx_mult_q31", cmsis_arm_mat_cmplx_mult_q31, METH_VARARGS,""},
  1605. {"arm_mat_trans_f32", cmsis_arm_mat_trans_f32, METH_VARARGS,""},
  1606. {"arm_mat_trans_f64", cmsis_arm_mat_trans_f64, METH_VARARGS,""},
  1607. {"arm_mat_trans_q15", cmsis_arm_mat_trans_q15, METH_VARARGS,""},
  1608. {"arm_mat_trans_q31", cmsis_arm_mat_trans_q31, METH_VARARGS,""},
  1609. {"arm_mat_trans_q7", cmsis_arm_mat_trans_q7, METH_VARARGS,""},
  1610. {"arm_mat_vec_mult_f32", cmsis_arm_mat_vec_mult_f32, METH_VARARGS,""},
  1611. {"arm_mat_vec_mult_q31", cmsis_arm_mat_vec_mult_q31, METH_VARARGS,""},
  1612. {"arm_mat_vec_mult_q15", cmsis_arm_mat_vec_mult_q15, METH_VARARGS,""},
  1613. {"arm_mat_vec_mult_q7", cmsis_arm_mat_vec_mult_q7, METH_VARARGS,""},
  1614. {"arm_mat_mult_f32", cmsis_arm_mat_mult_f32, METH_VARARGS,""},
  1615. {"arm_mat_mult_f64", cmsis_arm_mat_mult_f32, METH_VARARGS,""},
  1616. {"arm_mat_mult_q7", cmsis_arm_mat_mult_q7, METH_VARARGS,""},
  1617. {"arm_mat_mult_q15", cmsis_arm_mat_mult_q15, METH_VARARGS,""},
  1618. {"arm_mat_mult_fast_q15", cmsis_arm_mat_mult_fast_q15, METH_VARARGS,""},
  1619. {"arm_mat_mult_q31", cmsis_arm_mat_mult_q31, METH_VARARGS,""},
  1620. {"arm_mat_mult_opt_q31", cmsis_arm_mat_mult_opt_q31, METH_VARARGS,""},
  1621. {"arm_mat_mult_fast_q31", cmsis_arm_mat_mult_fast_q31, METH_VARARGS,""},
  1622. {"arm_mat_sub_f32", cmsis_arm_mat_sub_f32, METH_VARARGS,""},
  1623. {"arm_mat_sub_f64", cmsis_arm_mat_sub_f64, METH_VARARGS,""},
  1624. {"arm_mat_sub_q15", cmsis_arm_mat_sub_q15, METH_VARARGS,""},
  1625. {"arm_mat_sub_q31", cmsis_arm_mat_sub_q31, METH_VARARGS,""},
  1626. {"arm_mat_scale_f32", cmsis_arm_mat_scale_f32, METH_VARARGS,""},
  1627. {"arm_mat_scale_q15", cmsis_arm_mat_scale_q15, METH_VARARGS,""},
  1628. {"arm_mat_scale_q31", cmsis_arm_mat_scale_q31, METH_VARARGS,""},
  1629. {"arm_mat_inverse_f32", cmsis_arm_mat_inverse_f32, METH_VARARGS,""},
  1630. {"arm_mat_inverse_f64", cmsis_arm_mat_inverse_f64, METH_VARARGS,""},
  1631. {"arm_mat_cmplx_trans_f32", cmsis_arm_mat_cmplx_trans_f32, METH_VARARGS,""},
  1632. {"arm_mat_cmplx_trans_q31", cmsis_arm_mat_cmplx_trans_q31, METH_VARARGS,""},
  1633. {"arm_mat_cmplx_trans_q15", cmsis_arm_mat_cmplx_trans_q15, METH_VARARGS,""},
  1634. {"arm_mat_cholesky_f32", cmsis_arm_mat_cholesky_f32, METH_VARARGS,""},
  1635. {"arm_mat_cholesky_f64", cmsis_arm_mat_cholesky_f64, METH_VARARGS,""},
  1636. {"arm_mat_ldlt_f32", cmsis_arm_mat_ldlt_f32, METH_VARARGS,""},
  1637. {"arm_mat_ldlt_f64", cmsis_arm_mat_ldlt_f64, METH_VARARGS,""},
  1638. {"arm_mat_solve_lower_triangular_f32", cmsis_arm_mat_solve_lower_triangular_f32, METH_VARARGS,""},
  1639. {"arm_mat_solve_lower_triangular_f64", cmsis_arm_mat_solve_lower_triangular_f64, METH_VARARGS,""},
  1640. {"arm_mat_solve_upper_triangular_f32", cmsis_arm_mat_solve_upper_triangular_f32, METH_VARARGS,""},
  1641. {"arm_mat_solve_upper_triangular_f64", cmsis_arm_mat_solve_upper_triangular_f64, METH_VARARGS,""},
  1642. {"arm_householder_f32", cmsis_arm_householder_f32, METH_VARARGS,""},
  1643. {"arm_householder_f64", cmsis_arm_householder_f64, METH_VARARGS,""},
  1644. {"arm_mat_qr_f32", cmsis_arm_mat_qr_f32, METH_VARARGS,""},
  1645. {"arm_mat_qr_f64", cmsis_arm_mat_qr_f64, METH_VARARGS,""},
  1646. {"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},
  1647. {NULL, NULL, 0, NULL} /* Sentinel */
  1648. };
  1649. #ifdef IS_PY3K
  1650. static int cmsisdsp_traverse(PyObject *m, visitproc visit, void *arg) {
  1651. Py_VISIT(GETSTATE(m)->error);
  1652. return 0;
  1653. }
  1654. static int cmsisdsp_clear(PyObject *m) {
  1655. Py_CLEAR(GETSTATE(m)->error);
  1656. return 0;
  1657. }
  1658. static struct PyModuleDef moduledef = {
  1659. PyModuleDef_HEAD_INIT,
  1660. MODNAME,
  1661. NULL,
  1662. sizeof(struct module_state),
  1663. CMSISDSPMethods,
  1664. NULL,
  1665. cmsisdsp_traverse,
  1666. cmsisdsp_clear,
  1667. NULL
  1668. };
  1669. #define INITERROR return NULL
  1670. PyMODINIT_FUNC
  1671. CAT(PyInit_,MODINITNAME)(void)
  1672. #else
  1673. #define INITERROR return
  1674. void CAT(init,MODINITNAME)(void)
  1675. #endif
  1676. {
  1677. import_array();
  1678. #ifdef IS_PY3K
  1679. PyObject *module = PyModule_Create(&moduledef);
  1680. #else
  1681. PyObject *module = Py_InitModule(MODNAME, CMSISDSPMethods);
  1682. #endif
  1683. if (module == NULL)
  1684. INITERROR;
  1685. struct module_state *st = GETSTATE(module);
  1686. st->error = PyErr_NewException(MODNAME".Error", NULL, NULL);
  1687. if (st->error == NULL) {
  1688. Py_DECREF(module);
  1689. INITERROR;
  1690. }
  1691. typeRegistration(module);
  1692. #ifdef IS_PY3K
  1693. return module;
  1694. #endif
  1695. }