kopia lustrzana https://github.com/jamescoxon/dl-fldigi
Upstream version 3.0preR
rodzic
7205cac932
commit
9f8298afa5
|
@ -9,7 +9,7 @@ dnl major and minor must be integers; patch may
|
|||
dnl contain other characters or be empty
|
||||
m4_define(FLDIGI_MAJOR, [3])
|
||||
m4_define(FLDIGI_MINOR, [0])
|
||||
m4_define(FLDIGI_PATCH, [preQ])
|
||||
m4_define(FLDIGI_PATCH, [preR])
|
||||
|
||||
AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[FLDIGI_PATCH], [w1hkj AT w1hkj DOT com])
|
||||
|
||||
|
|
|
@ -969,6 +969,13 @@ static void cb_valTHOR_SOFT(Fl_Check_Button* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Value_Slider *valThorCWI=(Fl_Value_Slider *)0;
|
||||
|
||||
static void cb_valThorCWI(Fl_Value_Slider* o, void*) {
|
||||
progdefaults.ThorCWI = o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabDomEX=(Fl_Group *)0;
|
||||
|
||||
Fl_Input *txtSecondary=(Fl_Input *)0;
|
||||
|
@ -1008,6 +1015,13 @@ static void cb_valDominoEX_PATHS(Fl_Counter* o, void*) {
|
|||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Value_Slider *valDomCWI=(Fl_Value_Slider *)0;
|
||||
|
||||
static void cb_valDomCWI(Fl_Value_Slider* o, void*) {
|
||||
progdefaults.DomCWI = o->value();
|
||||
progdefaults.changed = true;
|
||||
}
|
||||
|
||||
Fl_Group *tabFeld=(Fl_Group *)0;
|
||||
|
||||
Fl_Choice *selHellFont=(Fl_Choice *)0;
|
||||
|
@ -1372,6 +1386,7 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
tabOperator->selection_color((Fl_Color)51);
|
||||
tabOperator->callback((Fl_Callback*)cb_tabOperator);
|
||||
tabOperator->when(FL_WHEN_CHANGED);
|
||||
tabOperator->hide();
|
||||
{ inpMyCallsign = new Fl_Input(78, 36, 85, 24, "Callsign:");
|
||||
} // Fl_Input* inpMyCallsign
|
||||
{ inpMyName = new Fl_Input(78, 62, 120, 24, "Name:");
|
||||
|
@ -2050,7 +2065,6 @@ l with your sound hardware.");
|
|||
{ tabModems = new Fl_Group(0, 25, 401, 195, "Modem");
|
||||
tabModems->color((Fl_Color)51);
|
||||
tabModems->selection_color((Fl_Color)51);
|
||||
tabModems->hide();
|
||||
{ tabsModems = new Fl_Tabs(0, 25, 401, 195);
|
||||
tabsModems->color((Fl_Color)51);
|
||||
tabsModems->selection_color((Fl_Color)10);
|
||||
|
@ -2244,12 +2258,19 @@ l with your sound hardware.");
|
|||
valTHOR_SOFT->callback((Fl_Callback*)cb_valTHOR_SOFT);
|
||||
o->value(progdefaults.THOR_SOFT);
|
||||
} // Fl_Check_Button* valTHOR_SOFT
|
||||
{ Fl_Value_Slider* o = valThorCWI = new Fl_Value_Slider(120, 174, 260, 21, "CWI threshold:");
|
||||
valThorCWI->type(1);
|
||||
valThorCWI->step(0.01);
|
||||
valThorCWI->textsize(14);
|
||||
valThorCWI->callback((Fl_Callback*)cb_valThorCWI);
|
||||
valThorCWI->align(FL_ALIGN_LEFT);
|
||||
o->value(progdefaults.ThorCWI);
|
||||
} // Fl_Value_Slider* valThorCWI
|
||||
tabTHOR->end();
|
||||
} // Fl_Group* tabTHOR
|
||||
{ tabDomEX = new Fl_Group(0, 50, 400, 170, "Dom");
|
||||
tabDomEX->color((Fl_Color)51);
|
||||
tabDomEX->selection_color((Fl_Color)51);
|
||||
tabDomEX->hide();
|
||||
{ txtSecondary = new Fl_Input(20, 75, 360, 44, "Secondary Text");
|
||||
txtSecondary->type(4);
|
||||
txtSecondary->callback((Fl_Callback*)cb_txtSecondary);
|
||||
|
@ -2286,6 +2307,14 @@ l with your sound hardware.");
|
|||
valDominoEX_PATHS->hide();
|
||||
o->value(progdefaults.DOMINOEX_PATHS);
|
||||
} // Fl_Counter* valDominoEX_PATHS
|
||||
{ Fl_Value_Slider* o = valDomCWI = new Fl_Value_Slider(125, 179, 260, 21, "CWI threshold:");
|
||||
valDomCWI->type(1);
|
||||
valDomCWI->step(0.01);
|
||||
valDomCWI->textsize(14);
|
||||
valDomCWI->callback((Fl_Callback*)cb_valDomCWI);
|
||||
valDomCWI->align(FL_ALIGN_LEFT);
|
||||
o->value(progdefaults.DomCWI);
|
||||
} // Fl_Value_Slider* valDomCWI
|
||||
tabDomEX->end();
|
||||
} // Fl_Group* tabDomEX
|
||||
{ tabFeld = new Fl_Group(0, 50, 400, 170, "Feld");
|
||||
|
@ -2403,6 +2432,7 @@ l with your sound hardware.");
|
|||
tabOlivia->end();
|
||||
} // Fl_Group* tabOlivia
|
||||
{ tabPSK = new Fl_Group(0, 50, 400, 170, "Psk");
|
||||
tabPSK->hide();
|
||||
{ Fl_Counter* o = cntSearchRange = new Fl_Counter(11, 60, 80, 21, "Acq Srch Range");
|
||||
cntSearchRange->type(1);
|
||||
cntSearchRange->minimum(10);
|
||||
|
|
|
@ -39,15 +39,15 @@ static const char szBaudRates[] = "300|600|1200|2400|4800|9600|19200|38400|57600
|
|||
code {} {}
|
||||
Fl_Window {} {
|
||||
label {fldigi - config} open
|
||||
xywh {875 516 400 250} type Double color 45 selection_color 51 align 80 visible
|
||||
xywh {849 557 400 250} type Double color 45 selection_color 51 align 80 visible
|
||||
} {
|
||||
Fl_Tabs tabsConfigure {open
|
||||
xywh {0 0 405 220} color 47 selection_color 9
|
||||
} {
|
||||
Fl_Group tabOperator {
|
||||
label Oper
|
||||
callback {progdefaults.changed = true;} selected
|
||||
xywh {0 25 400 195} color 51 selection_color 51 when 1
|
||||
callback {progdefaults.changed = true;}
|
||||
xywh {0 25 400 195} color 51 selection_color 51 when 1 hide
|
||||
} {
|
||||
Fl_Input inpMyCallsign {
|
||||
label {Callsign:}
|
||||
|
@ -985,7 +985,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
Fl_Group tabModems {
|
||||
label Modem open
|
||||
xywh {0 25 401 195} color 51 selection_color 51 hide
|
||||
xywh {0 25 401 195} color 51 selection_color 51
|
||||
} {
|
||||
Fl_Tabs tabsModems {open
|
||||
xywh {0 25 401 195} color 51 selection_color 10 align 9
|
||||
|
@ -1155,10 +1155,17 @@ progdefaults.changed = true;}
|
|||
xywh {215 130 108 20} down_box DOWN_BOX
|
||||
code0 {o->value(progdefaults.THOR_SOFT);}
|
||||
}
|
||||
Fl_Value_Slider valThorCWI {
|
||||
label {CWI threshold:}
|
||||
callback {progdefaults.ThorCWI = o->value();
|
||||
progdefaults.changed = true;}
|
||||
xywh {120 174 260 21} type Horizontal align 4 step 0.01 textsize 14
|
||||
code0 {o->value(progdefaults.ThorCWI);}
|
||||
}
|
||||
}
|
||||
Fl_Group tabDomEX {
|
||||
label Dom open
|
||||
xywh {0 50 400 170} color 51 selection_color 51 hide
|
||||
xywh {0 50 400 170} color 51 selection_color 51
|
||||
} {
|
||||
Fl_Input txtSecondary {
|
||||
label {Secondary Text}
|
||||
|
@ -1196,6 +1203,13 @@ progdefaults.changed = true;}
|
|||
xywh {20 174 63 21} type Simple minimum 4 maximum 8 step 1 value 5 hide
|
||||
code0 {o->value(progdefaults.DOMINOEX_PATHS);}
|
||||
}
|
||||
Fl_Value_Slider valDomCWI {
|
||||
label {CWI threshold:}
|
||||
callback {progdefaults.DomCWI = o->value();
|
||||
progdefaults.changed = true;} selected
|
||||
xywh {125 179 260 21} type Horizontal align 4 step 0.01 textsize 14
|
||||
code0 {o->value(progdefaults.DomCWI);}
|
||||
}
|
||||
}
|
||||
Fl_Group tabFeld {
|
||||
label Feld open
|
||||
|
@ -1329,7 +1343,7 @@ progdefaults.changed = true;}
|
|||
}
|
||||
Fl_Group tabPSK {
|
||||
label Psk open
|
||||
xywh {0 50 400 170}
|
||||
xywh {0 50 400 170} hide
|
||||
} {
|
||||
Fl_Counter cntSearchRange {
|
||||
label {Acq Srch Range}
|
||||
|
|
|
@ -78,6 +78,9 @@ void dominoex::rx_init()
|
|||
syncfilter->reset();
|
||||
|
||||
Mu_datashreg = 1;
|
||||
|
||||
staticburst = false;
|
||||
set_AFCrange(0.1);
|
||||
set_AFCind(0.0);
|
||||
}
|
||||
|
||||
|
@ -361,8 +364,8 @@ void dominoex::decodeDomino(int c)
|
|||
ch = dominoex_varidec(sym);
|
||||
|
||||
if (!progdefaults.DOMINOEX_FEC)
|
||||
|
||||
recvchar(ch);
|
||||
if (staticburst == false && outofrange == false)
|
||||
recvchar(ch);
|
||||
}
|
||||
symcounter = 0;
|
||||
}
|
||||
|
@ -389,6 +392,12 @@ void dominoex::decodesymbol()
|
|||
if (reverse) fdiff = -fdiff;
|
||||
fdiff /= doublespaced;
|
||||
fdiff /= paths;
|
||||
|
||||
if (fabs(fdiff) > 17)
|
||||
outofrange = true;
|
||||
else
|
||||
outofrange = false;
|
||||
|
||||
c = (int)floor(fdiff + .5) - 2;
|
||||
if (c < 0) c += NUMTONES;
|
||||
|
||||
|
@ -400,13 +409,43 @@ int dominoex::harddecode()
|
|||
{
|
||||
double x, max = 0.0;
|
||||
int symbol = 0;
|
||||
double avg = 0.0;
|
||||
bool cwi[paths * numbins];
|
||||
double cwmag;
|
||||
|
||||
for (int i = 0; i < paths * numbins; i++)
|
||||
avg += pipe[pipeptr].vector[i].mag();
|
||||
avg /= (paths * numbins);
|
||||
|
||||
if (avg < 1e-10) avg = 1e-10;
|
||||
|
||||
int numtests = 10;
|
||||
int count = 0;
|
||||
for (int i = 0; i < paths * numbins; i++) {
|
||||
cwmag = 0.0;
|
||||
count = 0;
|
||||
for (int j = 1; j <= numtests; j++) {
|
||||
int p = pipeptr - j;
|
||||
if (p < 0) p += twosym;
|
||||
cwmag = (pipe[j].vector[i].mag())/numtests;
|
||||
if (cwmag >= 50.0 * (1.0 - progdefaults.ThorCWI) * avg) count++;
|
||||
}
|
||||
cwi[i] = (count == numtests);
|
||||
}
|
||||
|
||||
for (int i = 0; i < (paths * numbins); i++) {
|
||||
x = pipe[pipeptr].vector[i].mag();
|
||||
if (x > max) {
|
||||
max = x;
|
||||
symbol = i;
|
||||
if (cwi[i] == false) {
|
||||
x = pipe[pipeptr].vector[i].mag();
|
||||
avg += x;
|
||||
if (x > max) {
|
||||
max = x;
|
||||
symbol = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
staticburst = (max / avg < 1.2);
|
||||
|
||||
return symbol;
|
||||
}
|
||||
|
||||
|
@ -458,6 +497,8 @@ void dominoex::synchronize()
|
|||
double syn = -1;
|
||||
double val, max = 0.0;
|
||||
|
||||
if (staticburst == true) return;
|
||||
|
||||
if (currsymbol == prev1symbol)
|
||||
return;
|
||||
if (prev1symbol == prev2symbol)
|
||||
|
@ -475,6 +516,10 @@ void dominoex::synchronize()
|
|||
syn = syncfilter->run(syn);
|
||||
|
||||
synccounter += (int) floor(1.0 * (syn - symlen) / NUMTONES + 0.5);
|
||||
|
||||
set_AFCind(1.0 * (synccounter - symlen) / symlen);
|
||||
|
||||
update_syncscope();
|
||||
}
|
||||
|
||||
|
||||
|
@ -546,7 +591,7 @@ int dominoex::rx_process(const double *buf, int len)
|
|||
currsymbol = harddecode();
|
||||
decodesymbol();
|
||||
synchronize();
|
||||
update_syncscope();
|
||||
// update_syncscope();
|
||||
eval_s2n();
|
||||
prev2symbol = prev1symbol;
|
||||
prev1symbol = currsymbol;
|
||||
|
@ -783,7 +828,9 @@ void dominoex::decodeMuPskEX(int ch)
|
|||
else symbols[3-i] = 1;//-255;
|
||||
c = c / 2;
|
||||
}
|
||||
|
||||
if (staticburst == true || outofrange == true)
|
||||
symbols[3] = symbols[2] = symbols[1] = symbols[0] = 0;
|
||||
|
||||
MuPskRxinlv->symbols(symbols);
|
||||
|
||||
for (int i = 0; i < 4; i++) decodeMuPskSymbol(symbols[i]);
|
||||
|
|
|
@ -148,12 +148,14 @@ extern Fl_Counter *valTHOR_BW;
|
|||
extern Fl_Check_Button *valTHOR_FILTER;
|
||||
extern Fl_Counter *valTHOR_PATHS;
|
||||
extern Fl_Check_Button *valTHOR_SOFT;
|
||||
extern Fl_Value_Slider *valThorCWI;
|
||||
extern Fl_Group *tabDomEX;
|
||||
extern Fl_Input *txtSecondary;
|
||||
extern Fl_Counter *valDominoEX_BW;
|
||||
extern Fl_Check_Button *valDominoEX_FILTER;
|
||||
extern Fl_Check_Button *chkDominoEX_FEC;
|
||||
extern Fl_Counter *valDominoEX_PATHS;
|
||||
extern Fl_Value_Slider *valDomCWI;
|
||||
extern Fl_Group *tabFeld;
|
||||
#include "fontdef.h"
|
||||
extern Fl_Choice *selHellFont;
|
||||
|
|
|
@ -89,11 +89,13 @@ struct configuration {
|
|||
string THORsecText;
|
||||
int THOR_PATHS;
|
||||
bool THOR_SOFT;
|
||||
double ThorCWI;
|
||||
// DOMINOEX
|
||||
double DOMINOEX_BW;
|
||||
bool DOMINOEX_FILTER;
|
||||
bool DOMINOEX_FEC;
|
||||
int DOMINOEX_PATHS;
|
||||
double DomCWI;
|
||||
// MT63
|
||||
bool mt63_8bit;
|
||||
int mt63_interleave;
|
||||
|
|
|
@ -119,6 +119,8 @@ protected:
|
|||
int symbolbit;
|
||||
|
||||
bool filter_reset;
|
||||
bool staticburst;
|
||||
bool outofrange;
|
||||
|
||||
// tx variables
|
||||
int txstate;
|
||||
|
|
|
@ -122,6 +122,7 @@ protected:
|
|||
int symbolbit;
|
||||
|
||||
bool filter_reset;
|
||||
bool staticburst;
|
||||
|
||||
// tx variables
|
||||
int txstate;
|
||||
|
|
|
@ -540,7 +540,7 @@ void mfsk::afc()
|
|||
sigsearch = 0;
|
||||
}
|
||||
|
||||
if (progStatus.afconoff && (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false)) {
|
||||
if ( progStatus.afconoff == true && metric > progStatus.sldrSquelchValue ) {
|
||||
|
||||
if (pipeptr == 0)
|
||||
prevvector = pipe[2*symlen - 1].vector[currsymbol];
|
||||
|
|
|
@ -94,11 +94,13 @@ configuration progdefaults = {
|
|||
"fldigi-thor ", // string THORsecText;
|
||||
5, // int THOR_PATHS;
|
||||
false, // bool THOR_SOFT;
|
||||
0.0, // double ThorCWI;
|
||||
// DOMINOEX
|
||||
2.0, // double DOMINOEX_BW;
|
||||
true, // bool DOMINOEX_FILTER
|
||||
false, // bool DOMINOEX_FEC
|
||||
5, // int DOMINOEX_PATHS
|
||||
0.0, // double DomCWI;
|
||||
// MT63
|
||||
false, // bool mt63_8bit;
|
||||
32, // int mt63_interleave;
|
||||
|
@ -267,8 +269,8 @@ enum TAG { \
|
|||
CWTRACK, CWRISETIME, CWDASH2DOT,
|
||||
XQSK, CWPRE, CWPOST, CWID, CWIDWPM,
|
||||
OLIVIATONES, OLIVIABW, OLIVIASMARGIN, OLIVIASINTEG, OLIVIA8BIT,
|
||||
THORBW, THORFILTER, THORSECTEXT, THORPATHS, THORSOFT,
|
||||
DOMINOEXBW, DOMINOEXFILTER, DOMINOEXFEC, DOMINOEXPATHS,
|
||||
THORBW, THORFILTER, THORSECTEXT, THORPATHS, THORSOFT, THORCWI,
|
||||
DOMINOEXBW, DOMINOEXFILTER, DOMINOEXFEC, DOMINOEXPATHS, DOMCWI,
|
||||
FELDFONTNBR,
|
||||
HELLRCVWIDTH, HELLXMTWIDTH, HELLBLACKBOARD, HELLPULSEFAST, HELLXMTIDLE,
|
||||
WFPREFILTER, LATENCY,
|
||||
|
@ -416,11 +418,13 @@ void configuration::writeDefaultsXML()
|
|||
writeXMLstr(f, "THORSECTEXT", THORsecText);
|
||||
writeXMLint(f, "THORPATHS", THOR_PATHS);
|
||||
writeXMLbool(f, "THORSOFT", THOR_SOFT);
|
||||
writeXMLdbl(f, "THORCWI", ThorCWI);
|
||||
|
||||
writeXMLdbl(f, "DOMINOEXBW", DOMINOEX_BW);
|
||||
writeXMLbool(f, "DOMINOEXFILTER", DOMINOEX_FILTER);
|
||||
writeXMLbool(f, "DOMINOEXFEC", DOMINOEX_FEC);
|
||||
writeXMLint(f, "DOMINOEXPATHS", DOMINOEX_PATHS);
|
||||
writeXMLdbl(f, "DOMCWI", DomCWI);
|
||||
|
||||
writeXMLint(f, "FELDFONTNBR", feldfontnbr);
|
||||
writeXMLbool(f, "HELLRCVWIDTH", HellRcvWidth);
|
||||
|
@ -735,6 +739,9 @@ bool configuration::readDefaultsXML()
|
|||
case THORSOFT :
|
||||
THOR_SOFT = atoi(xml->getNodeData());
|
||||
break;
|
||||
case THORCWI :
|
||||
ThorCWI = atof(xml->getNodeData());
|
||||
break;
|
||||
case DOMINOEXBW :
|
||||
DOMINOEX_BW = atof(xml->getNodeData());
|
||||
break;
|
||||
|
@ -747,6 +754,9 @@ bool configuration::readDefaultsXML()
|
|||
case DOMINOEXPATHS :
|
||||
DOMINOEX_PATHS = atoi(xml->getNodeData());
|
||||
break;
|
||||
case DOMCWI :
|
||||
DomCWI = atof(xml->getNodeData());
|
||||
break;
|
||||
case FELDFONTNBR :
|
||||
feldfontnbr = atoi(xml->getNodeData());
|
||||
break;
|
||||
|
@ -1132,10 +1142,12 @@ bool configuration::readDefaultsXML()
|
|||
else if (!strcmp("THORSECTEXT", nodeName)) tag = THORSECTEXT;
|
||||
else if (!strcmp("THORPATHS", nodeName)) tag = THORPATHS;
|
||||
else if (!strcmp("THORSOFT", nodeName)) tag = THORSOFT;
|
||||
else if (!strcmp("THORCWI", nodeName)) tag = THORCWI;
|
||||
else if (!strcmp("DOMINOEXBW", nodeName)) tag = DOMINOEXBW;
|
||||
else if (!strcmp("DOMINOEXFILTER", nodeName)) tag = DOMINOEXFILTER;
|
||||
else if (!strcmp("DOMINOEXFEC", nodeName)) tag = DOMINOEXFEC;
|
||||
else if (!strcmp("DOMINOEXPATHS", nodeName)) tag = DOMINOEXPATHS;
|
||||
else if (!strcmp("DOMCWI", nodeName)) tag = DOMCWI;
|
||||
else if (!strcmp("FELDFONTNBR", nodeName)) tag = FELDFONTNBR;
|
||||
else if (!strcmp("HELLRCVWIDTH", nodeName)) tag = HELLRCVWIDTH;
|
||||
else if (!strcmp("HELLXMTWIDTH", nodeName)) tag = HELLXMTWIDTH;
|
||||
|
@ -1361,11 +1373,13 @@ int configuration::setDefaults() {
|
|||
valTHOR_FILTER->value(THOR_FILTER);
|
||||
valTHOR_PATHS->value(THOR_PATHS);
|
||||
valTHOR_SOFT->value(THOR_SOFT);
|
||||
valThorCWI->value(ThorCWI);
|
||||
|
||||
valDominoEX_BW->value(DOMINOEX_BW);
|
||||
valDominoEX_FILTER->value(DOMINOEX_FILTER);
|
||||
chkDominoEX_FEC->value(DOMINOEX_FEC);
|
||||
valDominoEX_PATHS->value(DOMINOEX_PATHS);
|
||||
valDomCWI->value(DomCWI);
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
btnPTT[i]->value(0);
|
||||
|
|
|
@ -71,6 +71,7 @@ void thor::rx_init()
|
|||
put_sec_char(0);
|
||||
syncfilter->reset();
|
||||
datashreg = 1;
|
||||
set_AFCrange(0.1);
|
||||
set_AFCind(0.0);
|
||||
}
|
||||
|
||||
|
@ -315,14 +316,18 @@ void thor::decodesymbol()
|
|||
int c;
|
||||
double fdiff, softmag;
|
||||
unsigned char symbols[4];
|
||||
bool outofrange = false;
|
||||
|
||||
// Decode the IFK+ sequence, which results in a single nibble
|
||||
|
||||
fdiff = currsymbol - prev1symbol;
|
||||
|
||||
if (reverse) fdiff = -fdiff;
|
||||
fdiff /= paths;
|
||||
fdiff /= doublespaced;
|
||||
|
||||
if (fabs(fdiff) > 17) outofrange = true;
|
||||
|
||||
c = (int)floor(fdiff + .5) - 2;
|
||||
if (c < 0) c += THORNUMTONES;
|
||||
|
||||
|
@ -332,16 +337,18 @@ void thor::decodesymbol()
|
|||
|
||||
softmag = clamp(255.0 * currmag / avgsig, 0.0, 255.0);
|
||||
|
||||
if (progdefaults.THOR_SOFT == false) {
|
||||
if (staticburst == true || outofrange == true) // puncture the code
|
||||
symbols[3] = symbols[2] = symbols[1] = symbols[0] = 0;
|
||||
else if (progdefaults.THOR_SOFT == false) {
|
||||
symbols[3] = (c & 1) == 1 ? 255 : 0; c /= 2;
|
||||
symbols[2] = (c & 1) == 1 ? 255 : 0; c /= 2;
|
||||
symbols[1] = (c & 1) == 1 ? 255 : 0; c /= 2;
|
||||
symbols[0] = (c & 1) == 1 ? 255 : 0; c /= 2;
|
||||
} else {
|
||||
symbols[3] = (c & 1) == 1 ? softmag : 0; c /= 2;
|
||||
symbols[2] = (c & 1) == 1 ? softmag : 0; c /= 2;
|
||||
symbols[1] = (c & 1) == 1 ? softmag : 0; c /= 2;
|
||||
symbols[0] = (c & 1) == 1 ? softmag : 0; c /= 2;
|
||||
symbols[3] = (int)((c & 1) == 1 ? softmag : 0); c /= 2;
|
||||
symbols[2] = (int)((c & 1) == 1 ? softmag : 0); c /= 2;
|
||||
symbols[1] = (int)((c & 1) == 1 ? softmag : 0); c /= 2;
|
||||
symbols[0] = (int)((c & 1) == 1 ? softmag : 0); c /= 2;
|
||||
}
|
||||
|
||||
Rxinlv->symbols(symbols);
|
||||
|
@ -354,13 +361,42 @@ int thor::harddecode()
|
|||
{
|
||||
double x, max = 0.0;
|
||||
int symbol = 0;
|
||||
double avg = 0.0;
|
||||
bool cwi[paths * numbins];
|
||||
double cwmag;
|
||||
|
||||
for (int i = 0; i < paths * numbins; i++)
|
||||
avg += pipe[pipeptr].vector[i].mag();
|
||||
avg /= (paths * numbins);
|
||||
|
||||
if (avg < 1e-10) avg = 1e-10;
|
||||
|
||||
int numtests = 10;
|
||||
int count = 0;
|
||||
for (int i = 0; i < paths * numbins; i++) {
|
||||
cwmag = 0.0;
|
||||
count = 0;
|
||||
for (int j = 1; j <= numtests; j++) {
|
||||
int p = pipeptr - j;
|
||||
if (p < 0) p += twosym;
|
||||
cwmag = (pipe[j].vector[i].mag())/numtests;
|
||||
if (cwmag >= 50.0 * (1.0 - progdefaults.ThorCWI) * avg) count++;
|
||||
}
|
||||
cwi[i] = (count == numtests);
|
||||
}
|
||||
|
||||
for (int i = 0; i < paths * numbins ; i++) {
|
||||
x = pipe[pipeptr].vector[i].mag();
|
||||
if (x > max) {
|
||||
max = x;
|
||||
symbol = i;
|
||||
if (cwi[i] == false) {
|
||||
x = pipe[pipeptr].vector[i].mag();
|
||||
if (x > max) {
|
||||
max = x;
|
||||
symbol = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
staticburst = (max / avg < 1.2);
|
||||
|
||||
return symbol;
|
||||
}
|
||||
|
||||
|
@ -407,6 +443,8 @@ void thor::synchronize()
|
|||
double syn = -1;
|
||||
double val, max = 0.0;
|
||||
|
||||
if (staticburst == true) return;
|
||||
|
||||
if (currsymbol == prev1symbol)
|
||||
return;
|
||||
if (prev1symbol == prev2symbol)
|
||||
|
@ -425,6 +463,8 @@ void thor::synchronize()
|
|||
|
||||
synccounter += (int) floor(1.0 * (syn - symlen) / THORNUMTONES + 0.5);
|
||||
|
||||
set_AFCind(1.0 * (synccounter - symlen) / symlen);
|
||||
|
||||
update_syncscope();
|
||||
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue