Skip to content

File psd_core.h

File List > doppler > psd > psd_core.h

Go to the documentation of this file

#ifndef DP_PSD_CORE_H
#define DP_PSD_CORE_H

#include "doppler/clib_common.h"
#include "doppler/dp_state.h"
#include "doppler/jm_perf.h"
#include "doppler/fft/fft_core.h"
#include "doppler/acc_trace/acc_trace_core.h"
#include "doppler/f32_buffer/f32_buffer_core.h"
#ifdef __cplusplus
extern "C" {
#endif

/* SSOT: enum=psd_window */
enum {
    DP_PSD_WINDOW_HANN = 0,            
    DP_PSD_WINDOW_KAISER = 1,          
    DP_PSD_WINDOW_BLACKMAN_HARRIS = 2, 
    DP_PSD_WINDOW_RECT = 3, 
};

typedef struct {
    dp_fft_state_t *fft;        
    float *w;                   
    float _Complex *frame;      
    float _Complex *spec;       
    float *pwr;                 
    double cg;                  
    double s2;                  
    double enbw;                
    size_t n;                   
    size_t nfft;                
    double full_scale;          
} dp_psd_kernel_t;

int dp_psd_kernel_init(dp_psd_kernel_t *k, size_t n, int window, float beta,
                       size_t pad, double full_scale);

void dp_psd_kernel_free(dp_psd_kernel_t *k);

typedef struct {
    dp_psd_kernel_t k;         
    dp_acc_trace_state_t *avg;    
    float *dbbuf;              
    double enbw;               
    double fs;                 
    size_t bits;               
    size_t hop;                
    dp_f32_t *ring;            
    dp_f32_framer_t fr;        
} dp_psd_state_t;

dp_psd_state_t *dp_psd_create(size_t n, double fs, int window, float beta,
                            size_t pad, double full_scale, size_t bits,
                            int mode, double alpha);

dp_psd_state_t *dp_psd_create_hop(size_t n, double fs, int window, float beta,
                                 size_t pad, double full_scale, size_t bits,
                                 int mode, double alpha, size_t hop);

void dp_psd_destroy(dp_psd_state_t *state);

void dp_psd_reset(dp_psd_state_t *state);

void dp_psd_accumulate(dp_psd_state_t *state, const float _Complex *x,
                      size_t x_len);

void dp_psd_frame_power(dp_psd_kernel_t *k, const float _Complex *x,
                        float *pwr);

void dp_psd_frame_linear(dp_psd_kernel_t *k, const float _Complex *x,
                         float *out);

void dp_psd_frame_db(dp_psd_kernel_t *k, const float _Complex *x,
                     float *out);

void dp_psd_accumulate_real(dp_psd_state_t *state, const float *x, size_t x_len);

size_t dp_psd_power_twosided_max_out(dp_psd_state_t *state);

size_t dp_psd_power_twosided(dp_psd_state_t *state, float *out,
                             size_t max_out);

size_t dp_psd_power_onesided_max_out(dp_psd_state_t *state);

size_t dp_psd_power_onesided(dp_psd_state_t *state, float *out,
                             size_t max_out);

size_t dp_psd_psd_db_max_out(dp_psd_state_t *state);

size_t dp_psd_psd_db(dp_psd_state_t *state, float *out, size_t max_out);

size_t dp_psd_psd_dbhz_max_out(dp_psd_state_t *state);

size_t dp_psd_psd_dbhz(dp_psd_state_t *state, float *out, size_t max_out);

size_t dp_psd_band_power_max_out(dp_psd_state_t *state);

size_t dp_psd_band_power(dp_psd_state_t *state, const double *bands,
                        size_t bands_len, float *out, size_t max_out);

double dp_psd_total_band_power(dp_psd_state_t *state, const double *bands,
                              size_t bands_len);

double dp_psd_occupied_bw(dp_psd_state_t *state, double fraction);

double dp_psd_noise_floor(dp_psd_state_t *state);

double dp_psd_snr(dp_psd_state_t *state, double lo_hz, double hi_hz);

double dp_psd_sfdr(dp_psd_state_t *state, float min_db);
/* ── Serializable state (standard bytes interface; see dp_state.h) ──────────
 * The blob is the acc_trace power averager, then the framer's snapshot of the
 * carried partial frame. Both children have fixed sizes, so the blob's size
 * depends on the config only. hop is a reject key: a blob of another hop is
 * refused, since the carried frame means something different at another hop.
 * Window, plan, scratch, n, nfft and hop are config, rebuilt by create. */
#define PSD_STATE_MAGIC DP_FOURCC ('P','S','D',' ')
#define PSD_STATE_VERSION 2u
size_t dp_psd_state_bytes (const dp_psd_state_t *state);
void dp_psd_get_state (const dp_psd_state_t *state, void *blob);
int dp_psd_set_state (dp_psd_state_t *state, const void *blob);

#ifdef __cplusplus
}
#endif

#endif /* PSD_CORE_H */