summaryrefslogtreecommitdiff
path: root/numpy/fft/fftpack_litemodule.c
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/fft/fftpack_litemodule.c')
-rw-r--r--numpy/fft/fftpack_litemodule.c275
1 files changed, 275 insertions, 0 deletions
diff --git a/numpy/fft/fftpack_litemodule.c b/numpy/fft/fftpack_litemodule.c
new file mode 100644
index 000000000..4abfe84d3
--- /dev/null
+++ b/numpy/fft/fftpack_litemodule.c
@@ -0,0 +1,275 @@
+#include "fftpack.h"
+#include "Python.h"
+#include "numpy/arrayobject.h"
+
+static PyObject *ErrorObject;
+
+/* ----------------------------------------------------- */
+
+static char fftpack_cfftf__doc__[] ="";
+
+PyObject *
+fftpack_cfftf(PyObject *self, PyObject *args)
+{
+ PyObject *op1, *op2;
+ PyArrayObject *data;
+ double *wsave, *dptr;
+ int npts, nsave, nrepeats, i;
+
+ if(!PyArg_ParseTuple(args, "OO", &op1, &op2)) return NULL;
+ data = (PyArrayObject *)PyArray_CopyFromObject(op1, PyArray_CDOUBLE, 1, 0);
+ if (data == NULL) return NULL;
+ if (PyArray_As1D(&op2, (char **)&wsave, &nsave, PyArray_DOUBLE) == -1)
+ goto fail;
+ if (data == NULL) goto fail;
+
+ npts = data->dimensions[data->nd-1];
+ if (nsave != npts*4+15) {
+ PyErr_SetString(ErrorObject, "invalid work array for fft size");
+ goto fail;
+ }
+
+ nrepeats = PyArray_SIZE(data)/npts;
+ dptr = (double *)data->data;
+ NPY_SIGINT_ON
+ for (i=0; i<nrepeats; i++) {
+ cfftf(npts, dptr, wsave);
+ dptr += npts*2;
+ }
+ NPY_SIGINT_OFF
+ PyArray_Free(op2, (char *)wsave);
+ return (PyObject *)data;
+fail:
+ PyArray_Free(op2, (char *)wsave);
+ Py_DECREF(data);
+ return NULL;
+}
+
+static char fftpack_cfftb__doc__[] ="";
+
+PyObject *
+fftpack_cfftb(PyObject *self, PyObject *args)
+{
+ PyObject *op1, *op2;
+ PyArrayObject *data;
+ double *wsave, *dptr;
+ int npts, nsave, nrepeats, i;
+
+ if(!PyArg_ParseTuple(args, "OO", &op1, &op2)) return NULL;
+ data = (PyArrayObject *)PyArray_CopyFromObject(op1, PyArray_CDOUBLE, 1, 0);
+ if (data == NULL) return NULL;
+ if (PyArray_As1D(&op2, (char **)&wsave, &nsave, PyArray_DOUBLE) == -1)
+ goto fail;
+ if (data == NULL) goto fail;
+
+ npts = data->dimensions[data->nd-1];
+ if (nsave != npts*4+15) {
+ PyErr_SetString(ErrorObject, "invalid work array for fft size");
+ goto fail;
+ }
+
+ nrepeats = PyArray_SIZE(data)/npts;
+ dptr = (double *)data->data;
+ NPY_SIGINT_ON
+ for (i=0; i<nrepeats; i++) {
+ cfftb(npts, dptr, wsave);
+ dptr += npts*2;
+ }
+ NPY_SIGINT_OFF
+ PyArray_Free(op2, (char *)wsave);
+ return (PyObject *)data;
+fail:
+ PyArray_Free(op2, (char *)wsave);
+ Py_DECREF(data);
+ return NULL;
+}
+
+static char fftpack_cffti__doc__[] ="";
+
+static PyObject *
+fftpack_cffti(PyObject *self, PyObject *args)
+{
+ PyArrayObject *op;
+ int dim, n;
+
+ if (!PyArg_ParseTuple(args, "i", &n)) return NULL;
+
+ dim = 4*n+15; /*Magic size needed by cffti*/
+ /*Create a 1 dimensional array of dimensions of type double*/
+ op = (PyArrayObject *)PyArray_FromDims(1, &dim, PyArray_DOUBLE);
+ if (op == NULL) return NULL;
+
+ NPY_SIGINT_ON
+ cffti(n, (double *)((PyArrayObject*)op)->data);
+ NPY_SIGINT_OFF
+
+ return (PyObject *)op;
+}
+
+static char fftpack_rfftf__doc__[] ="";
+
+PyObject *
+fftpack_rfftf(PyObject *self, PyObject *args)
+{
+ PyObject *op1, *op2;
+ PyArrayObject *data, *ret;
+ double *wsave, *dptr, *rptr;
+ int npts, nsave, nrepeats, i, rstep;
+
+ if(!PyArg_ParseTuple(args, "OO", &op1, &op2)) return NULL;
+ data = (PyArrayObject *)PyArray_ContiguousFromObject(op1, PyArray_DOUBLE, 1, 0);
+ if (data == NULL) return NULL;
+ npts = data->dimensions[data->nd-1];
+ data->dimensions[data->nd-1] = npts/2+1;
+ ret = (PyArrayObject *)PyArray_Zeros(data->nd, data->dimensions,
+ PyArray_DescrFromType(PyArray_CDOUBLE), 0);
+ data->dimensions[data->nd-1] = npts;
+ rstep = (ret->dimensions[ret->nd-1])*2;
+
+ if (PyArray_As1D(&op2, (char **)&wsave, &nsave, PyArray_DOUBLE) == -1)
+ goto fail;
+ if (data == NULL || ret == NULL) goto fail;
+
+ if (nsave != npts*2+15) {
+ PyErr_SetString(ErrorObject, "invalid work array for fft size");
+ goto fail;
+ }
+
+ nrepeats = PyArray_SIZE(data)/npts;
+ rptr = (double *)ret->data;
+ dptr = (double *)data->data;
+
+
+ NPY_SIGINT_ON
+ for (i=0; i<nrepeats; i++) {
+ memcpy((char *)(rptr+1), dptr, npts*sizeof(double));
+ rfftf(npts, rptr+1, wsave);
+ rptr[0] = rptr[1];
+ rptr[1] = 0.0;
+ rptr += rstep;
+ dptr += npts;
+ }
+ NPY_SIGINT_OFF
+ PyArray_Free(op2, (char *)wsave);
+ Py_DECREF(data);
+ return (PyObject *)ret;
+fail:
+ PyArray_Free(op2, (char *)wsave);
+ Py_XDECREF(data);
+ Py_XDECREF(ret);
+ return NULL;
+}
+
+static char fftpack_rfftb__doc__[] ="";
+
+
+PyObject *
+fftpack_rfftb(PyObject *self, PyObject *args)
+{
+ PyObject *op1, *op2;
+ PyArrayObject *data, *ret;
+ double *wsave, *dptr, *rptr;
+ int npts, nsave, nrepeats, i;
+
+ if(!PyArg_ParseTuple(args, "OO", &op1, &op2)) return NULL;
+ data = (PyArrayObject *)PyArray_ContiguousFromObject(op1, PyArray_CDOUBLE, 1, 0);
+ if (data == NULL) return NULL;
+ npts = data->dimensions[data->nd-1];
+ ret = (PyArrayObject *)PyArray_Zeros(data->nd, data->dimensions,
+ PyArray_DescrFromType(PyArray_DOUBLE), 0);
+
+ if (PyArray_As1D(&op2, (char **)&wsave, &nsave, PyArray_DOUBLE) == -1)
+ goto fail;
+ if (data == NULL || ret == NULL) goto fail;
+
+ if (nsave != npts*2+15) {
+ PyErr_SetString(ErrorObject, "invalid work array for fft size");
+ goto fail;
+ }
+
+ nrepeats = PyArray_SIZE(ret)/npts;
+ rptr = (double *)ret->data;
+ dptr = (double *)data->data;
+
+ NPY_SIGINT_ON
+ for (i=0; i<nrepeats; i++) {
+ memcpy((char *)(rptr+1), (dptr+2), (npts-1)*sizeof(double));
+ rptr[0] = dptr[0];
+ rfftb(npts, rptr, wsave);
+ rptr += npts;
+ dptr += npts*2;
+ }
+ NPY_SIGINT_OFF
+ PyArray_Free(op2, (char *)wsave);
+ Py_DECREF(data);
+ return (PyObject *)ret;
+fail:
+ PyArray_Free(op2, (char *)wsave);
+ Py_XDECREF(data);
+ Py_XDECREF(ret);
+ return NULL;
+}
+
+
+static char fftpack_rffti__doc__[] ="";
+
+static PyObject *
+fftpack_rffti(PyObject *self, PyObject *args)
+{
+ PyArrayObject *op;
+ int dim, n;
+
+ if (!PyArg_ParseTuple(args, "i", &n)) return NULL;
+
+ dim = 2*n+15; /*Magic size needed by rffti*/
+ /*Create a 1 dimensional array of dimensions of type double*/
+ op = (PyArrayObject *)PyArray_FromDims(1, &dim, PyArray_DOUBLE);
+ if (op == NULL) return NULL;
+
+ NPY_SIGINT_ON
+ rffti(n, (double *)((PyArrayObject*)op)->data);
+ NPY_SIGINT_OFF
+
+ return (PyObject *)op;
+}
+
+
+/* List of methods defined in the module */
+
+static struct PyMethodDef fftpack_methods[] = {
+ {"cfftf", fftpack_cfftf, 1, fftpack_cfftf__doc__},
+ {"cfftb", fftpack_cfftb, 1, fftpack_cfftb__doc__},
+ {"cffti", fftpack_cffti, 1, fftpack_cffti__doc__},
+ {"rfftf", fftpack_rfftf, 1, fftpack_rfftf__doc__},
+ {"rfftb", fftpack_rfftb, 1, fftpack_rfftb__doc__},
+ {"rffti", fftpack_rffti, 1, fftpack_rffti__doc__},
+ {NULL, NULL} /* sentinel */
+};
+
+
+/* Initialization function for the module (*must* be called initfftpack) */
+
+static char fftpack_module_documentation[] =
+""
+;
+
+PyMODINIT_FUNC initfftpack_lite(void)
+{
+ PyObject *m, *d;
+
+ /* Create the module and add the functions */
+ m = Py_InitModule4("fftpack_lite", fftpack_methods,
+ fftpack_module_documentation,
+ (PyObject*)NULL,PYTHON_API_VERSION);
+
+ /* Import the array object */
+ import_array();
+
+ /* Add some symbolic constants to the module */
+ d = PyModule_GetDict(m);
+ ErrorObject = PyErr_NewException("fftpack.error", NULL, NULL);
+ PyDict_SetItemString(d, "error", ErrorObject);
+
+ /* XXXX Add constants here */
+
+}