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
29 #define MODNAME "cmsisdsp_support"
30 #define MODINITNAME cmsisdsp_support
31
32 #include "cmsisdsp_module.h"
33
34 NUMPYVECTORFROMBUFFER(f32,float32_t,NPY_FLOAT);
35
36
37 typedef struct {
38 PyObject_HEAD
39 arm_sort_instance_f32 *instance;
40 } dsp_arm_sort_instance_f32Object;
41
42 static void
arm_sort_instance_f32_dealloc(dsp_arm_sort_instance_f32Object * self)43 arm_sort_instance_f32_dealloc(dsp_arm_sort_instance_f32Object* self)
44 {
45 //printf("Dealloc called\n");
46 if (self->instance)
47 {
48
49 PyMem_Free(self->instance);
50 }
51
52 Py_TYPE(self)->tp_free((PyObject*)self);
53 }
54
55 static PyObject *
arm_sort_instance_f32_new(PyTypeObject * type,PyObject * args,PyObject * kwds)56 arm_sort_instance_f32_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
57 {
58 dsp_arm_sort_instance_f32Object *self;
59 //printf("New called\n");
60
61 self = (dsp_arm_sort_instance_f32Object *)type->tp_alloc(type, 0);
62 //printf("alloc called\n");
63
64 if (self != NULL) {
65
66 self->instance = PyMem_Malloc(sizeof(arm_sort_instance_f32));
67
68 }
69
70
71 return (PyObject *)self;
72 }
73
74 static int
arm_sort_instance_f32_init(dsp_arm_sort_instance_f32Object * self,PyObject * args,PyObject * kwds)75 arm_sort_instance_f32_init(dsp_arm_sort_instance_f32Object *self, PyObject *args, PyObject *kwds)
76 {
77
78 PyObject *pState=NULL;
79 PyObject *pCoeffs=NULL;
80 char *kwlist[] = {
81 "arm_sort_alg","arm_sort_dir",NULL
82 };
83
84 uint16_t alg,dir;
85
86 if (PyArg_ParseTupleAndKeywords(args, kwds, "|hh", kwlist,&alg,&dir
87 ))
88 {
89
90 self->instance->alg=alg;
91 self->instance->dir=dir;
92 }
93 return 0;
94 }
95
96 static PyObject *
Method_arm_sort_instance_f32_alg(dsp_arm_sort_instance_f32Object * self,PyObject * ignored)97 Method_arm_sort_instance_f32_alg(dsp_arm_sort_instance_f32Object *self, PyObject *ignored)
98 {
99 return(Py_BuildValue("i",(int)self->instance->alg));
100 }
101
102 static PyObject *
Method_arm_sort_instance_f32_dir(dsp_arm_sort_instance_f32Object * self,PyObject * ignored)103 Method_arm_sort_instance_f32_dir(dsp_arm_sort_instance_f32Object *self, PyObject *ignored)
104 {
105 return(Py_BuildValue("i",(int)self->instance->dir));
106 }
107
108 static PyMethodDef arm_sort_instance_f32_methods[] = {
109
110 {"alg", (PyCFunction) Method_arm_sort_instance_f32_alg,METH_NOARGS,"alg"},
111 {"dir", (PyCFunction) Method_arm_sort_instance_f32_dir,METH_NOARGS,"dir"},
112
113 {NULL} /* Sentinel */
114 };
115
116 DSPType(arm_sort_instance_f32,arm_sort_instance_f32_new,arm_sort_instance_f32_dealloc,arm_sort_instance_f32_init,arm_sort_instance_f32_methods);
117
typeRegistration(PyObject * module)118 void typeRegistration(PyObject *module) {
119
120 ADDTYPE(arm_sort_instance_f32);
121 }
122
123 static PyObject *
cmsis_arm_sort_init_f32(PyObject * obj,PyObject * args)124 cmsis_arm_sort_init_f32(PyObject *obj, PyObject *args)
125 {
126
127 PyObject *S=NULL; // input
128 uint16_t alg,dir; // input
129
130 if (PyArg_ParseTuple(args,"Ohh",&S,&alg,&dir))
131 {
132
133 dsp_arm_sort_instance_f32Object *selfS = (dsp_arm_sort_instance_f32Object *)S;
134
135 arm_sort_init_f32(selfS->instance,alg,dir);
136 Py_RETURN_NONE;
137
138 }
139 return(NULL);
140 }
141
142 static PyObject *
cmsis_arm_sort_f32(PyObject * obj,PyObject * args)143 cmsis_arm_sort_f32(PyObject *obj, PyObject *args)
144 {
145
146 PyObject *S=NULL; // input
147 PyObject *pSrc=NULL; // input
148 float32_t *pSrc_converted=NULL; // input
149 float32_t *pDst=NULL; // output
150 uint32_t blockSize; // input
151
152 if (PyArg_ParseTuple(args,"OO",&S,&pSrc))
153 {
154
155 dsp_arm_sort_instance_f32Object *selfS = (dsp_arm_sort_instance_f32Object *)S;
156 GETARGUMENT(pSrc,NPY_DOUBLE,double,float32_t);
157 blockSize = arraySizepSrc ;
158
159 pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
160
161
162 arm_sort_f32(selfS->instance,pSrc_converted,pDst,blockSize);
163 FLOATARRAY1(pDstOBJ,blockSize,pDst);
164
165 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
166
167 FREEARGUMENT(pSrc_converted);
168 Py_DECREF(pDstOBJ);
169 return(pythonResult);
170
171 }
172 return(NULL);
173 }
174
175
176 static PyObject *
cmsis_arm_fill_f32(PyObject * obj,PyObject * args)177 cmsis_arm_fill_f32(PyObject *obj, PyObject *args)
178 {
179
180 float32_t value; // input
181 float32_t *pDst=NULL; // output
182 uint32_t blockSize; // input
183
184 if (PyArg_ParseTuple(args,"fi",&value,&blockSize))
185 {
186
187 pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
188
189
190 arm_fill_f32(value,pDst,blockSize);
191 FLOATARRAY1(pDstOBJ,blockSize,pDst);
192
193 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
194
195 Py_DECREF(pDstOBJ);
196 return(pythonResult);
197
198 }
199 return(NULL);
200 }
201
202 static PyObject *
cmsis_arm_fill_f64(PyObject * obj,PyObject * args)203 cmsis_arm_fill_f64(PyObject *obj, PyObject *args)
204 {
205
206 float64_t value; // input
207 float64_t *pDst=NULL; // output
208 uint32_t blockSize; // input
209
210 if (PyArg_ParseTuple(args,"di",&value,&blockSize))
211 {
212
213 pDst=PyMem_Malloc(sizeof(float64_t)*blockSize);
214
215
216 arm_fill_f64(value,pDst,blockSize);
217 FLOAT64ARRAY1(pDstOBJ,blockSize,pDst);
218
219 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
220
221 Py_DECREF(pDstOBJ);
222 return(pythonResult);
223
224 }
225 return(NULL);
226 }
227
228 static PyObject *
cmsis_arm_fill_q31(PyObject * obj,PyObject * args)229 cmsis_arm_fill_q31(PyObject *obj, PyObject *args)
230 {
231
232 q31_t value; // input
233 q31_t *pDst=NULL; // output
234 uint32_t blockSize; // input
235
236 if (PyArg_ParseTuple(args,"ii",&value,&blockSize))
237 {
238
239 pDst=PyMem_Malloc(sizeof(q31_t)*blockSize);
240
241
242 arm_fill_q31(value,pDst,blockSize);
243 INT32ARRAY1(pDstOBJ,blockSize,pDst);
244
245 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
246
247 Py_DECREF(pDstOBJ);
248 return(pythonResult);
249
250 }
251 return(NULL);
252 }
253
254 static PyObject *
cmsis_arm_fill_q15(PyObject * obj,PyObject * args)255 cmsis_arm_fill_q15(PyObject *obj, PyObject *args)
256 {
257
258 q15_t value; // input
259 q15_t *pDst=NULL; // output
260 uint32_t blockSize; // input
261
262 if (PyArg_ParseTuple(args,"hi",&value,&blockSize))
263 {
264
265 pDst=PyMem_Malloc(sizeof(q15_t)*blockSize);
266
267
268 arm_fill_q15(value,pDst,blockSize);
269 INT16ARRAY1(pDstOBJ,blockSize,pDst);
270
271 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
272
273 Py_DECREF(pDstOBJ);
274 return(pythonResult);
275
276 }
277 return(NULL);
278 }
279
280 static PyObject *
cmsis_arm_fill_q7(PyObject * obj,PyObject * args)281 cmsis_arm_fill_q7(PyObject *obj, PyObject *args)
282 {
283
284 q31_t value; // input
285 q7_t *pDst=NULL; // output
286 uint32_t blockSize; // input
287
288 if (PyArg_ParseTuple(args,"ii",&value,&blockSize))
289 {
290
291 pDst=PyMem_Malloc(sizeof(q7_t)*blockSize);
292
293
294 arm_fill_q7((q7_t)value,pDst,blockSize);
295 INT8ARRAY1(pDstOBJ,blockSize,pDst);
296
297 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
298
299 Py_DECREF(pDstOBJ);
300 return(pythonResult);
301
302 }
303 return(NULL);
304 }
305
306
307
308 static PyObject *
cmsis_arm_copy_f32(PyObject * obj,PyObject * args)309 cmsis_arm_copy_f32(PyObject *obj, PyObject *args)
310 {
311
312 PyObject *pSrc=NULL; // input
313 float32_t *pSrc_converted=NULL; // input
314 float32_t *pDst=NULL; // output
315 uint32_t blockSize; // input
316
317 if (PyArg_ParseTuple(args,"O",&pSrc))
318 {
319
320 GETARGUMENT(pSrc,NPY_DOUBLE,double,float32_t);
321 blockSize = arraySizepSrc ;
322
323 pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
324
325
326 arm_copy_f32(pSrc_converted,pDst,blockSize);
327 FLOATARRAY1(pDstOBJ,blockSize,pDst);
328
329 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
330
331 FREEARGUMENT(pSrc_converted);
332 Py_DECREF(pDstOBJ);
333 return(pythonResult);
334
335 }
336 return(NULL);
337 }
338
339 static PyObject *
cmsis_arm_copy_f64(PyObject * obj,PyObject * args)340 cmsis_arm_copy_f64(PyObject *obj, PyObject *args)
341 {
342
343 PyObject *pSrc=NULL; // input
344 float64_t *pSrc_converted=NULL; // input
345 float64_t *pDst=NULL; // output
346 uint32_t blockSize; // input
347
348 if (PyArg_ParseTuple(args,"O",&pSrc))
349 {
350
351 GETARGUMENT(pSrc,NPY_DOUBLE,double,float64_t);
352 blockSize = arraySizepSrc ;
353
354 pDst=PyMem_Malloc(sizeof(float64_t)*blockSize);
355
356
357 arm_copy_f64(pSrc_converted,pDst,blockSize);
358 FLOAT64ARRAY1(pDstOBJ,blockSize,pDst);
359
360 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
361
362 FREEARGUMENT(pSrc_converted);
363 Py_DECREF(pDstOBJ);
364 return(pythonResult);
365
366 }
367 return(NULL);
368 }
369
370
371 static PyObject *
cmsis_arm_copy_q7(PyObject * obj,PyObject * args)372 cmsis_arm_copy_q7(PyObject *obj, PyObject *args)
373 {
374
375 PyObject *pSrc=NULL; // input
376 q7_t *pSrc_converted=NULL; // input
377 q7_t *pDst=NULL; // output
378 uint32_t blockSize; // input
379
380 if (PyArg_ParseTuple(args,"O",&pSrc))
381 {
382
383 GETARGUMENT(pSrc,NPY_BYTE,int8_t,q7_t);
384 blockSize = arraySizepSrc ;
385
386 pDst=PyMem_Malloc(sizeof(q7_t)*blockSize);
387
388
389 arm_copy_q7(pSrc_converted,pDst,blockSize);
390 INT8ARRAY1(pDstOBJ,blockSize,pDst);
391
392 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
393
394 FREEARGUMENT(pSrc_converted);
395 Py_DECREF(pDstOBJ);
396 return(pythonResult);
397
398 }
399 return(NULL);
400 }
401
402
403 static PyObject *
cmsis_arm_copy_q15(PyObject * obj,PyObject * args)404 cmsis_arm_copy_q15(PyObject *obj, PyObject *args)
405 {
406
407 PyObject *pSrc=NULL; // input
408 q15_t *pSrc_converted=NULL; // input
409 q15_t *pDst=NULL; // output
410 uint32_t blockSize; // input
411
412 if (PyArg_ParseTuple(args,"O",&pSrc))
413 {
414
415 GETARGUMENT(pSrc,NPY_INT16,int16_t,int16_t);
416 blockSize = arraySizepSrc ;
417
418 pDst=PyMem_Malloc(sizeof(q15_t)*blockSize);
419
420
421 arm_copy_q15(pSrc_converted,pDst,blockSize);
422 INT16ARRAY1(pDstOBJ,blockSize,pDst);
423
424 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
425
426 FREEARGUMENT(pSrc_converted);
427 Py_DECREF(pDstOBJ);
428 return(pythonResult);
429
430 }
431 return(NULL);
432 }
433
434
435 static PyObject *
cmsis_arm_copy_q31(PyObject * obj,PyObject * args)436 cmsis_arm_copy_q31(PyObject *obj, PyObject *args)
437 {
438
439 PyObject *pSrc=NULL; // input
440 q31_t *pSrc_converted=NULL; // input
441 q31_t *pDst=NULL; // output
442 uint32_t blockSize; // input
443
444 if (PyArg_ParseTuple(args,"O",&pSrc))
445 {
446
447 GETARGUMENT(pSrc,NPY_INT32,int32_t,int32_t);
448 blockSize = arraySizepSrc ;
449
450 pDst=PyMem_Malloc(sizeof(q31_t)*blockSize);
451
452
453 arm_copy_q31(pSrc_converted,pDst,blockSize);
454 INT32ARRAY1(pDstOBJ,blockSize,pDst);
455
456 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
457
458 FREEARGUMENT(pSrc_converted);
459 Py_DECREF(pDstOBJ);
460 return(pythonResult);
461
462 }
463 return(NULL);
464 }
465
466
467
468
469
470
471
472
473
474 static PyObject *
cmsis_arm_q7_to_q31(PyObject * obj,PyObject * args)475 cmsis_arm_q7_to_q31(PyObject *obj, PyObject *args)
476 {
477
478 PyObject *pSrc=NULL; // input
479 q7_t *pSrc_converted=NULL; // input
480 q31_t *pDst=NULL; // output
481 uint32_t blockSize; // input
482
483 if (PyArg_ParseTuple(args,"O",&pSrc))
484 {
485
486 GETARGUMENT(pSrc,NPY_BYTE,int8_t,q7_t);
487 blockSize = arraySizepSrc ;
488
489 pDst=PyMem_Malloc(sizeof(q31_t)*blockSize);
490
491
492 arm_q7_to_q31(pSrc_converted,pDst,blockSize);
493 INT32ARRAY1(pDstOBJ,blockSize,pDst);
494
495 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
496
497 FREEARGUMENT(pSrc_converted);
498 Py_DECREF(pDstOBJ);
499 return(pythonResult);
500
501 }
502 return(NULL);
503 }
504
505
506
507
508 static PyObject *
cmsis_arm_q7_to_q15(PyObject * obj,PyObject * args)509 cmsis_arm_q7_to_q15(PyObject *obj, PyObject *args)
510 {
511
512 PyObject *pSrc=NULL; // input
513 q7_t *pSrc_converted=NULL; // input
514 q15_t *pDst=NULL; // output
515 uint32_t blockSize; // input
516
517 if (PyArg_ParseTuple(args,"O",&pSrc))
518 {
519
520 GETARGUMENT(pSrc,NPY_BYTE,int8_t,q7_t);
521 blockSize = arraySizepSrc ;
522
523 pDst=PyMem_Malloc(sizeof(q15_t)*blockSize);
524
525
526 arm_q7_to_q15(pSrc_converted,pDst,blockSize);
527 INT16ARRAY1(pDstOBJ,blockSize,pDst);
528
529 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
530
531 FREEARGUMENT(pSrc_converted);
532 Py_DECREF(pDstOBJ);
533 return(pythonResult);
534
535 }
536 return(NULL);
537 }
538
539
540
541
542 static PyObject *
cmsis_arm_q7_to_float(PyObject * obj,PyObject * args)543 cmsis_arm_q7_to_float(PyObject *obj, PyObject *args)
544 {
545
546 PyObject *pSrc=NULL; // input
547 q7_t *pSrc_converted=NULL; // input
548 float32_t *pDst=NULL; // output
549 uint32_t blockSize; // input
550
551 if (PyArg_ParseTuple(args,"O",&pSrc))
552 {
553
554 GETARGUMENT(pSrc,NPY_BYTE,int8_t,q7_t);
555 blockSize = arraySizepSrc ;
556
557 pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
558
559
560 arm_q7_to_float(pSrc_converted,pDst,blockSize);
561 FLOATARRAY1(pDstOBJ,blockSize,pDst);
562
563 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
564
565 FREEARGUMENT(pSrc_converted);
566 Py_DECREF(pDstOBJ);
567 return(pythonResult);
568
569 }
570 return(NULL);
571 }
572
573
574
575
576
577
578 static PyObject *
cmsis_arm_q31_to_float(PyObject * obj,PyObject * args)579 cmsis_arm_q31_to_float(PyObject *obj, PyObject *args)
580 {
581
582 PyObject *pSrc=NULL; // input
583 q31_t *pSrc_converted=NULL; // input
584 float32_t *pDst=NULL; // output
585 uint32_t blockSize; // input
586
587 if (PyArg_ParseTuple(args,"O",&pSrc))
588 {
589
590 GETARGUMENT(pSrc,NPY_INT32,int32_t,int32_t);
591 blockSize = arraySizepSrc ;
592
593 pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
594
595
596 arm_q31_to_float(pSrc_converted,pDst,blockSize);
597 FLOATARRAY1(pDstOBJ,blockSize,pDst);
598
599 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
600
601 FREEARGUMENT(pSrc_converted);
602 Py_DECREF(pDstOBJ);
603 return(pythonResult);
604
605 }
606 return(NULL);
607 }
608
609
610
611
612
613
614 static PyObject *
cmsis_arm_float_to_q31(PyObject * obj,PyObject * args)615 cmsis_arm_float_to_q31(PyObject *obj, PyObject *args)
616 {
617
618 PyObject *pSrc=NULL; // input
619 float32_t *pSrc_converted=NULL; // input
620 q31_t *pDst=NULL; // output
621 uint32_t blockSize; // input
622
623 if (PyArg_ParseTuple(args,"O",&pSrc))
624 {
625
626 GETARGUMENT(pSrc,NPY_DOUBLE,double,float32_t);
627 blockSize = arraySizepSrc ;
628
629 pDst=PyMem_Malloc(sizeof(q31_t)*blockSize);
630
631
632 arm_float_to_q31(pSrc_converted,pDst,blockSize);
633 INT32ARRAY1(pDstOBJ,blockSize,pDst);
634
635 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
636
637 FREEARGUMENT(pSrc_converted);
638 Py_DECREF(pDstOBJ);
639 return(pythonResult);
640
641 }
642 return(NULL);
643 }
644
645
646 static PyObject *
cmsis_arm_float_to_q15(PyObject * obj,PyObject * args)647 cmsis_arm_float_to_q15(PyObject *obj, PyObject *args)
648 {
649
650 PyObject *pSrc=NULL; // input
651 float32_t *pSrc_converted=NULL; // input
652 q15_t *pDst=NULL; // output
653 uint32_t blockSize; // input
654
655 if (PyArg_ParseTuple(args,"O",&pSrc))
656 {
657
658 GETARGUMENT(pSrc,NPY_DOUBLE,double,float32_t);
659 blockSize = arraySizepSrc ;
660
661 pDst=PyMem_Malloc(sizeof(q15_t)*blockSize);
662
663
664 arm_float_to_q15(pSrc_converted,pDst,blockSize);
665 INT16ARRAY1(pDstOBJ,blockSize,pDst);
666
667 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
668
669 FREEARGUMENT(pSrc_converted);
670 Py_DECREF(pDstOBJ);
671 return(pythonResult);
672
673 }
674 return(NULL);
675 }
676
677
678 static PyObject *
cmsis_arm_float_to_q7(PyObject * obj,PyObject * args)679 cmsis_arm_float_to_q7(PyObject *obj, PyObject *args)
680 {
681
682 PyObject *pSrc=NULL; // input
683 float32_t *pSrc_converted=NULL; // input
684 q7_t *pDst=NULL; // output
685 uint32_t blockSize; // input
686
687 if (PyArg_ParseTuple(args,"O",&pSrc))
688 {
689
690 GETARGUMENT(pSrc,NPY_DOUBLE,double,float32_t);
691 blockSize = arraySizepSrc ;
692
693 pDst=PyMem_Malloc(sizeof(q7_t)*blockSize);
694
695
696 arm_float_to_q7(pSrc_converted,pDst,blockSize);
697 INT8ARRAY1(pDstOBJ,blockSize,pDst);
698
699 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
700
701 FREEARGUMENT(pSrc_converted);
702 Py_DECREF(pDstOBJ);
703 return(pythonResult);
704
705 }
706 return(NULL);
707 }
708
709
710 static PyObject *
cmsis_arm_q31_to_q15(PyObject * obj,PyObject * args)711 cmsis_arm_q31_to_q15(PyObject *obj, PyObject *args)
712 {
713
714 PyObject *pSrc=NULL; // input
715 q31_t *pSrc_converted=NULL; // input
716 q15_t *pDst=NULL; // output
717 uint32_t blockSize; // input
718
719 if (PyArg_ParseTuple(args,"O",&pSrc))
720 {
721
722 GETARGUMENT(pSrc,NPY_INT32,int32_t,int32_t);
723 blockSize = arraySizepSrc ;
724
725 pDst=PyMem_Malloc(sizeof(q15_t)*blockSize);
726
727
728 arm_q31_to_q15(pSrc_converted,pDst,blockSize);
729 INT16ARRAY1(pDstOBJ,blockSize,pDst);
730
731 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
732
733 FREEARGUMENT(pSrc_converted);
734 Py_DECREF(pDstOBJ);
735 return(pythonResult);
736
737 }
738 return(NULL);
739 }
740
741
742 static PyObject *
cmsis_arm_q31_to_q7(PyObject * obj,PyObject * args)743 cmsis_arm_q31_to_q7(PyObject *obj, PyObject *args)
744 {
745
746 PyObject *pSrc=NULL; // input
747 q31_t *pSrc_converted=NULL; // input
748 q7_t *pDst=NULL; // output
749 uint32_t blockSize; // input
750
751 if (PyArg_ParseTuple(args,"O",&pSrc))
752 {
753
754 GETARGUMENT(pSrc,NPY_INT32,int32_t,int32_t);
755 blockSize = arraySizepSrc ;
756
757 pDst=PyMem_Malloc(sizeof(q7_t)*blockSize);
758
759
760 arm_q31_to_q7(pSrc_converted,pDst,blockSize);
761 INT8ARRAY1(pDstOBJ,blockSize,pDst);
762
763 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
764
765 FREEARGUMENT(pSrc_converted);
766 Py_DECREF(pDstOBJ);
767 return(pythonResult);
768
769 }
770 return(NULL);
771 }
772
773
774 static PyObject *
cmsis_arm_q15_to_float(PyObject * obj,PyObject * args)775 cmsis_arm_q15_to_float(PyObject *obj, PyObject *args)
776 {
777
778 PyObject *pSrc=NULL; // input
779 q15_t *pSrc_converted=NULL; // input
780 float32_t *pDst=NULL; // output
781 uint32_t blockSize; // input
782
783 if (PyArg_ParseTuple(args,"O",&pSrc))
784 {
785
786 GETARGUMENT(pSrc,NPY_INT16,int16_t,int16_t);
787 blockSize = arraySizepSrc ;
788
789 pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
790
791
792 arm_q15_to_float(pSrc_converted,pDst,blockSize);
793 FLOATARRAY1(pDstOBJ,blockSize,pDst);
794
795 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
796
797 FREEARGUMENT(pSrc_converted);
798 Py_DECREF(pDstOBJ);
799 return(pythonResult);
800
801 }
802 return(NULL);
803 }
804
805
806 static PyObject *
cmsis_arm_q15_to_q31(PyObject * obj,PyObject * args)807 cmsis_arm_q15_to_q31(PyObject *obj, PyObject *args)
808 {
809
810 PyObject *pSrc=NULL; // input
811 q15_t *pSrc_converted=NULL; // input
812 q31_t *pDst=NULL; // output
813 uint32_t blockSize; // input
814
815 if (PyArg_ParseTuple(args,"O",&pSrc))
816 {
817
818 GETARGUMENT(pSrc,NPY_INT16,int16_t,int16_t);
819 blockSize = arraySizepSrc ;
820
821 pDst=PyMem_Malloc(sizeof(q31_t)*blockSize);
822
823
824 arm_q15_to_q31(pSrc_converted,pDst,blockSize);
825 INT32ARRAY1(pDstOBJ,blockSize,pDst);
826
827 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
828
829 FREEARGUMENT(pSrc_converted);
830 Py_DECREF(pDstOBJ);
831 return(pythonResult);
832
833 }
834 return(NULL);
835 }
836
837
838 static PyObject *
cmsis_arm_q15_to_q7(PyObject * obj,PyObject * args)839 cmsis_arm_q15_to_q7(PyObject *obj, PyObject *args)
840 {
841
842 PyObject *pSrc=NULL; // input
843 q15_t *pSrc_converted=NULL; // input
844 q7_t *pDst=NULL; // output
845 uint32_t blockSize; // input
846
847 if (PyArg_ParseTuple(args,"O",&pSrc))
848 {
849
850 GETARGUMENT(pSrc,NPY_INT16,int16_t,int16_t);
851 blockSize = arraySizepSrc ;
852
853 pDst=PyMem_Malloc(sizeof(q7_t)*blockSize);
854
855
856 arm_q15_to_q7(pSrc_converted,pDst,blockSize);
857 INT8ARRAY1(pDstOBJ,blockSize,pDst);
858
859 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
860
861 FREEARGUMENT(pSrc_converted);
862 Py_DECREF(pDstOBJ);
863 return(pythonResult);
864
865 }
866 return(NULL);
867 }
868
869
870 static PyObject *
cmsis_arm_barycenter_f32(PyObject * obj,PyObject * args)871 cmsis_arm_barycenter_f32(PyObject *obj, PyObject *args)
872 {
873
874 PyObject *pSrcA=NULL; // input
875 float32_t *pSrcA_converted=NULL; // input
876 PyObject *pSrcB=NULL; // input
877 float32_t *pSrcB_converted=NULL; // input
878 float32_t *pDst=NULL; // output
879 uint32_t nbVectors,vecDim;
880
881 if (PyArg_ParseTuple(args,"OOII",&pSrcA,&pSrcB,&nbVectors,&vecDim))
882 {
883 GETARGUMENT(pSrcA,NPY_DOUBLE,double,float32_t);
884 GETARGUMENT(pSrcB,NPY_DOUBLE,double,float32_t);
885
886 pDst=PyMem_Malloc(sizeof(float32_t)*vecDim);
887
888
889 arm_barycenter_f32(pSrcA_converted,pSrcB_converted,pDst,nbVectors,vecDim);
890 FLOATARRAY1(pDstOBJ,vecDim,pDst);
891
892 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
893
894 FREEARGUMENT(pSrcA_converted);
895 FREEARGUMENT(pSrcB_converted);
896 Py_DECREF(pDstOBJ);
897 return(pythonResult);
898
899 }
900 return(NULL);
901 }
902
903 static PyObject *
cmsis_arm_weighted_average_f32(PyObject * obj,PyObject * args)904 cmsis_arm_weighted_average_f32(PyObject *obj, PyObject *args)
905 {
906
907 PyObject *pSrcA=NULL; // input
908 float32_t *pSrcA_converted=NULL; // input
909 PyObject *pSrcB=NULL; // input
910 float32_t *pSrcB_converted=NULL; // input
911 float32_t dst; // output
912 uint32_t blockSize;
913
914 if (PyArg_ParseTuple(args,"OO",&pSrcA,&pSrcB))
915 {
916
917 GETARGUMENT(pSrcA,NPY_DOUBLE,double,float32_t);
918 GETARGUMENT(pSrcB,NPY_DOUBLE,double,float32_t);
919 blockSize = arraySizepSrcA ;
920
921
922 dst=arm_weighted_average_f32(pSrcA_converted,pSrcB_converted,blockSize);
923 PyObject* pDstOBJ=Py_BuildValue("f",dst);
924 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
925
926 FREEARGUMENT(pSrcA_converted);
927 FREEARGUMENT(pSrcB_converted);
928 Py_DECREF(pDstOBJ);
929 return(pythonResult);
930
931 }
932 return(NULL);
933 }
934
935 static PyObject *
cmsis_arm_div_int64_to_int32(PyObject * obj,PyObject * args)936 cmsis_arm_div_int64_to_int32(PyObject *obj, PyObject *args)
937 {
938
939 PyObject *pSrc=NULL; // input
940 q63_t num;
941 q31_t den;
942 q31_t result;
943
944 if (PyArg_ParseTuple(args,"Ll",&num,&den))
945 {
946
947
948 result=arm_div_int64_to_int32(num,den);
949
950 PyObject* resultOBJ=Py_BuildValue("l",result);
951
952 PyObject *pythonResult = Py_BuildValue("O",resultOBJ);
953
954 Py_DECREF(resultOBJ);
955
956 return(pythonResult);
957
958 }
959 return(NULL);
960 }
961
962 static PyMethodDef CMSISDSPMethods[] = {
963
964 {"arm_div_int64_to_int32", cmsis_arm_div_int64_to_int32, METH_VARARGS,""},
965 {"arm_copy_f64", cmsis_arm_copy_f64, METH_VARARGS,""},
966 {"arm_copy_f32", cmsis_arm_copy_f32, METH_VARARGS,""},
967 {"arm_copy_q7", cmsis_arm_copy_q7, METH_VARARGS,""},
968 {"arm_copy_q15", cmsis_arm_copy_q15, METH_VARARGS,""},
969 {"arm_copy_q31", cmsis_arm_copy_q31, METH_VARARGS,""},
970
971
972 {"arm_q7_to_q31", cmsis_arm_q7_to_q31, METH_VARARGS,""},
973 {"arm_q7_to_q15", cmsis_arm_q7_to_q15, METH_VARARGS,""},
974 {"arm_q7_to_float", cmsis_arm_q7_to_float, METH_VARARGS,""},
975 {"arm_q31_to_float", cmsis_arm_q31_to_float, METH_VARARGS,""},
976
977
978
979 {"arm_float_to_q31", cmsis_arm_float_to_q31, METH_VARARGS,""},
980 {"arm_float_to_q15", cmsis_arm_float_to_q15, METH_VARARGS,""},
981 {"arm_float_to_q7", cmsis_arm_float_to_q7, METH_VARARGS,""},
982 {"arm_q31_to_q15", cmsis_arm_q31_to_q15, METH_VARARGS,""},
983 {"arm_q31_to_q7", cmsis_arm_q31_to_q7, METH_VARARGS,""},
984 {"arm_q15_to_float", cmsis_arm_q15_to_float, METH_VARARGS,""},
985 {"arm_q15_to_q31", cmsis_arm_q15_to_q31, METH_VARARGS,""},
986 {"arm_q15_to_q7", cmsis_arm_q15_to_q7, METH_VARARGS,""},
987
988 {"arm_fill_f64", cmsis_arm_fill_f64, METH_VARARGS,""},
989 {"arm_fill_f32", cmsis_arm_fill_f32, METH_VARARGS,""},
990 {"arm_fill_q31", cmsis_arm_fill_q31, METH_VARARGS,""},
991 {"arm_fill_q15", cmsis_arm_fill_q15, METH_VARARGS,""},
992 {"arm_fill_q7", cmsis_arm_fill_q7, METH_VARARGS,""},
993 {"arm_sort_f32", cmsis_arm_sort_f32, METH_VARARGS,""},
994 {"arm_sort_init_f32", cmsis_arm_sort_init_f32, METH_VARARGS,""},
995 {"arm_barycenter_f32", cmsis_arm_barycenter_f32, METH_VARARGS,""},
996 {"arm_weighted_average_f32", cmsis_arm_weighted_average_f32, METH_VARARGS,""},
997
998 {"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},
999 {NULL, NULL, 0, NULL} /* Sentinel */
1000 };
1001
1002 #ifdef IS_PY3K
cmsisdsp_traverse(PyObject * m,visitproc visit,void * arg)1003 static int cmsisdsp_traverse(PyObject *m, visitproc visit, void *arg) {
1004 Py_VISIT(GETSTATE(m)->error);
1005 return 0;
1006 }
1007
cmsisdsp_clear(PyObject * m)1008 static int cmsisdsp_clear(PyObject *m) {
1009 Py_CLEAR(GETSTATE(m)->error);
1010 return 0;
1011 }
1012
1013
1014 static struct PyModuleDef moduledef = {
1015 PyModuleDef_HEAD_INIT,
1016 MODNAME,
1017 NULL,
1018 sizeof(struct module_state),
1019 CMSISDSPMethods,
1020 NULL,
1021 cmsisdsp_traverse,
1022 cmsisdsp_clear,
1023 NULL
1024 };
1025
1026 #define INITERROR return NULL
1027
1028 PyMODINIT_FUNC
CAT(PyInit_,MODINITNAME)1029 CAT(PyInit_,MODINITNAME)(void)
1030
1031
1032 #else
1033 #define INITERROR return
1034
1035 void CAT(init,MODINITNAME)(void)
1036 #endif
1037 {
1038 import_array();
1039
1040 #ifdef IS_PY3K
1041 PyObject *module = PyModule_Create(&moduledef);
1042 #else
1043 PyObject *module = Py_InitModule(MODNAME, CMSISDSPMethods);
1044 #endif
1045
1046 if (module == NULL)
1047 INITERROR;
1048 struct module_state *st = GETSTATE(module);
1049
1050 st->error = PyErr_NewException(MODNAME".Error", NULL, NULL);
1051 if (st->error == NULL) {
1052 Py_DECREF(module);
1053 INITERROR;
1054 }
1055
1056
1057 typeRegistration(module);
1058
1059 #ifdef IS_PY3K
1060 return module;
1061 #endif
1062 }