HELL AGC improvement

Modified AGC and s/n detector for Feld Hell modes
    Added AGC and s/n detector for FM-HELL modes
pull/2/head
David Freese 2010-01-18 09:30:22 -06:00
rodzic b9e25d9500
commit afd3adcd58
2 zmienionych plików z 31 dodań i 17 usunięć

Wyświetl plik

@ -195,6 +195,7 @@ feld::feld(trx_mode m)
bpfilt = new fftfilt(0, lp, 1024);
bbfilt = new Cmovavg(8);
average = new Cmovavg( 500 / downsampleinc);
minmaxfilt = new Cmovavg(120);
@ -232,16 +233,25 @@ void feld::FSKHELL_rx(complex z)
{
double f;
double vid;
double avg;
f = (prev % z).arg() * phi2freq;
prev = z;
f = bbfilt->run(f);
rxcounter += downsampleinc;
avg = average->run(z.mag());
rxcounter += downsampleinc;
if (rxcounter < 1.0)
return;
rxcounter -= 1.0;
if (avg > agc)
agc = avg;
else
agc *= (1.0 - 0.01 / RxColumnLen);
metric = CLAMP(1000*agc, 0.0, 100.0);
display_metric(metric);
vid = f + 0.5;
vid = CLAMP(vid, 0.0, 1.0);
if (mode == MODE_HELL80)
@ -254,42 +264,44 @@ void feld::FSKHELL_rx(complex z)
col_data[col_pointer + RxColumnLen] = (int)(vid * 255.0);
col_pointer++;
if (col_pointer == RxColumnLen) {
REQ(put_rx_data, col_data, col_data.size());
if (!halfwidth)
if (metric > progStatus.sldrSquelchValue || progStatus.sqlonoff == false) {
REQ(put_rx_data, col_data, col_data.size());
if (!halfwidth)
REQ(put_rx_data, col_data, col_data.size());
}
col_pointer = 0;
for (int i = 0; i < RxColumnLen; i++)
col_data[i] = col_data[i + RxColumnLen];
}
}
void feld::rx(complex z)
{
double x;
double x, avg;
x = bbfilt->run(z.mag());
x = z.mag();
if (x > peakval) peakval = x;
avg = average->run(x);
rxcounter += downsampleinc;
if (rxcounter < 1.0)
return;
rxcounter -= 1.0;
x = peakval;
peakval = 0;
if (x > peakhold)
peakhold = x;
else
peakhold *= (1 - 0.02 / RxColumnLen);
if (x < minhold)
minhold = x;
peakhold *= (1.0 - 0.02 / RxColumnLen);
x = x / peakhold;
x = CLAMP (x, 0.0, 1.0);
if (avg > agc)
agc = avg;
else
minhold *= (1 - 0.02 / RxColumnLen);
x = CLAMP (x / peakhold, 0.0, 1.0);
agc = minmaxfilt->run(peakhold - minhold);
metric = CLAMP(200*agc, 0.0, 100.0);
agc *= (1.0 - 0.01 / RxColumnLen);
metric = CLAMP(1000*agc, 0.0, 100.0);
display_metric(metric);
if (blackboard)

Wyświetl plik

@ -53,6 +53,7 @@ protected:
double rxdelta;
double rxcounter;
double agc;
double peakval;
double peakhold;
double minhold;
@ -66,6 +67,7 @@ protected:
fftfilt *bpfilt;
Cmovavg *bbfilt;
Cmovavg *minmaxfilt;
Cmovavg *average;
//tx
FELD_STATE tx_state;
double txphacc;