Moin..
Ein schneller Blick in den Quellcode offenbart bei "algorithmus", das je nachdem,
ob der Parameter 0 oder 1 ist, die Methode
MonitorModuleFMS::demod
oder
MonitorModuleFMS::demod_neu
aufgerufen wird.. konkret wird eigentlich immer die erste aufgerufen, aber in den
ersten Zeilen wird dann abgefragt, ob der Parameter 0 ist, wenn er dies ist, wird
die andere Methode aufgerufen.
Das heisst im Klartext, entweder wird bei alg = 0
Code:
float f, ampl_mark, ampl_space ;
if (subsamp) {
int numfill = SUBSAMP - subsamp;
if (length < numfill) {
subsamp += length;
return;
}
buffer += numfill;
length -= numfill;
subsamp = 0;
}
for (; length >= max(SUBSAMP, CORRLEN); length -= SUBSAMP, buffer += SUBSAMP)
{
#ifdef MRTTY
// mrtty (2) decoder
//
sample=(*buffer)*128 ;
xs=biq_bp(sample,bp0_c,bp0_b);
xm=biq_bp(sample,bp1_c,bp1_b);
xs*=xs; // xs RMS
xm*=xm; // xm RMS
f=biq_lp(biq_lp(xm-xs,lp1_c,lp1_b),lp2_c,lp2_b);
#else
ampl_mark= fsqr(mac(buffer, corr_mark_i, CORRLEN)) +
fsqr(mac(buffer, corr_mark_q, CORRLEN)) ;
ampl_space= fsqr(mac(buffer, corr_space_i, CORRLEN)) +
fsqr(mac(buffer, corr_space_q, CORRLEN));
f = ampl_mark - ampl_space ;
#endif
dcd_shreg <<= 1;
dcd_shreg |= (f > 0);
/* check if transition */
if ((dcd_shreg ^ (dcd_shreg >> 1)) & 1) {
if (sphase < (0x8000u - (SPHASEINC / 2)))
sphase += SPHASEINC / 8;
else
sphase -= SPHASEINC / 8;
}
sphase += SPHASEINC;
if (sphase >= 0x10000u) {
sphase &= 0xffffu;
rxbit(dcd_shreg & 1);
}
}
subsamp = length;
ausgeführt, oder halt
Code:
float f, ampl_mark, ampl_space ;
if (subsamp) {
int numfill = SUBSAMP - subsamp;
if (length < numfill) {
subsamp += length;
return;
}
buffer += numfill;
length -= numfill;
subsamp = 0;
}
for (; length >= max(SUBSAMP, CORRLEN) ; length -= SUBSAMP, buffer += SUBSAMP)
{
ampl_mark= fsqr(mac(buffer, corr_mark_i, CORRLEN)) +
fsqr(mac(buffer, corr_mark_q, CORRLEN)) ;
ampl_space= fsqr(mac(buffer, corr_space_i, CORRLEN)) +
fsqr(mac(buffer, corr_space_q, CORRLEN));
f = ampl_mark - ampl_space ;
dcd_shreg <<= 1;
dcd_shreg |= (f > 0);
// check if transition
//
if ((dcd_shreg ^ (dcd_shreg >> 1)) & 1) {
if (sphase < (0x8000u - (SPHASEINC / 2)))
sphase += SPHASEINC / 8;
else
sphase -= SPHASEINC / 8;
}
sphase += SPHASEINC;
summe=summe + ( (f > 0) ? 1 : -1) ;
if (sphase>=0x10000u)
{
sphase &= 0xffffu;
// curbit = dcd_shreg & 1;
if ( (summe >= (int) (m_fSignallevel * ((float) (FREQ_SAMP/SPHASEINC_BASE))) ) || (-summe >= (int) (m_fSignallevel * ((float) (FREQ_SAMP/SPHASEINC_BASE)) ) ))
//(f >= m_fSignallevel) || (f <=-m_fSignallevel)) // Es muss schon ein wenig dahinterstehen ;-)
{
// TRACE1("summe: %d\n",summe) ;
int bit=(summe >= 0) ? 1 : 0 ;
rxbit(bit);
} else {
// ggf. laufende Auswertung abbrechen, da Signal zu schwach
//
//TRACE2("FMS: Low Power Signal %d < %d \n",summe,(int) (m_fSignallevel * ((float)(FREQ_SAMP/SPHASEINC_BASE)) )) ;
if (rxstate) rxstate=0 ;
} ;
summe=0 ;
}
}
subsamp = length;
Gruss,
Tim