Re: Aufrufen und Ausführen einer C-Funktion in Python
Verfasst: Montag 22. November 2021, 08:42
Ohne dieses ganze Pointer-Geschwurbel kommt sogar richtig lesbarer Code raus:
Deine cfilter-Funktion hat keinen Rückgabewert, also solltest Du cfilter.restype nicht als float setzen.
ndpointer macht eine shape-Prüfung. Da solltest Du also die Shapes angeben, die cfilter auch erwartet, dann wird auch automatisch eine Fehlermeldung bei falschen Shapes geworfen. Auch die fixen Längenangaben sollten nicht sein.
Code: Alles auswählen
void bb_digital_float_filter(float *b, float *a, float *x, float *y, float *Z, size_t len_b, size_t len_x, int stride_X, int stride_Y)
{
size_t n, k;
for (k = 0; k < len_x; k++) {
float xn = x[stride_X * k], yn;
if (len_b > 1) {
/* Calculate first delay (output) */
yn = Z[0] + xn * b[0];
/* Fill in middle delays */
for (n = 1; n < len_b - 1; n++) {
Z[n-1] = Z[n] + xn * b[n] - yn * a[n];
}
/* Calculate last delay */
Z[len_b - 2] = xn * b[len_b - 1] - yn * a[len_b - 1];
}
else {
yn = xn * b[0];
}
y[stride_Y * k] = yn / a[0];
}
}
Deine cfilter-Funktion hat keinen Rückgabewert, also solltest Du cfilter.restype nicht als float setzen.
ndpointer macht eine shape-Prüfung. Da solltest Du also die Shapes angeben, die cfilter auch erwartet, dann wird auch automatisch eine Fehlermeldung bei falschen Shapes geworfen. Auch die fixen Längenangaben sollten nicht sein.
Code: Alles auswählen
cfilter.argtypes = [
ndpointer(shape=len(b), dtype=ctypes.c_float),
ndpointer(shape=len(b), dtype=ctypes.c_float),
ndpointer(shape=len(y1), dtype=ctypes.c_float),
ndpointer(shape=len(y1), dtype=ctypes.c_float),
ndpointer(shape=len(b) - 1, dtype=ctypes.c_float),
ctypes.c_size_t, ctypes.c_size_t, ctypes.c_int, ctypes.c_int]
for i in range(0,14):
cfilter(b, a, x[i:i+1], y1, delay, len(b), len(y1), 1, 1)
print('C: y =', y1)