Skip to content

File resamp_dpmfs_core.h

File List > inc > resamp_dpmfs > resamp_dpmfs_core.h

Go to the documentation of this file

#ifndef RESAMP_DPMFS_CORE_H
#define RESAMP_DPMFS_CORE_H

#include "clib_common.h"

#ifdef __cplusplus
extern "C" {
#endif

#define RESAMP_DPMFS_DEFAULT_BLOCK 4096u

typedef struct {
    double          rate;
    size_t          M;        /* polynomial order (1..3)           */
    size_t          N;        /* taps per phase                    */
    int             upsample; /* 1 = interpolation, 0 = decimation */

    /* c[j][(M+1)*N]: row-major coefficient bank [m*N+k] */
    float          *c[2];

    /* NCO */
    uint32_t        phase;
    uint32_t        phase_inc;

    /* Interpolator: dual-buffer power-of-2 delay line */
    float _Complex *delay_buf;
    size_t          delay_cap;
    size_t          delay_mask;
    size_t          delay_head;

    /* Decimator (transposed form): iad[N] + tfd[N-1].
     * iad is rounded up to a multiple of 8 for AVX-512 safety. */
    float _Complex *iad;
    float _Complex *tfd;

    size_t          buf_cap; /* output buffer capacity in samples */
} resamp_dpmfs_state_t;

resamp_dpmfs_state_t *resamp_dpmfs_create(
    size_t poly_order, size_t n_taps,
    const float *c0, const float *c1,
    double rate);

void resamp_dpmfs_destroy(resamp_dpmfs_state_t *state);

void resamp_dpmfs_reset(resamp_dpmfs_state_t *state);

size_t resamp_dpmfs_execute_max_out(resamp_dpmfs_state_t *state);

size_t resamp_dpmfs_execute(resamp_dpmfs_state_t *state,
                            const float complex *in, size_t n_in,
                            float complex *out);

double resamp_dpmfs_get_rate(const resamp_dpmfs_state_t *state);

size_t resamp_dpmfs_get_num_taps(const resamp_dpmfs_state_t *state);

size_t resamp_dpmfs_get_poly_order(const resamp_dpmfs_state_t *state);

#ifdef __cplusplus
}
#endif

#endif /* RESAMP_DPMFS_CORE_H */