cmsisdsp_fastmath.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  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_fastmath"
  29. #define MODINITNAME cmsisdsp_fastmath
  30. #include "cmsisdsp_module.h"
  31. NUMPYVECTORFROMBUFFER(f32,float32_t,NPY_FLOAT);
  32. void typeRegistration(PyObject *module) {
  33. }
  34. static PyObject *
  35. cmsis_arm_vlog_q15(PyObject *obj, PyObject *args)
  36. {
  37. PyObject *pSrc=NULL; // input
  38. q15_t *pSrc_converted=NULL; // input
  39. q15_t *pDst=NULL; // output
  40. uint32_t blockSize; // input
  41. if (PyArg_ParseTuple(args,"O",&pSrc))
  42. {
  43. GETARGUMENT(pSrc,NPY_INT16,int16_t,int16_t);
  44. blockSize = arraySizepSrc ;
  45. pDst=PyMem_Malloc(sizeof(q15_t)*blockSize);
  46. arm_vlog_q15(pSrc_converted,pDst,blockSize);
  47. INT16ARRAY1(pDstOBJ,blockSize,pDst);
  48. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  49. FREEARGUMENT(pSrc_converted);
  50. Py_DECREF(pDstOBJ);
  51. return(pythonResult);
  52. }
  53. return(NULL);
  54. }
  55. static PyObject *
  56. cmsis_arm_vlog_q31(PyObject *obj, PyObject *args)
  57. {
  58. PyObject *pSrc=NULL; // input
  59. q31_t *pSrc_converted=NULL; // input
  60. q31_t *pDst=NULL; // output
  61. uint32_t blockSize; // input
  62. if (PyArg_ParseTuple(args,"O",&pSrc))
  63. {
  64. GETARGUMENT(pSrc,NPY_INT32,int32_t,int32_t);
  65. blockSize = arraySizepSrc ;
  66. pDst=PyMem_Malloc(sizeof(q31_t)*blockSize);
  67. arm_vlog_q31(pSrc_converted,pDst,blockSize);
  68. INT32ARRAY1(pDstOBJ,blockSize,pDst);
  69. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  70. FREEARGUMENT(pSrc_converted);
  71. Py_DECREF(pDstOBJ);
  72. return(pythonResult);
  73. }
  74. return(NULL);
  75. }
  76. static PyObject *
  77. cmsis_arm_sin_f32(PyObject *obj, PyObject *args)
  78. {
  79. float32_t x; // input
  80. if (PyArg_ParseTuple(args,"f",&x))
  81. {
  82. float32_t returnValue = arm_sin_f32(x);
  83. PyObject* theReturnOBJ=Py_BuildValue("f",returnValue);
  84. PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
  85. Py_DECREF(theReturnOBJ);
  86. return(pythonResult);
  87. }
  88. return(NULL);
  89. }
  90. static PyObject *
  91. cmsis_arm_sin_q31(PyObject *obj, PyObject *args)
  92. {
  93. q31_t x; // input
  94. if (PyArg_ParseTuple(args,"i",&x))
  95. {
  96. q31_t returnValue = arm_sin_q31(x);
  97. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  98. PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
  99. Py_DECREF(theReturnOBJ);
  100. return(pythonResult);
  101. }
  102. return(NULL);
  103. }
  104. static PyObject *
  105. cmsis_arm_sin_q15(PyObject *obj, PyObject *args)
  106. {
  107. q15_t x; // input
  108. if (PyArg_ParseTuple(args,"h",&x))
  109. {
  110. q15_t returnValue = arm_sin_q15(x);
  111. PyObject* theReturnOBJ=Py_BuildValue("h",returnValue);
  112. PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
  113. Py_DECREF(theReturnOBJ);
  114. return(pythonResult);
  115. }
  116. return(NULL);
  117. }
  118. static PyObject *
  119. cmsis_arm_cos_f32(PyObject *obj, PyObject *args)
  120. {
  121. float32_t x; // input
  122. if (PyArg_ParseTuple(args,"f",&x))
  123. {
  124. float32_t returnValue = arm_cos_f32(x);
  125. PyObject* theReturnOBJ=Py_BuildValue("f",returnValue);
  126. PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
  127. Py_DECREF(theReturnOBJ);
  128. return(pythonResult);
  129. }
  130. return(NULL);
  131. }
  132. static PyObject *
  133. cmsis_arm_cos_q31(PyObject *obj, PyObject *args)
  134. {
  135. q31_t x; // input
  136. if (PyArg_ParseTuple(args,"i",&x))
  137. {
  138. q31_t returnValue = arm_cos_q31(x);
  139. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  140. PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
  141. Py_DECREF(theReturnOBJ);
  142. return(pythonResult);
  143. }
  144. return(NULL);
  145. }
  146. static PyObject *
  147. cmsis_arm_cos_q15(PyObject *obj, PyObject *args)
  148. {
  149. q15_t x; // input
  150. if (PyArg_ParseTuple(args,"h",&x))
  151. {
  152. q15_t returnValue = arm_cos_q15(x);
  153. PyObject* theReturnOBJ=Py_BuildValue("h",returnValue);
  154. PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
  155. Py_DECREF(theReturnOBJ);
  156. return(pythonResult);
  157. }
  158. return(NULL);
  159. }
  160. static PyObject *
  161. cmsis_arm_sqrt_f32(PyObject *obj, PyObject *args)
  162. {
  163. float32_t in; // input
  164. float32_t pOut; // output
  165. if (PyArg_ParseTuple(args,"f",&in))
  166. {
  167. arm_status returnValue = arm_sqrt_f32(in,&pOut);
  168. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  169. PyObject* pOutOBJ=Py_BuildValue("f",pOut);
  170. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pOutOBJ);
  171. Py_DECREF(theReturnOBJ);
  172. Py_DECREF(pOutOBJ);
  173. return(pythonResult);
  174. }
  175. return(NULL);
  176. }
  177. static PyObject *
  178. cmsis_arm_sqrt_q31(PyObject *obj, PyObject *args)
  179. {
  180. q31_t in; // input
  181. q31_t pOut; // output
  182. if (PyArg_ParseTuple(args,"i",&in))
  183. {
  184. arm_status returnValue = arm_sqrt_q31(in,&pOut);
  185. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  186. PyObject* pOutOBJ=Py_BuildValue("i",pOut);
  187. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pOutOBJ);
  188. Py_DECREF(theReturnOBJ);
  189. Py_DECREF(pOutOBJ);
  190. return(pythonResult);
  191. }
  192. return(NULL);
  193. }
  194. static PyObject *
  195. cmsis_arm_divide_q31(PyObject *obj, PyObject *args)
  196. {
  197. q31_t num,den; // input
  198. q31_t pOut;
  199. int16_t shift; // output
  200. if (PyArg_ParseTuple(args,"ii",&num,&den))
  201. {
  202. arm_status returnValue = arm_divide_q31(num,den,&pOut,&shift);
  203. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  204. PyObject* pOutOBJ=Py_BuildValue("i",pOut);
  205. PyObject* pShiftOBJ=Py_BuildValue("h",shift);
  206. PyObject *pythonResult = Py_BuildValue("OOO",theReturnOBJ,pOutOBJ,pShiftOBJ);
  207. Py_DECREF(theReturnOBJ);
  208. Py_DECREF(pOutOBJ);
  209. Py_DECREF(pShiftOBJ);
  210. return(pythonResult);
  211. }
  212. return(NULL);
  213. }
  214. static PyObject *
  215. cmsis_arm_divide_q15(PyObject *obj, PyObject *args)
  216. {
  217. q15_t num,den; // input
  218. q15_t pOut;
  219. int16_t shift; // output
  220. if (PyArg_ParseTuple(args,"hh",&num,&den))
  221. {
  222. arm_status returnValue = arm_divide_q15(num,den,&pOut,&shift);
  223. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  224. PyObject* pOutOBJ=Py_BuildValue("h",pOut);
  225. PyObject* pShiftOBJ=Py_BuildValue("h",shift);
  226. PyObject *pythonResult = Py_BuildValue("OOO",theReturnOBJ,pOutOBJ,pShiftOBJ);
  227. Py_DECREF(theReturnOBJ);
  228. Py_DECREF(pOutOBJ);
  229. Py_DECREF(pShiftOBJ);
  230. return(pythonResult);
  231. }
  232. return(NULL);
  233. }
  234. static PyObject *
  235. cmsis_arm_sqrt_q15(PyObject *obj, PyObject *args)
  236. {
  237. q15_t in; // input
  238. q15_t pOut; // output
  239. if (PyArg_ParseTuple(args,"h",&in))
  240. {
  241. arm_status returnValue = arm_sqrt_q15(in,&pOut);
  242. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  243. PyObject* pOutOBJ=Py_BuildValue("h",pOut);
  244. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pOutOBJ);
  245. Py_DECREF(theReturnOBJ);
  246. Py_DECREF(pOutOBJ);
  247. return(pythonResult);
  248. }
  249. return(NULL);
  250. }
  251. static PyObject *
  252. cmsis_arm_vexp_f32(PyObject *obj, PyObject *args)
  253. {
  254. PyObject *pSrc=NULL; // input
  255. float32_t *pSrc_converted=NULL; // input
  256. float32_t *pDst=NULL; // output
  257. uint32_t blockSize; // input
  258. if (PyArg_ParseTuple(args,"O",&pSrc))
  259. {
  260. GETARGUMENT(pSrc,NPY_DOUBLE,double,float32_t);
  261. blockSize = arraySizepSrc ;
  262. pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
  263. arm_vexp_f32(pSrc_converted,pDst,blockSize);
  264. FLOATARRAY1(pDstOBJ,blockSize,pDst);
  265. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  266. FREEARGUMENT(pSrc_converted);
  267. Py_DECREF(pDstOBJ);
  268. return(pythonResult);
  269. }
  270. return(NULL);
  271. }
  272. static PyObject *
  273. cmsis_arm_vexp_f64(PyObject *obj, PyObject *args)
  274. {
  275. PyObject *pSrc=NULL; // input
  276. float64_t *pSrc_converted=NULL; // input
  277. float64_t *pDst=NULL; // output
  278. uint32_t blockSize; // input
  279. if (PyArg_ParseTuple(args,"O",&pSrc))
  280. {
  281. GETARGUMENT(pSrc,NPY_DOUBLE,double,float64_t);
  282. blockSize = arraySizepSrc ;
  283. pDst=PyMem_Malloc(sizeof(float64_t)*blockSize);
  284. arm_vexp_f64(pSrc_converted,pDst,blockSize);
  285. FLOAT64ARRAY1(pDstOBJ,blockSize,pDst);
  286. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  287. FREEARGUMENT(pSrc_converted);
  288. Py_DECREF(pDstOBJ);
  289. return(pythonResult);
  290. }
  291. return(NULL);
  292. }
  293. static PyObject *
  294. cmsis_arm_vlog_f32(PyObject *obj, PyObject *args)
  295. {
  296. PyObject *pSrc=NULL; // input
  297. float32_t *pSrc_converted=NULL; // input
  298. float32_t *pDst=NULL; // output
  299. uint32_t blockSize; // input
  300. if (PyArg_ParseTuple(args,"O",&pSrc))
  301. {
  302. GETARGUMENT(pSrc,NPY_DOUBLE,double,float32_t);
  303. blockSize = arraySizepSrc ;
  304. pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
  305. arm_vlog_f32(pSrc_converted,pDst,blockSize);
  306. FLOATARRAY1(pDstOBJ,blockSize,pDst);
  307. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  308. FREEARGUMENT(pSrc_converted);
  309. Py_DECREF(pDstOBJ);
  310. return(pythonResult);
  311. }
  312. return(NULL);
  313. }
  314. static PyObject *
  315. cmsis_arm_vlog_f64(PyObject *obj, PyObject *args)
  316. {
  317. PyObject *pSrc=NULL; // input
  318. float64_t *pSrc_converted=NULL; // input
  319. float64_t *pDst=NULL; // output
  320. uint32_t blockSize; // input
  321. if (PyArg_ParseTuple(args,"O",&pSrc))
  322. {
  323. GETARGUMENT(pSrc,NPY_DOUBLE,double,float64_t);
  324. blockSize = arraySizepSrc ;
  325. pDst=PyMem_Malloc(sizeof(float64_t)*blockSize);
  326. arm_vlog_f64(pSrc_converted,pDst,blockSize);
  327. FLOAT64ARRAY1(pDstOBJ,blockSize,pDst);
  328. PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
  329. FREEARGUMENT(pSrc_converted);
  330. Py_DECREF(pDstOBJ);
  331. return(pythonResult);
  332. }
  333. return(NULL);
  334. }
  335. static PyObject *
  336. cmsis_arm_atan2_q31(PyObject *obj, PyObject *args)
  337. {
  338. q31_t x,y; // input
  339. q31_t pOut;
  340. if (PyArg_ParseTuple(args,"ii",&y,&x))
  341. {
  342. arm_status returnValue = arm_atan2_q31(y,x,&pOut);
  343. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  344. PyObject* pOutOBJ=Py_BuildValue("i",pOut);
  345. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pOutOBJ);
  346. Py_DECREF(theReturnOBJ);
  347. Py_DECREF(pOutOBJ);
  348. return(pythonResult);
  349. }
  350. return(NULL);
  351. }
  352. static PyObject *
  353. cmsis_arm_atan2_q15(PyObject *obj, PyObject *args)
  354. {
  355. q15_t x,y; // input
  356. q15_t pOut;
  357. if (PyArg_ParseTuple(args,"hh",&y,&x))
  358. {
  359. arm_status returnValue = arm_atan2_q15(y,x,&pOut);
  360. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  361. PyObject* pOutOBJ=Py_BuildValue("h",pOut);
  362. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pOutOBJ);
  363. Py_DECREF(theReturnOBJ);
  364. Py_DECREF(pOutOBJ);
  365. return(pythonResult);
  366. }
  367. return(NULL);
  368. }
  369. static PyObject *
  370. cmsis_arm_atan2_f32(PyObject *obj, PyObject *args)
  371. {
  372. float32_t x,y; // input
  373. float32_t pOut;
  374. if (PyArg_ParseTuple(args,"ff",&y,&x))
  375. {
  376. arm_status returnValue = arm_atan2_f32(y,x,&pOut);
  377. PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
  378. PyObject* pOutOBJ=Py_BuildValue("f",pOut);
  379. PyObject *pythonResult = Py_BuildValue("OO",theReturnOBJ,pOutOBJ);
  380. Py_DECREF(theReturnOBJ);
  381. Py_DECREF(pOutOBJ);
  382. return(pythonResult);
  383. }
  384. return(NULL);
  385. }
  386. static PyMethodDef CMSISDSPMethods[] = {
  387. {"arm_vlog_q15", cmsis_arm_vlog_q15, METH_VARARGS,""},
  388. {"arm_vlog_q31", cmsis_arm_vlog_q31, METH_VARARGS,""},
  389. {"arm_sin_f32", cmsis_arm_sin_f32, METH_VARARGS,""},
  390. {"arm_sin_q31", cmsis_arm_sin_q31, METH_VARARGS,""},
  391. {"arm_sin_q15", cmsis_arm_sin_q15, METH_VARARGS,""},
  392. {"arm_cos_f32", cmsis_arm_cos_f32, METH_VARARGS,""},
  393. {"arm_cos_q31", cmsis_arm_cos_q31, METH_VARARGS,""},
  394. {"arm_cos_q15", cmsis_arm_cos_q15, METH_VARARGS,""},
  395. {"arm_sqrt_f32", cmsis_arm_sqrt_f32, METH_VARARGS,""},
  396. {"arm_sqrt_q31", cmsis_arm_sqrt_q31, METH_VARARGS,""},
  397. {"arm_sqrt_q15", cmsis_arm_sqrt_q15, METH_VARARGS,""},
  398. {"arm_divide_q31", cmsis_arm_divide_q31, METH_VARARGS,""},
  399. {"arm_divide_q15", cmsis_arm_divide_q15, METH_VARARGS,""},
  400. {"arm_vexp_f32", cmsis_arm_vexp_f32, METH_VARARGS,""},
  401. {"arm_vlog_f32", cmsis_arm_vlog_f32, METH_VARARGS,""},
  402. {"arm_vexp_f64", cmsis_arm_vexp_f64, METH_VARARGS,""},
  403. {"arm_vlog_f64", cmsis_arm_vlog_f64, METH_VARARGS,""},
  404. {"arm_atan2_f32", cmsis_arm_atan2_f32, METH_VARARGS,""},
  405. {"arm_atan2_q31", cmsis_arm_atan2_q31, METH_VARARGS,""},
  406. {"arm_atan2_q15", cmsis_arm_atan2_q15, METH_VARARGS,""},
  407. {"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},
  408. {NULL, NULL, 0, NULL} /* Sentinel */
  409. };
  410. #ifdef IS_PY3K
  411. static int cmsisdsp_traverse(PyObject *m, visitproc visit, void *arg) {
  412. Py_VISIT(GETSTATE(m)->error);
  413. return 0;
  414. }
  415. static int cmsisdsp_clear(PyObject *m) {
  416. Py_CLEAR(GETSTATE(m)->error);
  417. return 0;
  418. }
  419. static struct PyModuleDef moduledef = {
  420. PyModuleDef_HEAD_INIT,
  421. MODNAME,
  422. NULL,
  423. sizeof(struct module_state),
  424. CMSISDSPMethods,
  425. NULL,
  426. cmsisdsp_traverse,
  427. cmsisdsp_clear,
  428. NULL
  429. };
  430. #define INITERROR return NULL
  431. PyMODINIT_FUNC
  432. CAT(PyInit_,MODINITNAME)(void)
  433. #else
  434. #define INITERROR return
  435. void CAT(init,MODINITNAME)(void)
  436. #endif
  437. {
  438. import_array();
  439. #ifdef IS_PY3K
  440. PyObject *module = PyModule_Create(&moduledef);
  441. #else
  442. PyObject *module = Py_InitModule(MODNAME, CMSISDSPMethods);
  443. #endif
  444. if (module == NULL)
  445. INITERROR;
  446. struct module_state *st = GETSTATE(module);
  447. st->error = PyErr_NewException(MODNAME".Error", NULL, NULL);
  448. if (st->error == NULL) {
  449. Py_DECREF(module);
  450. INITERROR;
  451. }
  452. typeRegistration(module);
  453. #ifdef IS_PY3K
  454. return module;
  455. #endif
  456. }