Upstream version 3.0preW

pull/2/head
Stelios Bounanos 2008-07-23 07:18:25 +01:00
rodzic ba91adf7d1
commit 29d5fe68e7
3 zmienionych plików z 50 dodań i 42 usunięć

Wyświetl plik

@ -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, [preV])
m4_define(FLDIGI_PATCH, [preW])
AC_INIT([fldigi], FLDIGI_MAJOR.FLDIGI_MINOR[FLDIGI_PATCH], [w1hkj AT w1hkj DOT com])

Wyświetl plik

@ -130,8 +130,6 @@ protected:
C_FIR_filter *hbfilt;
sfft *binsfft;
C_FIR_filter *bpfilt;
Cmovavg *met1filt;
Cmovavg *met2filt;
Cmovavg *vidfilter[SCOPESIZE];
Cmovavg *syncfilter;
@ -182,7 +180,7 @@ protected:
interleave *txinlv;
unsigned int bitshreg;
int bitstate;
// Picutre data and methods
int picturesize;
char picheader[PICHEADER];

Wyświetl plik

@ -57,7 +57,7 @@ void mfsk::tx_init(SoundBase *sc)
scard = sc;
txstate = TX_STATE_PREAMBLE;
bitstate = 0;
// counter = 0;
videoText();
}
@ -116,8 +116,6 @@ mfsk::~mfsk()
if (pipe) delete [] pipe;
if (hbfilt) delete hbfilt;
if (binsfft) delete binsfft;
if (met1filt) delete met1filt;
if (met2filt) delete met2filt;
for (int i = 0; i < SCOPESIZE; i++) {
if (vidfilter[i]) delete vidfilter[i];
}
@ -209,11 +207,10 @@ mfsk::mfsk(trx_mode mfsk_mode) : modem()
tonespacing = (double) samplerate / symlen;
basefreq = 1.0 * samplerate * basetone / symlen;
binsfft = new sfft (symlen, basetone, basetone + numtones );//+ 3); // ?
binsfft = new sfft (symlen, basetone, basetone + numtones );
hbfilt = new C_FIR_filter();
hbfilt->init_hilbert(37, 1);
met1filt = new Cmovavg(32);
met2filt = new Cmovavg(32);
syncfilter = new Cmovavg(8);
for (int i = 0; i < SCOPESIZE; i++)
@ -382,7 +379,8 @@ void mfsk::recvchar(int c)
// 88 nulls at 4 samples per pixel
// 176 nulls at 2 samples per pixel
counter = 352;
if (symbolbit == 4) counter += symlen;
// if (symbolbit == 4) counter += symlen;
if (symbolbit == symbits) counter += symlen;
rxstate = RX_STATE_PICTURE_START;
picturesize = RXspp * picW * picH * (color ? 3 : 1);
pixelnbr = 0;
@ -393,6 +391,7 @@ void mfsk::recvchar(int c)
picheader[PICHEADER -1] = 0;
}
put_rx_char(c);
}
void mfsk::recvbit(int bit)
@ -417,19 +416,19 @@ void mfsk::decodesymbol(unsigned char symbol)
symcounter = symcounter ? 0 : 1;
// only modes with 5 symbits need a vote
if (symbits == 5) {
// only modes with 3 or 5 symbits need a vote
if (symbits == 5 || symbits == 3) {
if (symcounter) {
if ((c = dec1->decode(symbolpair, &met)) == -1)
return;
met1 = met1filt->run(met);
met1 = decayavg(met1, met, 32);
if (met1 < met2)
return;
metric = met1 / 2.0;
} else {
if ((c = dec2->decode(symbolpair, &met)) == -1)
return;
met2 = met2filt->run(met);
met2 = decayavg(met2, met, 32);
if (met2 < met1)
return;
metric = met2 / 2.0;
@ -438,7 +437,8 @@ void mfsk::decodesymbol(unsigned char symbol)
if (symcounter) return;
if ((c = dec2->decode(symbolpair, &met)) == -1)
return;
metric = met2filt->run(met / 2.0);
met2 = decayavg(met2, met, 32);
metric = met2 / 2.0;
}
display_metric(metric);
@ -452,7 +452,7 @@ void mfsk::decodesymbol(unsigned char symbol)
void mfsk::softdecode(complex *bins)
{
double tone, sum, b[symbits];
double binmag, sum, b[symbits];
unsigned char symbols[symbits];
int i, j, k;
@ -470,17 +470,20 @@ void mfsk::softdecode(complex *bins)
else
k = i;
tone = bins[k].mag();
binmag = bins[k].mag();
for (k = 0; k < symbits; k++)
b[k] += (j & (1 << (symbits - k - 1))) ? tone : -tone;
b[k] += (j & (1 << (symbits - k - 1))) ? binmag : -binmag;
sum += tone;
sum += binmag;
}
// shift to range 0...260 ??? symbols are unsigned char
// shift to range 0...255
for (i = 0; i < symbits; i++)
symbols[i] = (unsigned char)clamp(128.0 + (b[i] / sum * 128.0), 0, 255);// 260);
if (staticburst)
symbols[i] = 0; // puncturing
else
symbols[i] = (unsigned char)clamp(128.0 + (b[i] / sum * 128.0), 0, 255);
rxinlv->symbols(symbols);
@ -531,13 +534,13 @@ int mfsk::harddecode(complex *in)
if (x > 2.0 * avg) burstcount++;
}
staticburst = (burstcount > numtones / 2);
staticburst = (burstcount == numtones);
if (!staticburst)
afcmetric = 0.95*afcmetric + 0.05 * (2 * max / avg);
else
afcmetric = 0.0;
return symbol;
}
@ -591,6 +594,7 @@ void mfsk::synchronize()
void mfsk::reset_afc() {
freqerr = 0.0;
syncfilter->reset();
return;
}
@ -598,8 +602,8 @@ void mfsk::afc()
{
complex z;
complex prevvector;
double f, f1, f2;
double ts = tonespacing / 8;
double f, f1;
double ts = tonespacing / 4;
if (sigsearch) {
reset_afc();
@ -610,8 +614,12 @@ void mfsk::afc()
return;
if (metric < progStatus.sldrSquelchValue)
return;
if (afcmetric < 6.0)
if (afcmetric < 3.0)
return;
if (currsymbol != prev1symbol)
return;
// if (prev1symbol != prev2symbol)
// return;
if (pipeptr == 0)
prevvector = pipe[2*symlen - 1].vector[currsymbol];
@ -622,16 +630,13 @@ void mfsk::afc()
f = z.arg() * samplerate / TWOPI;
f1 = tonespacing * (basetone + currsymbol);
f1 -= f;
f1 /= numtones;
f2 = CLAMP ( f1, freqerr - ts, freqerr + ts);
if ( fabs(f1 - f) < ts) {
freqerr = decayavg(freqerr, (f1 - f), 32);
set_freq(frequency - freqerr);
set_AFCind( freqerr );
}
freqerr = decayavg ( freqerr, f2, 128 );
set_freq(frequency - freqerr);
set_AFCind( freqerr );
}
void mfsk::eval_s2n()
@ -706,15 +711,21 @@ int mfsk::rx_process(const double *buf, int len)
currsymbol = harddecode(bins);
currvector = bins[currsymbol];
// frequency tracking
afc();
eval_s2n();
// decode symbol
softdecode(bins);
// frequency tracking
// afc();
// eval_s2n();
// decode symbol
// softdecode(bins);
// symbol sync
synchronize();
// frequency tracking
afc();
eval_s2n();
prev2symbol = prev1symbol;
prev2vector = prev1vector;
prev1symbol = currsymbol;
@ -941,7 +952,6 @@ int mfsk::tx_process()
btnpicTxClose->show();
abortxmt = false;
rxstate = RX_STATE_DATA;
// counter = 0;
memset(picheader, ' ', PICHEADER - 1);
picheader[PICHEADER -1] = 0;
FL_UNLOCK_E();