Auf der seite monitord.de unter "anwendung" finde ich zu den punkten algorithmus und maxerror nichts. Maxerror kann ich mir ja noch selber zusammenreimen. Aber das andere...puh.
Auf der seite monitord.de unter "anwendung" finde ich zu den punkten algorithmus und maxerror nichts. Maxerror kann ich mir ja noch selber zusammenreimen. Aber das andere...puh.
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
ausgeführt, oder haltCode: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;
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
--
In a world without walls and fences, who needs Windows and Gates ??
Meine private Webseite: http://www.db1jat.org
Ouh danke. So ausgeprägt sind meine Kenntnisse leider nicht ;-)
Ist die neue Methode auch gleichzeitig die Bessere?
Gruss
Stephan
Geändert von Pilzi (23.04.2009 um 17:04 Uhr)
Das kann man so nicht sagen. Der erste ist der Originale Algo. Das zweite stammt aus dem mrtty Projekt. Das ganze hatte ich mal gemacht um später bei verschiedenen Empfangsbedingungen auszuprobieren, was besser geht.
Gesicherte Erkenntnisse liegen mir da aber nicht vor. Ich hatte das begonnen, weil der Originale Algorithmus sich mit FMS-Text nach meinem Eindruck sehr schwer tut.
;-) begonnen? Bedeutet das, dass der Algo noch nicht fertig ist oder bezog sich das auf dieses mrtty Projekt?
Ich habe hier subjektiv mit der alten Methode die besseren Werte. Aber Beweisen kann man das nicht...spielen zu viele andere Faktoren mit in die Auswertung rein.
Kannst Du mal groß umreißen, was der Unterschied zwischen alt und neu ist?
Gruß
Stephan
Das begonnen bezieht sich auf die Integration des Algo in monitord. Man muss ja immer im Hinterkopf behalten, daß das Grundkonzept vom Urvater unixmon noch erhalten ist.
Wenn ich mir den Quelltext nochmal so auf die schnelle ansehe würde ich auch sagen, daß der Algorithmus nahezu identisch ist. Bis auf die Tatsache, daß der neuere weniger Falschauswertungen produziert. Er prüft im Grunde die Signalstärke ab. Ist sie zu gering, bricht er ab.
Per #define kann man dann noch den mrtty im 2.Algo einschalten. Ich weiss aber gerade nicht, ob das #define gesetzt ist.
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)