Анализ биомедицинских сигналов
15

        dst[i] = dst[i - 1] - src[i] / 32;

        if (i > 15)

            dst[i] += src[i - 16];

        if (i > 16)

            dst[i] -= src[i - 17];

        if (i > 31)

            dst[i] += src[i - 32] / 32;

    }

}

 

// Применение низкочастотного фильтра

static void band_filters_impl_lo(const float *src, float *dst, Py_ssize_t size) {

    Py_ssize_t i = 0;

    for (; i < size; i++) {

        if (i < 2)

            dst[i] = src[i];

        else {

            dst[i] = 2 * dst[i - 1] - dst[i - 2] + src[i] / 32;

            if (i > 5)

                dst[i] -= src[i - 6] / 16;

            if (i > 11)

                dst[i] += src[i - 12] / 32;

        }

    }

}

 

// Вызывается ф-ия напрямую из питона

PyObject *band_filter(PyObject *self, PyObject *args) {

    PyObject *data, *result = NULL;

    PyObject *x, *y, *ry;

    Py_ssize_t size;

 

    if (!PyArg_ParseTuple(args, "O!", &PyTuple_Type, &data)) // Проверка ввода

        return err_str("Incorrect input");

 

    size = PyTuple_Size(data); // Проверка ввода

    if (!size)

        return err_str("Incorrect tuple given");

    if (size != 2)

        return err_str("Tuple must contain 2 tuples (x & y)");

 

    PyArg_Parse(PyTuple_GetItem(data, 0), "O!", &PyTuple_Type, &x); // Вытаскивание значений по х, у из питона

    PyArg_Parse(PyTuple_GetItem(data, 1), "O!", &PyTuple_Type, &y);

 

    size = PyTuple_Size(x);

    if (!size) // Проверка размеров массивов данных

        return err_str("Incorrect coordinates given (length == 0)");

    if (size != PyTuple_Size(y))

        return err_str("Incorrect coordinates given (x_len != y_len)");