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 }