wdsp/rmatch.h
Uladzimir Karpenka 89c8a0e2b5 first commit
2026-06-01 15:58:45 +03:00

160 lines
4.1 KiB
C

/* rmatch.h
This file is part of a program that implements a Software-Defined Radio.
Copyright (C) 2017, 2022 Warren Pratt, NR0V
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
The author can be reached by email at
warren@wpratt.com
*/
#ifndef _rmatch_h
#define _rmatch_h
#include "varsamp.h"
typedef struct _mav
{
int ringmin;
int ringmax; // must be a power of two
int* ring;
int mask;
int i;
int load;
int sum;
double nom_value;
} mav, *MAV;
typedef struct _aamav
{
int ringmin;
int ringmax; // must be a power of two
int* ring;
int mask;
int i;
int load;
int pos;
int neg;
double nom_ratio;
} aamav, *AAMAV;
typedef struct _rmatch
{
volatile long run;
double* in;
double* out;
int insize;
int outsize;
double* resout;
int nom_inrate;
int nom_outrate;
double nom_ratio;
double inv_nom_ratio;
double fc_high;
double fc_low;
double gain;
double startup_delay;
int auto_ringsize;
int ringsize;
int rsize;
double* ring;
int n_ring;
int iin;
int iout;
double var;
int R;
AAMAV ffmav;
MAV propmav;
int ff_ringmin;
int ff_ringmax; // must be a power of two
double ff_alpha;
double feed_forward;
int prop_ringmin;
int prop_ringmax; // must be a power of two
double prop_gain;
double pr_gain;
double av_deviation;
VARSAMP v;
int varmode;
CRITICAL_SECTION cs_ring;
CRITICAL_SECTION cs_var;
// blend / slew
double tslew;
int ntslew;
double* cslew;
double* baux;
double dlast[2];
int ucnt;
// variables to check start-up time for control to become active
unsigned int readsamps;
unsigned int writesamps;
unsigned int read_startup;
unsigned int write_startup;
int control_flag;
// diagnostics
volatile long underflows;
volatile long overflows;
int force;
double fvar;
} rmatch, *RMATCH;
extern __declspec (dllexport) void* create_rmatchV(int in_size, int out_size, int nom_inrate, int nom_outrate, int ringsize, double var);
extern __declspec (dllexport) void destroy_rmatchV (void* ptr);
extern __declspec (dllexport) void xrmatchOUT (void* b, double* out);
extern __declspec (dllexport) void xrmatchIN (void* b, double* in);
extern __declspec (dllexport) void setRMatchInsize (void* ptr, int insize);
extern __declspec (dllexport) void setRMatchOutsize (void* ptr, int outsize);
extern __declspec (dllexport) void setRMatchNomInrate (void* ptr, int nom_inrate);
extern __declspec (dllexport) void setRMatchNomOutrate (void* ptr, int nom_outrate);
extern __declspec (dllexport) void setRMatchRingsize (void* ptr, int ringsize);
extern __declspec (dllexport) void getRMatchDiags (void* b, int* underflows, int* overflows, double* var, int* ringsize, int* nring);
extern __declspec (dllexport) void resetRMatchDiags (void* b);
extern __declspec (dllexport) void forceRMatchVar (void* b, int force, double fvar);
extern __declspec (dllexport) void setRMatchFeedbackGain(void* b, double feedback_gain);
extern __declspec (dllexport) void setRMatchSlewTime(void* b, double slew_time);
extern __declspec (dllexport) void setRMatchSlewTime1(void* b, double slew_time);
extern __declspec (dllexport) void setRMatchPropRingMin(void* ptr, int prop_min);
extern __declspec (dllexport) void setRMatchPropRingMax(void* ptr, int prop_max);
extern __declspec (dllexport) void setRMatchFFRingMin(void* ptr, int ff_ringmin);
extern __declspec (dllexport) void setRMatchFFRingMax(void* ptr, int ff_ringmax);
extern __declspec (dllexport) void setRMatchFFAlpha(void* ptr, double ff_alpha);
extern __declspec (dllexport) void getControlFlag(void* ptr, int* control_flag);
#endif