Projekte angelegt
This commit is contained in:
139
simulation/signal_processing/include/signal_path.h
Normal file
139
simulation/signal_processing/include/signal_path.h
Normal file
@@ -0,0 +1,139 @@
|
||||
#define SIGNAL_PATH_H
|
||||
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#define MAX_DELAY_SAMPS 16
|
||||
#if BLOCK_LEN > MAX_FIR_COEFFS
|
||||
#error "BLOCK_LEN must be smaller than MAX_FIR_COEFFS"
|
||||
#endif
|
||||
#define BITSHIFT_16_TO_32 16
|
||||
|
||||
static const int block_len=BLOCK_LEN; // TODO: save this an an cm3 accessible location
|
||||
|
||||
#ifdef PLATFORM_GENERIC
|
||||
typedef long int accum_t;
|
||||
// empty Macros definitions
|
||||
#define chess_storage(mem)
|
||||
#define DMA
|
||||
#define DMB
|
||||
#define DMIO
|
||||
#define chess_loop_range(a,b)
|
||||
#define isr0(a)
|
||||
#define chess_flatten_loop
|
||||
#endif
|
||||
|
||||
typedef struct BufferPtr{ // used as a pointer and length storage container for cirular buffers
|
||||
int buffer_len;
|
||||
int *ptr_start;
|
||||
int *ptr_current;
|
||||
} BufferPtr;
|
||||
|
||||
typedef struct BufferPtrDMB{
|
||||
int buffer_len;
|
||||
int chess_storage(DMB) *ptr_start;
|
||||
int chess_storage(DMB) *ptr_current;
|
||||
} BufferPtrDMB;
|
||||
|
||||
/*Stuct for storage of internal state and configuration for single signal path with a biquad element, a scaling element and a delay*/
|
||||
typedef struct SingleSignalPath{
|
||||
int input_scale; // The scaling bitshift bits for the input signal
|
||||
int x_nbit_bitshift; // The number of bits to scale the input signal
|
||||
int preemph_activated; //Deactivate by initializing with coefficients {1., 0., 0., 0., 0.}
|
||||
int b_preemph[5]; // Preemphasis filter coefficients
|
||||
int _preemph_scale_nbits; // The number of bits used to scale the pre emphasis filter
|
||||
int _xd[2]; //preemphasis biquad filter buffers
|
||||
int _yd[2];
|
||||
int _delay_buffer[MAX_DELAY_SAMPS]; // The delay buffer for the given signal path // chess_storage(DMA)
|
||||
BufferPtr delay_buffer; // The pointers to the delay buffer and actual used length
|
||||
int n_delay_samps; // The delay for the given signal path in samples
|
||||
int weight_actived; //Deactivate by initializing with weight 1.0
|
||||
int weight; // The weight for the given signal path
|
||||
int _weight_scale_nbits; // The number of bits used to scale the weight
|
||||
} SingleSignalPath;
|
||||
|
||||
|
||||
/*Stuct for storage of internal state and configuration for an adaptive fir-lms filter*/
|
||||
// typedef struct LmsFilter{
|
||||
// int lms_mu; // The learning rate for the lms algorithm
|
||||
// int lms_num_fir_coeffs; // Number of coefficients for the adaptive filter
|
||||
// #if BLOCK_LEN == 1
|
||||
// //int _delay_line[MAX_FIR_COEFFS]; // The delay line for the adaptive filter //
|
||||
// BufferDMB delay_line; // The pointer to the delay line
|
||||
// //int chess_storage(DMB) *ptr_delay_line_current; // The pointer to the current position in the delay line
|
||||
// #else
|
||||
// //int chess_storage(%(sizeof(long long))) _delay_line[BLOCK_LEN + MAX_FIR_COEFFS]; // The delay line for the adaptive filter
|
||||
// BufferPtr delay_line; // The pointer to the delay line
|
||||
// //int chess_storage(DMA) *ptr_delay_line_current; // The pointer to the current position in the delay line
|
||||
// //int chess_storage(%(sizeof(long long))) fir_coeffs[MAX_FIR_COEFFS]; // The coefficients for the adaptive filter
|
||||
// #endif
|
||||
// } LmsFilter;
|
||||
// #if BLOCK_LEN == 1
|
||||
// int fir_lms_coeffs[MAX_FIR_COEFFS]; // The coefficients for the adaptive filter //
|
||||
// #else
|
||||
// int chess_storage(%(sizeof(long long))) fir_lms_coeffs[MAX_FIR_COEFFS]; // The coefficients for the adaptive filter
|
||||
// #endif
|
||||
|
||||
#if BLOCK_LEN == 1
|
||||
BufferPtr extern ptr_fir_lms_coeffs;
|
||||
BufferPtrDMB extern chess_storage(DMB) ptr_fir_lms_delay_line;
|
||||
int extern chess_storage(DMB) fir_lms_delay_line[MAX_FIR_COEFFS];
|
||||
|
||||
#else
|
||||
int extern chess_storage(DMA%(sizeof(long long))) fir_lms_delay_line[BLOCK_LEN + MAX_FIR_COEFFS]; // The delay line for the adaptive filter
|
||||
BufferPtr extern ptr_fir_lms_delay_line;
|
||||
BufferPtr extern ptr_fir_lms_coeffs;
|
||||
#endif
|
||||
|
||||
//int extern chess_storage(DMA % (sizeof(long long))) fir_lms_coeffs[MAX_FIR_COEFFS]; // The coefficients for the adaptive filter
|
||||
|
||||
// typedef struct SignalPath{
|
||||
// SingleSignalPath cSensorSignal;
|
||||
// SingleSignalPath accSensorSignal;
|
||||
// LmsFilter lms;
|
||||
// volatile int chess_storage(DMIO:INPUT_PORT_ADD) input_port;
|
||||
// int chess_storage(DMIO:OUTPUT_PORT_ADD) output_port;
|
||||
// } SignalPath;
|
||||
|
||||
typedef enum OutputMode{
|
||||
OUTPUT_MODE_C_SENSOR,
|
||||
OUTPUT_MODE_ACC_SENSOR,
|
||||
OUTPUT_MODE_FIR_LMS,
|
||||
OUTPUT_MODE_FIR,
|
||||
OUTPUT_MODE_FIR_LMS_LEAKY,
|
||||
}OutputMode;
|
||||
|
||||
// void sig_init_preemph_coef(SingleSignalPath *signal, double b0, double b1, double b2, double a1, double a2, int scale_bits);
|
||||
// int sig_init_delay(SingleSignalPath *signal, int delay_samps);
|
||||
// void sig_init_weight(SingleSignalPath *signal, double weight, int scale_nbits);
|
||||
// void sig_init_lms(LmsFilter *signal, double lms_mu, int lms_fir_num_coeffs, int scale_bits);
|
||||
// int inline sig_delay_buffer_load_and_get(SingleSignalPath *signal, int x);
|
||||
// int inline sig_calc_biquad(SingleSignalPath *signal, int x); //TODO: inline ?
|
||||
// int inline sig_calc_weight(SingleSignalPath *signal, int x); //TODO: inline ?
|
||||
// int inline sig_calc_fir_lms_single(LmsFilter *signal, int d, int x); //TODO: inline ?
|
||||
|
||||
//void adapt_coeffs_lpdsp32_single(LmsFilter chess_storage(DMB) *filter, int *fir_lms_coeffs, int out);
|
||||
//sig_calc_fir_lpdsp32_single(BufferPtr *ptr_fir_lms_delay_line, BufferPtr *ptr_fir_lms_coeffs)
|
||||
|
||||
|
||||
|
||||
// top level init and calc functions
|
||||
void init(
|
||||
SingleSignalPath *cSensorSignal, SingleSignalPath *accSensorSignal,
|
||||
//BufferPtrDMB chess_storage(DMB) *ptr_fir_lms_delay_line, BufferPtr *ptr_fir_lms_coeffs,
|
||||
double *b_c, double *b_acc, int delay_c, int delay_acc, double weight_c, double weight_acc, double lms_mu, int lms_fir_num_coeffs);
|
||||
void calc(
|
||||
SingleSignalPath *cSensorSignal, SingleSignalPath *accSensorSignal,
|
||||
//BufferPtrDMB chess_storage(DMB) *ptr_fir_lms_delay_line, BufferPtr *ptr_fir_lms_coeffs,
|
||||
OutputMode output_mode,
|
||||
#if BLOCK_LEN != 1
|
||||
int16_t *cSensor,
|
||||
int16_t *accSensor,
|
||||
#else
|
||||
int16_t volatile chess_storage(DMB) *cSensor,
|
||||
int16_t volatile chess_storage(DMB) *accSensor,
|
||||
#endif
|
||||
int16_t volatile chess_storage(DMB) *out_16
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user