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_interpolation"
30 #define MODINITNAME cmsisdsp_interpolation
31
32 #include "cmsisdsp_module.h"
33
34
35 NUMPYVECTORFROMBUFFER(f32,float32_t,NPY_FLOAT);
36
37
38 typedef struct {
39 PyObject_HEAD
40 arm_linear_interp_instance_f32 *instance;
41 } dsp_arm_linear_interp_instance_f32Object;
42
43
44 static void
arm_linear_interp_instance_f32_dealloc(dsp_arm_linear_interp_instance_f32Object * self)45 arm_linear_interp_instance_f32_dealloc(dsp_arm_linear_interp_instance_f32Object* self)
46 {
47 //printf("Dealloc called\n");
48 if (self->instance)
49 {
50
51
52 if (self->instance->pYData)
53 {
54 PyMem_Free(self->instance->pYData);
55 }
56
57
58 PyMem_Free(self->instance);
59 }
60
61 Py_TYPE(self)->tp_free((PyObject*)self);
62 }
63
64
65 static PyObject *
arm_linear_interp_instance_f32_new(PyTypeObject * type,PyObject * args,PyObject * kwds)66 arm_linear_interp_instance_f32_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
67 {
68 dsp_arm_linear_interp_instance_f32Object *self;
69 //printf("New called\n");
70
71 self = (dsp_arm_linear_interp_instance_f32Object *)type->tp_alloc(type, 0);
72 //printf("alloc called\n");
73
74 if (self != NULL) {
75
76 self->instance = PyMem_Malloc(sizeof(arm_linear_interp_instance_f32));
77
78 self->instance->pYData = NULL;
79
80 }
81
82
83 return (PyObject *)self;
84 }
85
86 static int
arm_linear_interp_instance_f32_init(dsp_arm_linear_interp_instance_f32Object * self,PyObject * args,PyObject * kwds)87 arm_linear_interp_instance_f32_init(dsp_arm_linear_interp_instance_f32Object *self, PyObject *args, PyObject *kwds)
88 {
89
90 PyObject *pYData=NULL;
91 char *kwlist[] = {
92 "nValues","x1","xSpacing","pYData",NULL
93 };
94
95 if (PyArg_ParseTupleAndKeywords(args, kwds, "|iffO", kwlist,&self->instance->nValues
96 ,&self->instance->x1
97 ,&self->instance->xSpacing
98 ,&pYData
99 ))
100 {
101
102 INITARRAYFIELD(pYData,NPY_DOUBLE,double,float32_t);
103
104 }
105 return 0;
106 }
107
108 GETFIELD(arm_linear_interp_instance_f32,nValues,"i");
109 GETFIELD(arm_linear_interp_instance_f32,x1,"f");
110 GETFIELD(arm_linear_interp_instance_f32,xSpacing,"f");
111
112
113 static PyMethodDef arm_linear_interp_instance_f32_methods[] = {
114
115 {"nValues", (PyCFunction) Method_arm_linear_interp_instance_f32_nValues,METH_NOARGS,"nValues"},
116 {"x1", (PyCFunction) Method_arm_linear_interp_instance_f32_x1,METH_NOARGS,"x1"},
117 {"xSpacing", (PyCFunction) Method_arm_linear_interp_instance_f32_xSpacing,METH_NOARGS,"xSpacing"},
118
119 {NULL} /* Sentinel */
120 };
121
122
123 DSPType(arm_linear_interp_instance_f32,arm_linear_interp_instance_f32_new,arm_linear_interp_instance_f32_dealloc,arm_linear_interp_instance_f32_init,arm_linear_interp_instance_f32_methods);
124
125
126 typedef struct {
127 PyObject_HEAD
128 arm_bilinear_interp_instance_f32 *instance;
129 } dsp_arm_bilinear_interp_instance_f32Object;
130
131
132 static void
arm_bilinear_interp_instance_f32_dealloc(dsp_arm_bilinear_interp_instance_f32Object * self)133 arm_bilinear_interp_instance_f32_dealloc(dsp_arm_bilinear_interp_instance_f32Object* self)
134 {
135 //printf("Dealloc called\n");
136 if (self->instance)
137 {
138
139
140 if (self->instance->pData)
141 {
142 PyMem_Free(self->instance->pData);
143 }
144
145
146 PyMem_Free(self->instance);
147 }
148
149 Py_TYPE(self)->tp_free((PyObject*)self);
150 }
151
152
153 static PyObject *
arm_bilinear_interp_instance_f32_new(PyTypeObject * type,PyObject * args,PyObject * kwds)154 arm_bilinear_interp_instance_f32_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
155 {
156 dsp_arm_bilinear_interp_instance_f32Object *self;
157 //printf("New called\n");
158
159 self = (dsp_arm_bilinear_interp_instance_f32Object *)type->tp_alloc(type, 0);
160 //printf("alloc called\n");
161
162 if (self != NULL) {
163
164 self->instance = PyMem_Malloc(sizeof(arm_bilinear_interp_instance_f32));
165
166 self->instance->pData = NULL;
167
168 }
169
170
171 return (PyObject *)self;
172 }
173
174 static int
arm_bilinear_interp_instance_f32_init(dsp_arm_bilinear_interp_instance_f32Object * self,PyObject * args,PyObject * kwds)175 arm_bilinear_interp_instance_f32_init(dsp_arm_bilinear_interp_instance_f32Object *self, PyObject *args, PyObject *kwds)
176 {
177
178 PyObject *pData=NULL;
179 char *kwlist[] = {
180 "numRows","numCols","pData",NULL
181 };
182
183 if (PyArg_ParseTupleAndKeywords(args, kwds, "|hhO", kwlist,&self->instance->numRows
184 ,&self->instance->numCols
185 ,&pData
186 ))
187 {
188
189 INITARRAYFIELD(pData,NPY_DOUBLE,double,float32_t);
190
191 }
192 return 0;
193 }
194
195 GETFIELD(arm_bilinear_interp_instance_f32,numRows,"h");
196 GETFIELD(arm_bilinear_interp_instance_f32,numCols,"h");
197
198
199 static PyMethodDef arm_bilinear_interp_instance_f32_methods[] = {
200
201 {"numRows", (PyCFunction) Method_arm_bilinear_interp_instance_f32_numRows,METH_NOARGS,"numRows"},
202 {"numCols", (PyCFunction) Method_arm_bilinear_interp_instance_f32_numCols,METH_NOARGS,"numCols"},
203
204 {NULL} /* Sentinel */
205 };
206
207
208 DSPType(arm_bilinear_interp_instance_f32,arm_bilinear_interp_instance_f32_new,arm_bilinear_interp_instance_f32_dealloc,arm_bilinear_interp_instance_f32_init,arm_bilinear_interp_instance_f32_methods);
209
210
211 typedef struct {
212 PyObject_HEAD
213 arm_bilinear_interp_instance_q31 *instance;
214 } dsp_arm_bilinear_interp_instance_q31Object;
215
216
217 static void
arm_bilinear_interp_instance_q31_dealloc(dsp_arm_bilinear_interp_instance_q31Object * self)218 arm_bilinear_interp_instance_q31_dealloc(dsp_arm_bilinear_interp_instance_q31Object* self)
219 {
220 //printf("Dealloc called\n");
221 if (self->instance)
222 {
223
224
225 if (self->instance->pData)
226 {
227 PyMem_Free(self->instance->pData);
228 }
229
230
231 PyMem_Free(self->instance);
232 }
233
234 Py_TYPE(self)->tp_free((PyObject*)self);
235 }
236
237
238 static PyObject *
arm_bilinear_interp_instance_q31_new(PyTypeObject * type,PyObject * args,PyObject * kwds)239 arm_bilinear_interp_instance_q31_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
240 {
241 dsp_arm_bilinear_interp_instance_q31Object *self;
242 //printf("New called\n");
243
244 self = (dsp_arm_bilinear_interp_instance_q31Object *)type->tp_alloc(type, 0);
245 //printf("alloc called\n");
246
247 if (self != NULL) {
248
249 self->instance = PyMem_Malloc(sizeof(arm_bilinear_interp_instance_q31));
250
251 self->instance->pData = NULL;
252
253 }
254
255
256 return (PyObject *)self;
257 }
258
259 static int
arm_bilinear_interp_instance_q31_init(dsp_arm_bilinear_interp_instance_q31Object * self,PyObject * args,PyObject * kwds)260 arm_bilinear_interp_instance_q31_init(dsp_arm_bilinear_interp_instance_q31Object *self, PyObject *args, PyObject *kwds)
261 {
262
263 PyObject *pData=NULL;
264 char *kwlist[] = {
265 "numRows","numCols","pData",NULL
266 };
267
268 if (PyArg_ParseTupleAndKeywords(args, kwds, "|hhO", kwlist,&self->instance->numRows
269 ,&self->instance->numCols
270 ,&pData
271 ))
272 {
273
274 INITARRAYFIELD(pData,NPY_INT32,int32_t,int32_t);
275
276 }
277 return 0;
278 }
279
280 GETFIELD(arm_bilinear_interp_instance_q31,numRows,"h");
281 GETFIELD(arm_bilinear_interp_instance_q31,numCols,"h");
282
283
284 static PyMethodDef arm_bilinear_interp_instance_q31_methods[] = {
285
286 {"numRows", (PyCFunction) Method_arm_bilinear_interp_instance_q31_numRows,METH_NOARGS,"numRows"},
287 {"numCols", (PyCFunction) Method_arm_bilinear_interp_instance_q31_numCols,METH_NOARGS,"numCols"},
288
289 {NULL} /* Sentinel */
290 };
291
292
293 DSPType(arm_bilinear_interp_instance_q31,arm_bilinear_interp_instance_q31_new,arm_bilinear_interp_instance_q31_dealloc,arm_bilinear_interp_instance_q31_init,arm_bilinear_interp_instance_q31_methods);
294
295
296 typedef struct {
297 PyObject_HEAD
298 arm_bilinear_interp_instance_q15 *instance;
299 } dsp_arm_bilinear_interp_instance_q15Object;
300
301
302 static void
arm_bilinear_interp_instance_q15_dealloc(dsp_arm_bilinear_interp_instance_q15Object * self)303 arm_bilinear_interp_instance_q15_dealloc(dsp_arm_bilinear_interp_instance_q15Object* self)
304 {
305 //printf("Dealloc called\n");
306 if (self->instance)
307 {
308
309
310 if (self->instance->pData)
311 {
312 PyMem_Free(self->instance->pData);
313 }
314
315
316 PyMem_Free(self->instance);
317 }
318
319 Py_TYPE(self)->tp_free((PyObject*)self);
320 }
321
322
323 static PyObject *
arm_bilinear_interp_instance_q15_new(PyTypeObject * type,PyObject * args,PyObject * kwds)324 arm_bilinear_interp_instance_q15_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
325 {
326 dsp_arm_bilinear_interp_instance_q15Object *self;
327 //printf("New called\n");
328
329 self = (dsp_arm_bilinear_interp_instance_q15Object *)type->tp_alloc(type, 0);
330 //printf("alloc called\n");
331
332 if (self != NULL) {
333
334 self->instance = PyMem_Malloc(sizeof(arm_bilinear_interp_instance_q15));
335
336 self->instance->pData = NULL;
337
338 }
339
340
341 return (PyObject *)self;
342 }
343
344 static int
arm_bilinear_interp_instance_q15_init(dsp_arm_bilinear_interp_instance_q15Object * self,PyObject * args,PyObject * kwds)345 arm_bilinear_interp_instance_q15_init(dsp_arm_bilinear_interp_instance_q15Object *self, PyObject *args, PyObject *kwds)
346 {
347
348 PyObject *pData=NULL;
349 char *kwlist[] = {
350 "numRows","numCols","pData",NULL
351 };
352
353 if (PyArg_ParseTupleAndKeywords(args, kwds, "|hhO", kwlist,&self->instance->numRows
354 ,&self->instance->numCols
355 ,&pData
356 ))
357 {
358
359 INITARRAYFIELD(pData,NPY_INT16,int16_t,int16_t);
360
361 }
362 return 0;
363 }
364
365 GETFIELD(arm_bilinear_interp_instance_q15,numRows,"h");
366 GETFIELD(arm_bilinear_interp_instance_q15,numCols,"h");
367
368
369 static PyMethodDef arm_bilinear_interp_instance_q15_methods[] = {
370
371 {"numRows", (PyCFunction) Method_arm_bilinear_interp_instance_q15_numRows,METH_NOARGS,"numRows"},
372 {"numCols", (PyCFunction) Method_arm_bilinear_interp_instance_q15_numCols,METH_NOARGS,"numCols"},
373
374 {NULL} /* Sentinel */
375 };
376
377
378 DSPType(arm_bilinear_interp_instance_q15,arm_bilinear_interp_instance_q15_new,arm_bilinear_interp_instance_q15_dealloc,arm_bilinear_interp_instance_q15_init,arm_bilinear_interp_instance_q15_methods);
379
380
381 typedef struct {
382 PyObject_HEAD
383 arm_bilinear_interp_instance_q7 *instance;
384 } dsp_arm_bilinear_interp_instance_q7Object;
385
386
387 static void
arm_bilinear_interp_instance_q7_dealloc(dsp_arm_bilinear_interp_instance_q7Object * self)388 arm_bilinear_interp_instance_q7_dealloc(dsp_arm_bilinear_interp_instance_q7Object* self)
389 {
390 //printf("Dealloc called\n");
391 if (self->instance)
392 {
393
394
395 if (self->instance->pData)
396 {
397 PyMem_Free(self->instance->pData);
398 }
399
400
401 PyMem_Free(self->instance);
402 }
403
404 Py_TYPE(self)->tp_free((PyObject*)self);
405 }
406
407
408 static PyObject *
arm_bilinear_interp_instance_q7_new(PyTypeObject * type,PyObject * args,PyObject * kwds)409 arm_bilinear_interp_instance_q7_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
410 {
411 dsp_arm_bilinear_interp_instance_q7Object *self;
412 //printf("New called\n");
413
414 self = (dsp_arm_bilinear_interp_instance_q7Object *)type->tp_alloc(type, 0);
415 //printf("alloc called\n");
416
417 if (self != NULL) {
418
419 self->instance = PyMem_Malloc(sizeof(arm_bilinear_interp_instance_q7));
420
421 self->instance->pData = NULL;
422
423 }
424
425
426 return (PyObject *)self;
427 }
428
429 static int
arm_bilinear_interp_instance_q7_init(dsp_arm_bilinear_interp_instance_q7Object * self,PyObject * args,PyObject * kwds)430 arm_bilinear_interp_instance_q7_init(dsp_arm_bilinear_interp_instance_q7Object *self, PyObject *args, PyObject *kwds)
431 {
432
433 PyObject *pData=NULL;
434 char *kwlist[] = {
435 "numRows","numCols","pData",NULL
436 };
437
438 if (PyArg_ParseTupleAndKeywords(args, kwds, "|hhO", kwlist,&self->instance->numRows
439 ,&self->instance->numCols
440 ,&pData
441 ))
442 {
443
444 INITARRAYFIELD(pData,NPY_BYTE,int8_t,q7_t);
445
446 }
447 return 0;
448 }
449
450 GETFIELD(arm_bilinear_interp_instance_q7,numRows,"h");
451 GETFIELD(arm_bilinear_interp_instance_q7,numCols,"h");
452
453
454 static PyMethodDef arm_bilinear_interp_instance_q7_methods[] = {
455
456 {"numRows", (PyCFunction) Method_arm_bilinear_interp_instance_q7_numRows,METH_NOARGS,"numRows"},
457 {"numCols", (PyCFunction) Method_arm_bilinear_interp_instance_q7_numCols,METH_NOARGS,"numCols"},
458
459 {NULL} /* Sentinel */
460 };
461
462
463 DSPType(arm_bilinear_interp_instance_q7,arm_bilinear_interp_instance_q7_new,arm_bilinear_interp_instance_q7_dealloc,arm_bilinear_interp_instance_q7_init,arm_bilinear_interp_instance_q7_methods);
464
465
466 typedef struct {
467 PyObject_HEAD
468 arm_spline_instance_f32 *instance;
469 } dsp_arm_spline_instance_f32Object;
470
471
472 static void
arm_spline_instance_f32_dealloc(dsp_arm_spline_instance_f32Object * self)473 arm_spline_instance_f32_dealloc(dsp_arm_spline_instance_f32Object* self)
474 {
475 //printf("Dealloc called\n");
476 if (self->instance)
477 {
478
479
480 if (self->instance->x)
481 {
482 PyMem_Free((float32_t *)self->instance->x);
483 }
484
485 if (self->instance->y)
486 {
487 PyMem_Free((float32_t *)self->instance->y);
488 }
489
490 if (self->instance->coeffs)
491 {
492 PyMem_Free((float32_t *)self->instance->coeffs);
493 }
494
495
496 PyMem_Free(self->instance);
497 }
498
499 Py_TYPE(self)->tp_free((PyObject*)self);
500 }
501
502
503 static PyObject *
arm_spline_instance_f32_new(PyTypeObject * type,PyObject * args,PyObject * kwds)504 arm_spline_instance_f32_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
505 {
506 dsp_arm_spline_instance_f32Object *self;
507 //printf("New called\n");
508
509 self = (dsp_arm_spline_instance_f32Object *)type->tp_alloc(type, 0);
510 //printf("alloc called\n");
511
512 if (self != NULL) {
513
514 self->instance = PyMem_Malloc(sizeof(arm_spline_instance_f32));
515
516 self->instance->x = NULL;
517 self->instance->y = NULL;
518 self->instance->coeffs = NULL;
519
520 }
521
522
523 return (PyObject *)self;
524 }
525
526 static int
arm_spline_instance_f32_init(dsp_arm_spline_instance_f32Object * self,PyObject * args,PyObject * kwds)527 arm_spline_instance_f32_init(dsp_arm_spline_instance_f32Object *self, PyObject *args, PyObject *kwds)
528 {
529
530 PyObject *x=NULL;
531 PyObject *y=NULL;
532
533 char *kwlist[] = {
534 "type","x","y","n_x",NULL
535 };
536
537 if (PyArg_ParseTupleAndKeywords(args, kwds, "|iOOi", kwlist,&self->instance->type
538 ,&x
539 ,&y
540 ,&self->instance->type
541 ))
542 {
543
544 INITARRAYFIELD(x,NPY_DOUBLE,double,float32_t);
545 INITARRAYFIELD(y,NPY_DOUBLE,double,float32_t);
546
547 }
548 return 0;
549 }
550
551 GETFIELD(arm_spline_instance_f32,type,"i");
552 GETFIELD(arm_spline_instance_f32,n_x,"i");
553
554
555 static PyMethodDef arm_spline_instance_f32_methods[] = {
556
557 {"type", (PyCFunction) Method_arm_spline_instance_f32_type,METH_NOARGS,"type"},
558 {"n_x", (PyCFunction) Method_arm_spline_instance_f32_n_x,METH_NOARGS,"n_x"},
559
560 {NULL} /* Sentinel */
561 };
562
563
564 DSPType(arm_spline_instance_f32,arm_spline_instance_f32_new,arm_spline_instance_f32_dealloc,arm_spline_instance_f32_init,arm_spline_instance_f32_methods);
565
566
567
typeRegistration(PyObject * module)568 void typeRegistration(PyObject *module) {
569
570
571
572
573 ADDTYPE(arm_linear_interp_instance_f32);
574 ADDTYPE(arm_bilinear_interp_instance_f32);
575 ADDTYPE(arm_bilinear_interp_instance_q31);
576 ADDTYPE(arm_bilinear_interp_instance_q15);
577 ADDTYPE(arm_bilinear_interp_instance_q7);
578 ADDTYPE(arm_spline_instance_f32);
579
580 }
581
582
583
584
585
586 static PyObject *
cmsis_arm_linear_interp_f32(PyObject * obj,PyObject * args)587 cmsis_arm_linear_interp_f32(PyObject *obj, PyObject *args)
588 {
589
590 PyObject *S=NULL; // input
591 float32_t x; // input
592
593 if (PyArg_ParseTuple(args,"Of",&S,&x))
594 {
595
596 dsp_arm_linear_interp_instance_f32Object *selfS = (dsp_arm_linear_interp_instance_f32Object *)S;
597
598 float32_t returnValue = arm_linear_interp_f32(selfS->instance,x);
599 PyObject* theReturnOBJ=Py_BuildValue("f",returnValue);
600
601 PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
602
603 Py_DECREF(theReturnOBJ);
604 return(pythonResult);
605
606 }
607 return(NULL);
608 }
609
610
611 static PyObject *
cmsis_arm_linear_interp_q31(PyObject * obj,PyObject * args)612 cmsis_arm_linear_interp_q31(PyObject *obj, PyObject *args)
613 {
614
615 PyObject *pYData=NULL; // input
616 q31_t *pYData_converted=NULL; // input
617 q31_t x; // input
618 uint32_t nValues; // input
619
620 if (PyArg_ParseTuple(args,"Oii",&pYData,&x,&nValues))
621 {
622
623 GETARGUMENT(pYData,NPY_INT32,int32_t,int32_t);
624
625 q31_t returnValue = arm_linear_interp_q31(pYData_converted,x,nValues);
626 PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
627
628 PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
629
630 Py_DECREF(theReturnOBJ);
631 FREEARGUMENT(pYData_converted);
632 return(pythonResult);
633
634 }
635 return(NULL);
636 }
637
638
639 static PyObject *
cmsis_arm_linear_interp_q15(PyObject * obj,PyObject * args)640 cmsis_arm_linear_interp_q15(PyObject *obj, PyObject *args)
641 {
642
643 PyObject *pYData=NULL; // input
644 q15_t *pYData_converted=NULL; // input
645 q31_t x; // input
646 uint32_t nValues; // input
647
648 if (PyArg_ParseTuple(args,"Oii",&pYData,&x,&nValues))
649 {
650
651 GETARGUMENT(pYData,NPY_INT16,int16_t,int16_t);
652
653 q15_t returnValue = arm_linear_interp_q15(pYData_converted,x,nValues);
654 PyObject* theReturnOBJ=Py_BuildValue("h",returnValue);
655
656 PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
657
658 Py_DECREF(theReturnOBJ);
659 FREEARGUMENT(pYData_converted);
660 return(pythonResult);
661
662 }
663 return(NULL);
664 }
665
666
667 static PyObject *
cmsis_arm_linear_interp_q7(PyObject * obj,PyObject * args)668 cmsis_arm_linear_interp_q7(PyObject *obj, PyObject *args)
669 {
670
671 PyObject *pYData=NULL; // input
672 q7_t *pYData_converted=NULL; // input
673 q31_t x; // input
674 uint32_t nValues; // input
675
676 if (PyArg_ParseTuple(args,"Oii",&pYData,&x,&nValues))
677 {
678
679 GETARGUMENT(pYData,NPY_BYTE,int8_t,q7_t);
680
681 q7_t returnValue = arm_linear_interp_q7(pYData_converted,x,nValues);
682 PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
683
684 PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
685
686 Py_DECREF(theReturnOBJ);
687 FREEARGUMENT(pYData_converted);
688 return(pythonResult);
689
690 }
691 return(NULL);
692 }
693
694
695
696
697 static PyObject *
cmsis_arm_bilinear_interp_f32(PyObject * obj,PyObject * args)698 cmsis_arm_bilinear_interp_f32(PyObject *obj, PyObject *args)
699 {
700
701 PyObject *S=NULL; // input
702 float32_t X; // input
703 float32_t Y; // input
704
705 if (PyArg_ParseTuple(args,"Off",&S,&X,&Y))
706 {
707
708 dsp_arm_bilinear_interp_instance_f32Object *selfS = (dsp_arm_bilinear_interp_instance_f32Object *)S;
709
710 float32_t returnValue = arm_bilinear_interp_f32(selfS->instance,X,Y);
711 PyObject* theReturnOBJ=Py_BuildValue("f",returnValue);
712
713 PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
714
715 Py_DECREF(theReturnOBJ);
716 return(pythonResult);
717
718 }
719 return(NULL);
720 }
721
722
723 static PyObject *
cmsis_arm_bilinear_interp_q31(PyObject * obj,PyObject * args)724 cmsis_arm_bilinear_interp_q31(PyObject *obj, PyObject *args)
725 {
726
727 PyObject *S=NULL; // input
728 q31_t X; // input
729 q31_t Y; // input
730
731 if (PyArg_ParseTuple(args,"Oii",&S,&X,&Y))
732 {
733
734 dsp_arm_bilinear_interp_instance_q31Object *selfS = (dsp_arm_bilinear_interp_instance_q31Object *)S;
735
736 q31_t returnValue = arm_bilinear_interp_q31(selfS->instance,X,Y);
737 PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
738
739 PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
740
741 Py_DECREF(theReturnOBJ);
742 return(pythonResult);
743
744 }
745 return(NULL);
746 }
747
748
749 static PyObject *
cmsis_arm_bilinear_interp_q15(PyObject * obj,PyObject * args)750 cmsis_arm_bilinear_interp_q15(PyObject *obj, PyObject *args)
751 {
752
753 PyObject *S=NULL; // input
754 q31_t X; // input
755 q31_t Y; // input
756
757 if (PyArg_ParseTuple(args,"Oii",&S,&X,&Y))
758 {
759
760 dsp_arm_bilinear_interp_instance_q15Object *selfS = (dsp_arm_bilinear_interp_instance_q15Object *)S;
761
762 q15_t returnValue = arm_bilinear_interp_q15(selfS->instance,X,Y);
763 PyObject* theReturnOBJ=Py_BuildValue("h",returnValue);
764
765 PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
766
767 Py_DECREF(theReturnOBJ);
768 return(pythonResult);
769
770 }
771 return(NULL);
772 }
773
774
775 static PyObject *
cmsis_arm_bilinear_interp_q7(PyObject * obj,PyObject * args)776 cmsis_arm_bilinear_interp_q7(PyObject *obj, PyObject *args)
777 {
778
779 PyObject *S=NULL; // input
780 q31_t X; // input
781 q31_t Y; // input
782
783 if (PyArg_ParseTuple(args,"Oii",&S,&X,&Y))
784 {
785
786 dsp_arm_bilinear_interp_instance_q7Object *selfS = (dsp_arm_bilinear_interp_instance_q7Object *)S;
787
788 q7_t returnValue = arm_bilinear_interp_q7(selfS->instance,X,Y);
789 PyObject* theReturnOBJ=Py_BuildValue("i",returnValue);
790
791 PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
792
793 Py_DECREF(theReturnOBJ);
794 return(pythonResult);
795
796 }
797 return(NULL);
798 }
799
800
801
802 static PyObject *
cmsis_arm_spline_init_f32(PyObject * obj,PyObject * args)803 cmsis_arm_spline_init_f32(PyObject *obj, PyObject *args)
804 {
805
806 PyObject *S=NULL; // input
807 uint32_t type;
808 PyObject *pX=NULL; // input
809 float32_t *pX_converted=NULL; // input
810 PyObject *pY=NULL; // input
811 float32_t *pY_converted=NULL; // input
812 uint32_t n;
813
814 if (PyArg_ParseTuple(args,"OiOO",&S,&type,&pX,&pY))
815 {
816
817 dsp_arm_spline_instance_f32Object *selfS = (dsp_arm_spline_instance_f32Object *)S;
818
819 GETARGUMENT(pX,NPY_DOUBLE,double,float32_t);
820 GETARGUMENT(pY,NPY_DOUBLE,double,float32_t);
821 n = arraySizepX ;
822 float32_t * coeffs=PyMem_Malloc(sizeof(float32_t)*n*3);
823 float32_t * tempBuffer=PyMem_Malloc(sizeof(float32_t)*n*2);
824
825 arm_spline_init_f32(selfS->instance,
826 type,pX_converted,pY_converted,n,coeffs,tempBuffer);
827
828 PyObject* theReturnOBJ=Py_BuildValue("i",0);
829
830 PyObject *pythonResult = Py_BuildValue("O",theReturnOBJ);
831
832 Py_DECREF(theReturnOBJ);
833 PyMem_Free(tempBuffer);
834 return(pythonResult);
835
836 }
837 return(NULL);
838 }
839
840 static PyObject *
cmsis_arm_spline_f32(PyObject * obj,PyObject * args)841 cmsis_arm_spline_f32(PyObject *obj, PyObject *args)
842 {
843
844 PyObject *S=NULL; // input
845 PyObject *pSrc=NULL; // input
846 float32_t *pSrc_converted=NULL; // input
847 float32_t *pDst=NULL; // output
848 uint32_t blockSize; // input
849
850 if (PyArg_ParseTuple(args,"OO",&S,&pSrc))
851 {
852
853 dsp_arm_spline_instance_f32Object *selfS = (dsp_arm_spline_instance_f32Object *)S;
854 GETARGUMENT(pSrc,NPY_DOUBLE,double,float32_t);
855 blockSize = arraySizepSrc ;
856
857 pDst=PyMem_Malloc(sizeof(float32_t)*blockSize);
858
859
860 arm_spline_f32(selfS->instance,pSrc_converted,pDst,blockSize);
861 FLOATARRAY1(pDstOBJ,blockSize,pDst);
862
863 PyObject *pythonResult = Py_BuildValue("O",pDstOBJ);
864
865 FREEARGUMENT(pSrc_converted);
866 Py_DECREF(pDstOBJ);
867 return(pythonResult);
868
869 }
870 return(NULL);
871 }
872
873 static PyMethodDef CMSISDSPMethods[] = {
874
875
876
877 {"arm_linear_interp_f32", cmsis_arm_linear_interp_f32, METH_VARARGS,""},
878 {"arm_linear_interp_q31", cmsis_arm_linear_interp_q31, METH_VARARGS,""},
879 {"arm_linear_interp_q15", cmsis_arm_linear_interp_q15, METH_VARARGS,""},
880 {"arm_linear_interp_q7", cmsis_arm_linear_interp_q7, METH_VARARGS,""},
881
882 {"arm_bilinear_interp_f32", cmsis_arm_bilinear_interp_f32, METH_VARARGS,""},
883 {"arm_bilinear_interp_q31", cmsis_arm_bilinear_interp_q31, METH_VARARGS,""},
884 {"arm_bilinear_interp_q15", cmsis_arm_bilinear_interp_q15, METH_VARARGS,""},
885 {"arm_bilinear_interp_q7", cmsis_arm_bilinear_interp_q7, METH_VARARGS,""},
886 {"arm_spline_f32", cmsis_arm_spline_f32, METH_VARARGS,""},
887 {"arm_spline_init_f32", cmsis_arm_spline_init_f32, METH_VARARGS,""},
888 {"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},
889 {NULL, NULL, 0, NULL} /* Sentinel */
890 };
891
892 #ifdef IS_PY3K
cmsisdsp_traverse(PyObject * m,visitproc visit,void * arg)893 static int cmsisdsp_traverse(PyObject *m, visitproc visit, void *arg) {
894 Py_VISIT(GETSTATE(m)->error);
895 return 0;
896 }
897
cmsisdsp_clear(PyObject * m)898 static int cmsisdsp_clear(PyObject *m) {
899 Py_CLEAR(GETSTATE(m)->error);
900 return 0;
901 }
902
903
904 static struct PyModuleDef moduledef = {
905 PyModuleDef_HEAD_INIT,
906 MODNAME,
907 NULL,
908 sizeof(struct module_state),
909 CMSISDSPMethods,
910 NULL,
911 cmsisdsp_traverse,
912 cmsisdsp_clear,
913 NULL
914 };
915
916 #define INITERROR return NULL
917
918 PyMODINIT_FUNC
CAT(PyInit_,MODINITNAME)919 CAT(PyInit_,MODINITNAME)(void)
920
921
922 #else
923 #define INITERROR return
924
925 void CAT(init,MODINITNAME)(void)
926 #endif
927 {
928 import_array();
929
930 #ifdef IS_PY3K
931 PyObject *module = PyModule_Create(&moduledef);
932 #else
933 PyObject *module = Py_InitModule(MODNAME, CMSISDSPMethods);
934 #endif
935
936 if (module == NULL)
937 INITERROR;
938 struct module_state *st = GETSTATE(module);
939
940 st->error = PyErr_NewException(MODNAME".Error", NULL, NULL);
941 if (st->error == NULL) {
942 Py_DECREF(module);
943 INITERROR;
944 }
945
946
947 typeRegistration(module);
948
949 #ifdef IS_PY3K
950 return module;
951 #endif
952 }