Skip to content

File resamp_core.h

File List > inc > resamp > resamp_core.h

Go to the documentation of this file

#ifndef RESAMP_CORE_H
#define RESAMP_CORE_H

#include "clib_common.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct {
    double   rate;
    size_t   num_phases;
    size_t   num_taps;
    unsigned log2_phases;
    int      upsample;      /* 1 = rate >= 1.0, 0 = rate < 1.0 */

    float   *bank;          /* [num_phases][num_taps], row-major  */

    /* execute state */
    uint32_t phase;
    uint32_t phase_inc;

    /* interpolator / execute_ctrl: dual-buffer delay line */
    float _Complex *delay_buf;  /* 2 × delay_cap elements         */
    size_t          delay_cap;
    size_t          delay_mask;
    size_t          delay_head;

    /* decimator transposed-form state (execute, rate < 1) */
    float _Complex *decim_iad;  /* integrate-and-dump: num_taps   */
    float _Complex *decim_tfd;  /* transposed delay line: num_taps-1 */

    /* execute_ctrl state: double-precision fractional accumulator */
    double ctrl_acc;
} resamp_state_t;

/* ------------------------------------------------------------------
 * Lifecycle
 * ------------------------------------------------------------------ */

resamp_state_t *resamp_create(double rate);

resamp_state_t *resamp_create_custom(
    size_t num_phases, size_t num_taps,
    const float *bank, double rate);

void resamp_destroy(resamp_state_t *state);

void resamp_reset(resamp_state_t *state);

/* ------------------------------------------------------------------
 * Execute
 * ------------------------------------------------------------------ */

size_t resamp_execute(
    resamp_state_t       *state,
    const float _Complex *in,
    size_t                num_in,
    float _Complex       *out,
    size_t                max_out);

size_t resamp_execute_ctrl(
    resamp_state_t       *state,
    const float _Complex *in,
    const float _Complex *ctrl,
    size_t                num_in,
    float _Complex       *out,
    size_t                max_out);

/* ------------------------------------------------------------------
 * Properties
 * ------------------------------------------------------------------ */

double resamp_get_rate(const resamp_state_t *state);

void   resamp_set_rate(resamp_state_t *state, double rate);

size_t resamp_get_num_phases(const resamp_state_t *state);
size_t resamp_get_num_taps(const resamp_state_t *state);

#ifdef __cplusplus
}
#endif

#endif /* RESAMP_CORE_H */