#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #define NUM_CPY_THREADS 8 #include #include #include #include #include // void printArr(int *array); static PyObject *hildebrand_sekhon(PyObject *self, PyObject *args); static PyObject *correlateByBlock(PyObject *self, PyObject *args); #ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ #define PyMODINIT_FUNC void #endif static PyMethodDef extensionsMethods[] = { { "correlateByBlock", (PyCFunction)correlateByBlock, METH_VARARGS, "get correlation by block" }, { "hildebrand_sekhon", (PyCFunction)hildebrand_sekhon, METH_VARARGS, "get noise with hildebrand_sekhon" }, { NULL, NULL, 0, NULL } }; PyMODINIT_FUNC initcSchain() { Py_InitModule("cSchain", extensionsMethods); import_array(); } static PyObject *correlateByBlock(PyObject *self, PyObject *args) { // int *x = (int*) malloc(4000000 * 216 * sizeof(int));; // int a = 5; // x = &a; // int b = 6; // x = &b; // printf("Antes de imprimir x \n"); // printf("%d \n", x[0]); PyObject *data_obj1, *data_obj2; PyArrayObject *data_array1, *data_array2, *correlateRow, *out, *dataRow, *codeRow; //, , int mode; if (!PyArg_ParseTuple(args, "OOi", &data_obj1, &data_obj2, &mode)) return NULL; data_array1 = (PyArrayObject *) PyArray_FROM_OTF(data_obj1, NPY_COMPLEX128, NPY_ARRAY_DEFAULT); data_array2 = (PyArrayObject *) PyArray_FROM_OTF(data_obj2, NPY_FLOAT64, NPY_ARRAY_DEFAULT); npy_intp dims[1]; dims[0] = 200; npy_intp dims_code[1]; dims_code[0] = 16; double complex * dataRaw; double * codeRaw; dataRaw = (double complex*) PyArray_DATA(data_array1); codeRaw = (double *) PyArray_DATA(data_array2); double complex ** outC = malloc(40000*200*sizeof(double complex)); int i; clock_t start = clock(); for(i=0; i<40000; i++){ // codeRow = PyArray_SimpleNewFromData(1, dims_code, NPY_FLOAT64, codeRaw + 16 * i); // dataRow = PyArray_SimpleNewFromData(1, dims, NPY_COMPLEX128, dataRaw + 200 * i); // Py_INCREF(codeRow); // Py_INCREF(dataRow); // PyArray_ENABLEFLAGS(codeRow, NPY_ARRAY_OWNDATA); // PyArray_ENABLEFLAGS(dataRow, NPY_ARRAY_OWNDATA); correlateRow = (PyArrayObject *) PyArray_Correlate2(PyArray_SimpleNewFromData(1, dims_code, NPY_FLOAT64, codeRaw + 16 * i), PyArray_SimpleNewFromData(1, dims, NPY_COMPLEX128, dataRaw + 200 * i), (npy_intp) 2); //Py_INCREF(correlateRow); // PyArray_ENABLEFLAGS(correlateRow, NPY_ARRAY_OWNDATA); memcpy(outC + 200*i, (double complex*) PyArray_DATA(correlateRow), 200 * sizeof(double complex)); Py_DECREF(correlateRow); // Py_DECREF(codeRow); // Py_DECREF(dataRow); } clock_t end = clock(); float seconds = (float)(end - start) / CLOCKS_PER_SEC; printf("%f", seconds); // npy_intp dimsret[2]; dimsret[0] = 40000; dimsret[1] = 200; out = PyArray_SimpleNewFromData(2, dimsret, NPY_COMPLEX128, outC); PyArray_ENABLEFLAGS(out, NPY_ARRAY_OWNDATA); //Py_INCREF(out); Py_DECREF(data_array1); Py_DECREF(data_array2); // PyArray_DebugPrint(out); // Py_DECREF(data_obj2); // Py_DECREF(data_obj1); // Py_DECREF(codeRow); // Py_DECREF(dataRow); // free(dataRaw); // free(codeRaw); return PyArray_Return(out); } static PyObject *hildebrand_sekhon(PyObject *self, PyObject *args) { double navg; PyObject *data_obj, *data_array; if (!PyArg_ParseTuple(args, "Od", &data_obj, &navg)) return NULL; data_array = PyArray_FROM_OTF(data_obj, NPY_FLOAT64, NPY_ARRAY_DEFAULT); if (data_array == NULL) { Py_XDECREF(data_array); Py_XDECREF(data_obj); return NULL; } double *sortdata = (double*)PyArray_DATA(data_array); int lenOfData = (int)PyArray_SIZE(data_array) ; double nums_min = lenOfData*0.2; if (nums_min <= 5) nums_min = 5; double sump = 0; double sumq = 0; int j = 0; int cont = 1; double rtest = 0; while ((cont == 1) && (j < lenOfData)) { sump = sump + sortdata[j]; sumq = sumq + pow(sortdata[j], 2); if (j > nums_min) { rtest = (double)j/(j-1) + 1/navg; if ((sumq*j) > (rtest*pow(sump, 2))) { j = j - 1; sump = sump - sortdata[j]; sumq = sumq - pow(sortdata[j],2); cont = 0; } } j = j + 1; } double lnoise = sump / j; Py_DECREF(data_array); return Py_BuildValue("d", lnoise); }