160 lines
4.1 KiB
C
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
|