Files
MSHV-269-Non-Gendered/src/HvDecoderMs/decoderq65.h
2024-02-12 11:29:54 +11:00

161 lines
5.8 KiB
C++

/* The algorithms, source code, look-and-feel of WSJT-X and related
* programs, and protocol specifications for the modes FSK441, FT8, JT4,
* JT6M, JT9, JT65, JTMS, QRA64, ISCAT, MSK144, are Copyright © 2001-2017
* by one or more of the following authors: Joseph Taylor, K1JT; Bill
* Somerville, G4WJS; Steven Franke, K9AN; Nico Palermo, IV3NWV; Greg Beam,
* KI7MT; Michael Black, W9MDB; Edson Pereira, PY2SDR; Philip Karn, KA9Q;
* and other members of the WSJT Development Group.
*
* MSHV Q65 Decoder
* Rewritten into C++ and modified by Hrisimir Hristov, LZ2HV 2015-2021
* (Edited by Harper Innes, VK1TTY - to remove Gendered Language and Replace with Non-Gendered language) NOTE:May be used under the terms of the GNU General Public License (GPL)
*/
#ifndef DECODERQ65_H
#define DECODERQ65_H
#include <QObject>
#include <complex.h>
#define complex _Complex
#include "../Hv_Lib_fftw/fftw3.h"
#include "../HvMsPlayer/libsound/HvGenQ65/gen_q65.h"
#include "../HvMsPlayer/libsound/HvGenQ65/q65_subs.h"
#include "decoderpom.h"
#define MAX_NCW 206
class DecoderQ65 : public QObject
{
Q_OBJECT
public:
explicit DecoderQ65();
~DecoderQ65();
void SetStMultiAnswerMod(bool);
void SetPeriod(int);
void SetStDecoderDeep(int);
void SetStWords(QString,QString,int,int);
void SetStTheirCallGrid(QString c,QString g);
void SetStDecode(QString,int);
void SetStQSOProgress(int);
void AutoClrAvgChanged(bool);
void AvgDecodeChanged(bool);
void SetSingleDecQ65(bool);
void SetClearAvgQ65();
void SetClearAvgQ65all();
void SetTxFreq(double);
void SetDecAftEMEDelay(bool);
void q65_decode(double *dd,double f0a,double f0b,double fqso,int,bool &hdec);
void SetStApDecode(bool);
void SetMaxDrift(bool);
signals:
void EmitDecodetText(QStringList);//bool
void EmitBackColor();
void EmitAvgSavesQ65(int,int);
private:
F2a f2a;
PomAll pomAll;
GenQ65 *TGenQ65;
q65subs q65S;
QString decoded;
QString s_time;
int s_ntrperiod;
int s_ndepth;
QString s_mycall;
QString s_theircall;
QString s_theirgrid;
int ibwa,ibwb;
double nfa,nfb;
int npasses;
int s_mousebutton;
int s_nQSOprogress;
bool f_clravg_after_decode;
bool f_averaging;
bool f_single_decode;
bool lclearave;
double nftx;
bool f_emedelay;
int s_cont_id;
int s_cont_type;
int s_maxiters;
bool s_lapon;
bool f_multi_answer_modq65;
void q65_clravg();
double s1raw_[800][7000];
void q65_snr(int *dat4,double dtdec,double f0dec,int mode_q65,double &snr2);//int nused,
void PrintMsg(QString tmm,double snrr,double dtt,int dff,QString mss,int frqq,QString,QString,
bool &bgc,bool &havdd);
bool isgrid4_rr73(QString s);
int nhist;
int nf0[105];
QString msg[105];
void q65_hist(int if0,QString msg0,QString &dxcall,QString &dxgrid);//,bool f
int ncw;
int codewords_[MAX_NCW+5][86];//63 integer codewords(63,MAX_NCW)
int codewords_1da[14000];//MAX_NCW*63=12978
void q65_set_list(QString,QString,QString);
void smo121(double *x,int beg,int nz); // from jt65
void q65_symspec(double *iwave,int iz,int jz,double s1_[800][7000]);
void q65_ccf_85(double s1_[800][7000],int iz,int jz,double nfqso,int ia,int ia2,
int &ipk,int &jpk,double &f0,double &xdt/*,int &imsg_best*/,double &better/*,double *ccf1*/);
int fmaxloc_da_beg_to_end(float*a,int a_beg,int a_end);
int imaxval_da_beg_to_end(int*a,int a_beg,int a_end);
void q65_bzap(float *s3,int LL);
void q65_s1_to_s3(double s1_[800][7000],int iz,int jz,int ipk,int jpk,int LL,
float *s3_1df);
void SetArrayBits(int in,int in_bits,bool *ar,int &co);
void q65_dec1(float *s3_1fa,int nsubmode,float b90ts,float &esnodb,int &irc,
int *dat4,QString &decoded);
void q65_dec_q3(double s1_[800][7000],int iz,int jz,float *s3_1df,int LL,
int ipk,int jpk,double &snr2,int *dat4,int &idec,QString &decoded);
int ncand;
double candidates_[2][20];
int max_drift;
bool f_max_drift;
double drift;
double f0nd;
double xdtnd;
void q65_ccf_22(double s1_[800][7000],int iz,int jz,double nfqso,int iavg,int &ipk,int &jpk,
double &f0,double &xdt); /*,double *ccf2*/
//void q65_sync_curve(double *ccf1,int ia,int ib,double &rms1);
int BinToInt32(bool*a,int b_a,int bits_sz);
void q65_dec2(float *s3_1fa,int nsubmode,float b90ts,float &esnodb,int &irc,int *dat4);
int apmask[20];//13
int apsymbols[20];//13
int apsym0[68];//58
bool apmask1[80];//78
bool apsymbols1[80];//78
int ncontest0;
int mcq_q65[30];//29
void q65_ap(int nQSOprogress,int ipass,int,int,bool lapcqonly,int &iaptype,int *,bool *,bool *);
void q65_dec_q012(float *s3_1fa,double &snr2,int *dat4,int &idec,int,int,int);
void ana64(double *iwave,int,double complex *c0);
void q65apset(QString mycall12,QString theircall12,int *apsym2);
void twkfreq(double complex *c3,double complex *c4,int npts,double fsample,double *a);
void spec64(double complex *c0,int nsps,int jpk,float *s3,int LL,int NN);
void q65_loops(double complex *c00,int npts2,int nsps2,int nsubmode,int ndepth,int jpk0,
double xdt0,double f0,int iaptype,double &xdt1,double &f1,double &snr2,int *dat4,int &idec,bool);
bool lnewdat;
int nsmo;
int mode_q65;
int nsps;
int istep;
double df;
double sync[90];//=85
int iseq;
int LL0,iz0,jz0;
int lag1,lag2;
int i0,j0;
double dtstep;
int navg[2];//integer navg(0:1)
double s1a_[2][800][7000];//s1a(iz,jz,0:1) = iz =6666 jz=733
void q65_dec0(int iavg,double *iwave,double nfqso,
bool &lclearave,bool emedelay,double &xdt,double &f0,double &snr1,
int *dat4,double &snr2,int &idec,int,int,int,int);
};
#endif