Aufrufen und Ausführen einer C-Funktion in Python

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Sirius3
User
Beiträge: 15274
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 22. November 2021, 08:42

Ohne dieses ganze Pointer-Geschwurbel kommt sogar richtig lesbarer Code raus:

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)
moon97
User
Beiträge: 10
Registriert: Samstag 20. November 2021, 17:28

Montag 22. November 2021, 09:58

Alles klar. Danke fürs Zeit nehmen und vereinfachen. Ich habe sowohl in C und Python nur grundlegende Kenntnisse. Von daher war ich schon froh, dass das Ganze überhaupt erstmal funktioniert hat.

Wisst ihr wie das mit den Quellenangaben ist, wenn ich deinen veränderten C-Code verwenden würde? Kann man den Forum dann als Link angeben? Alles was nicht von mir selber kommt muss ich ja als Quelle angeben.
__deets__
User
Beiträge: 10711
Registriert: Mittwoch 14. Oktober 2015, 14:29

Montag 22. November 2021, 15:31

Das musst du an sich eher deinen Betreuer fragen. Der legt ja fest, was er akzeptiert. Der Post an sich wird hier nicht verschwinden.
moon97
User
Beiträge: 10
Registriert: Samstag 20. November 2021, 17:28

Montag 22. November 2021, 17:26

Okay, danke.
Antworten