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)");