Skip to content

File syn_kalman.h

File List > dsp > syn_kalman.h

Go to the documentation of this file

#ifndef SYN_KALMAN_H
#define SYN_KALMAN_H

#include "../common/syn_defs.h"
#include "../util/syn_matrix.h"

#ifndef SYN_KALMAN_MAX_STATE
#define SYN_KALMAN_MAX_STATE 6
#endif

#ifndef SYN_KALMAN_MAX_MEAS
#define SYN_KALMAN_MAX_MEAS 4
#endif

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
    SYN_Matrix *x;   
    SYN_Matrix *P;   
    SYN_Matrix *F;   
    SYN_Matrix *Q;   
    SYN_Matrix *H;   
    SYN_Matrix *R;   
    uint8_t n_state; 
    uint8_t n_meas;  
} SYN_Kalman_Config;

typedef struct {
    const SYN_Kalman_Config *cfg; 
    /* Scratch matrices — caller allocates, filter uses internally */
    SYN_Matrix *temp_nn_1; 
    SYN_Matrix *temp_nn_2; 
    SYN_Matrix *temp_nm;   
    SYN_Matrix *temp_mn;   
    SYN_Matrix *temp_mm;   
    SYN_Matrix *temp_mm_2; 
    SYN_Matrix *temp_n1;   
    SYN_Matrix *temp_m1;   
} SYN_Kalman;

#define SYN_KALMAN_SCRATCH_DECL(prefix, NS, NM) \
    SYN_MAT_DECL(prefix##_nn1, NS, NS);         \
    SYN_MAT_DECL(prefix##_nn2, NS, NS);         \
    SYN_MAT_DECL(prefix##_nm, NS, NM);          \
    SYN_MAT_DECL(prefix##_mn, NM, NS);          \
    SYN_MAT_DECL(prefix##_mm, NM, NM);          \
    SYN_MAT_DECL(prefix##_mm2, NM, NM);         \
    SYN_MAT_DECL(prefix##_n1, NS, 1);           \
    SYN_MAT_DECL(prefix##_m1, NM, 1)

#define SYN_KALMAN_SCRATCH_ASSIGN(kf, prefix) \
    do {                                      \
        (kf)->temp_nn_1 = &prefix##_nn1;      \
        (kf)->temp_nn_2 = &prefix##_nn2;      \
        (kf)->temp_nm = &prefix##_nm;         \
        (kf)->temp_mn = &prefix##_mn;         \
        (kf)->temp_mm = &prefix##_mm;         \
        (kf)->temp_mm_2 = &prefix##_mm2;      \
        (kf)->temp_n1 = &prefix##_n1;         \
        (kf)->temp_m1 = &prefix##_m1;         \
    } while (0)

/* ── API ────────────────────────────────────────────────────────────────── */

SYN_Status syn_kalman_init(SYN_Kalman *kf, const SYN_Kalman_Config *cfg);

void syn_kalman_predict(SYN_Kalman *kf);

SYN_Status syn_kalman_update(SYN_Kalman *kf, const SYN_Matrix *z);

#ifdef __cplusplus
}
#endif

#endif /* SYN_KALMAN_H */