Skip to content

File syn_signal.h

File List > dsp > syn_signal.h

Go to the documentation of this file

#ifndef SYN_SIGNAL_H
#define SYN_SIGNAL_H

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ── Instance ───────────────────────────────────────────────────────────── */

typedef struct {
    int32_t *buf;    
    size_t capacity; 
    size_t head;     
    size_t count;    
    /* Running accumulators */
    int64_t sum;        
    int32_t cached_min; 
    int32_t cached_max; 
    bool cache_valid;   
} SYN_Signal;

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

void syn_signal_init(SYN_Signal *sig, int32_t *buf, size_t capacity);

void syn_signal_push(SYN_Signal *sig, int32_t sample);

void syn_signal_clear(SYN_Signal *sig);

static inline size_t syn_signal_count(const SYN_Signal *sig)
{
    return sig->count;
}

static inline bool syn_signal_full(const SYN_Signal *sig)
{
    return sig->count == sig->capacity;
}

int32_t syn_signal_min(SYN_Signal *sig);

int32_t syn_signal_max(SYN_Signal *sig);

static inline int32_t syn_signal_peak_to_peak(SYN_Signal *sig)
{
    if (sig->count == 0)
        return 0;
    return syn_signal_max(sig) - syn_signal_min(sig);
}

static inline int32_t syn_signal_mean(const SYN_Signal *sig)
{
    if (sig->count == 0)
        return 0;
    return (int32_t)(sig->sum / (int64_t)sig->count);
}

static inline int64_t syn_signal_sum(const SYN_Signal *sig)
{
    return sig->sum;
}

int32_t syn_signal_variance_q16(const SYN_Signal *sig);

int32_t syn_signal_latest(const SYN_Signal *sig);

int32_t syn_signal_at(const SYN_Signal *sig, size_t index);

int32_t syn_signal_delta(const SYN_Signal *sig);

int32_t syn_signal_rms_q16(const SYN_Signal *sig);

int32_t syn_signal_std_dev_q16(const SYN_Signal *sig);

int32_t syn_signal_crest_factor_q16(SYN_Signal *sig);

int32_t syn_signal_power_q16(const SYN_Signal *sig);

#ifdef __cplusplus
}
#endif

#endif /* SYN_SIGNAL_H */