Create special handling for fast foreward, because it's not at the beginning of the Transition

This commit is contained in:
Frank Haverland
2022-09-18 17:56:56 +02:00
parent 3f659ccf7d
commit 78806c081b
3 changed files with 34 additions and 75 deletions

View File

@@ -127,59 +127,6 @@ string ClassFlowCNNGeneral::getReadout(int _analog = 0, bool _extendedResolution
return result; return result;
} }
/*
int ClassFlowCNNGeneral::ZeigerEvalHybrid(float zahl, float zahl_vorgaenger, int eval_vorgaenger)
{
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybrid( " + std::to_string(zahl) + ", " + std::to_string(zahl_vorgaenger) + ", " + std::to_string(eval_vorgaenger) + ")");
int ergebnis_nachkomma = ((int) floor(zahl * 10)) % 10;
int ergebnis_vorkomma = ((int) floor(zahl) + 10) % 10;
if (eval_vorgaenger < 0) // keine Vorzahl vorhanden !!! --> Runde die Zahl
{
if ((ergebnis_nachkomma <= 2) || (ergebnis_nachkomma >= 8)) // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
return ((int) round(zahl) + 10) % 10;
else
return ((int) trunc(zahl) + 10) % 10;
}
// 9.0, da bei getReadout() prev als int übergeben wird (9 statt 9.5)
// tritt bei der ersten ziffer von digit auf, wenn analog davor (2. Aufruf von getReadout)
if ((zahl_vorgaenger >= 0.5 ) && (zahl_vorgaenger < 9.5))
{
// kein Ziffernwechsel, da Vorkomma weit genug weg ist (0+/-0.5) --> zahl wird gerundet
if ((ergebnis_nachkomma <= 2) || (ergebnis_nachkomma >= 8)) // Band um die Ziffer --> Runden, da Ziffer im Rahmen Ungenauigkeit erreicht
return ((int) round(zahl) + 10) % 10;
else
return ((int) trunc(zahl) + 10) % 10;
}
else
{
if (eval_vorgaenger <= 1) // Nulldurchgang hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3)
{
if (ergebnis_nachkomma > 5)
return (ergebnis_vorkomma + 1) % 10;
else
return ergebnis_vorkomma;
}
else // bleibt nur >= 9.5 --> noch kein Nulldurchgang --> 2.8 --> 2, und 3.1 --> 2
{
// hier auf 4 reduziert, da erst ab Vorgänder 9 anfängt umzustellen. Bei 9.5 Vorgänger kann die aktuelle
// Zahl noch x.4 - x.5 sein.
if (ergebnis_nachkomma >= 4)
return ergebnis_vorkomma;
else
return (ergebnis_vorkomma - 1 + 10) % 10;
}
}
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybrid(return -1) zahl=" + std::to_string(zahl)
+ ", zahl_vorgaenger=" + std::to_string(zahl_vorgaenger) + ", eval_vorgaenger=" + std::to_string(eval_vorgaenger));
return -1;
}
*/
int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger, int eval_vorgaenger, bool AnalogerVorgaenger) int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger, int eval_vorgaenger, bool AnalogerVorgaenger)
{ {
int result; int result;
@@ -220,23 +167,33 @@ int ClassFlowCNNGeneral::ZeigerEvalHybridNeu(float zahl, float zahl_vorgaenger,
return result; return result;
} }
if (eval_vorgaenger <= 1) // Nulldurchgang hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3) if (eval_vorgaenger <= 1) // Nulldurchgang beim Vorgänger hat stattgefunden (!Bewertung über Prev_value und nicht Zahl!) --> hier aufrunden (2.8 --> 3, aber auch 3.1 --> 3)
{ {
// Wir nehmen einfach an, dass das aktuelle Digit nach dem Nulldurchgang des Vorgängers
// mindestens zur Hälfte (x.5) durchlaufen hat
if (ergebnis_nachkomma > 5) if (ergebnis_nachkomma > 5)
// Das akt. digit hat noch keinen Nulldurchgang, aber der Vorgänger schon.
result = (ergebnis_vorkomma + 1) % 10; result = (ergebnis_vorkomma + 1) % 10;
else else
// Akt. digit und Vorgänger haben Nulldurchgang
result = ergebnis_vorkomma; result = ergebnis_vorkomma;
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - KEIN Analoger Vorgänger, Nulldurchgang hat stattgefunden = " + std::to_string(result) + if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - KEIN Analoger Vorgänger, Nulldurchgang hat stattgefunden = " + std::to_string(result) +
" zahl: " + std::to_string(zahl) + " zahl_vorgaenger = " + std::to_string(zahl_vorgaenger)+ " eval_vorgaenger = " + std::to_string(eval_vorgaenger) + " DigitalUnschaerfe = " + std::to_string(DigitalUnschaerfe)); " zahl: " + std::to_string(zahl) + " zahl_vorgaenger = " + std::to_string(zahl_vorgaenger)+ " eval_vorgaenger = " + std::to_string(eval_vorgaenger) + " DigitalUnschaerfe = " + std::to_string(DigitalUnschaerfe));
return result; return result;
} }
// bleibt nur >= 9.5 --> noch kein Nulldurchgang --> 2.8 --> 2, und 3.1 --> 2
// alles >=x.4 kann als aktuelle Zahl gelten im Übergang. Bei 9.5 Vorgänger kann die aktuelle // bleibt nur >= 9.x --> noch kein Nulldurchgang --> 2.8 --> 2,
// und ab 9.7(DigitalUebergangsbereichVorlauf) 3.1 --> 2
// alles >=x.4 kann als aktuelle Zahl gelten im Übergang. Bei 9.x Vorgänger kann die aktuelle
// Zahl noch x.6 - x.7 sein. // Zahl noch x.6 - x.7 sein.
if (ergebnis_nachkomma >= 4) // Vorlauf (else - Zweig) passiert nicht bereits ab 9.
if (DigitalUebergangsbereichVorlauf>=zahl_vorgaenger || ergebnis_nachkomma >= 4)
// aktuelles digit hat genauso wie das Vorgängerdigit noch keinen Nulldurchgang.
result = ergebnis_vorkomma; result = ergebnis_vorkomma;
else else
// aktuelles digit läuft dem kleineren digit (9.x) vor. Also schon >=x.0 während das vorherige Digit noch
// keinen Nulldurchgang hat. Daher wird um 1 reduziert.
result = (ergebnis_vorkomma - 1 + 10) % 10; result = (ergebnis_vorkomma - 1 + 10) % 10;
if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - KEIN Analoger Vorgänger, >= 9.5 --> noch kein Nulldurchgang = " + std::to_string(result) + if (debugdetailgeneral) LogFile.WriteToFile("ClassFlowCNNGeneral::ZeigerEvalHybridNeu - KEIN Analoger Vorgänger, >= 9.5 --> noch kein Nulldurchgang = " + std::to_string(result) +

View File

@@ -30,6 +30,7 @@ protected:
float DigitalAnalogerVorgaengerUebergangsbereich = 2; float DigitalAnalogerVorgaengerUebergangsbereich = 2;
float DigitalUebergangsbereichVorgaengerAnalogToDigit = 1; // war vorher 2 float DigitalUebergangsbereichVorgaengerAnalogToDigit = 1; // war vorher 2
float DigitalUebergangsbereichVorgaenger = 0.7; // 9.3 - 0.7 float DigitalUebergangsbereichVorgaenger = 0.7; // 9.3 - 0.7
float DigitalUebergangsbereichVorlauf = 9.7; // Vorlauf-Nulldurchgang passiert erst ab ca. 9.7
string cnnmodelfile; string cnnmodelfile;
int modelxsize, modelysize, modelchannel; int modelxsize, modelysize, modelchannel;

View File

@@ -269,12 +269,6 @@ void test_doFlow() {
result = process_doFlow(analogs, digits, Digital100, false, false, -3); result = process_doFlow(analogs, digits, Digital100, false, false, -3);
TEST_ASSERT_EQUAL_STRING(expected, result.c_str()); TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
// checkConsistency=true
// checkConsistency NOT working correctly
//result = process_doFlow(analogs, digits, Digital100, true, false, -3);
//TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
// extendResolution=true // extendResolution=true
result = process_doFlow(analogs, digits, Digital100, false, true, -3); result = process_doFlow(analogs, digits, Digital100, false, true, -3);
TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str()); TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
@@ -285,24 +279,31 @@ void test_doFlow() {
analogs = { 9.0, 2.5, 2.9, 7.2}; analogs = { 9.0, 2.5, 2.9, 7.2};
expected = "269.9227"; expected = "269.9227";
expected_extended= "269.92272"; expected_extended= "269.92272";
// Float Value reduziert die Genauigkeit hier. Korrekt wäre
// expected_extended= "269.92272"; // extendResolution=true
// checkConsistency=true
result = process_doFlow(analogs, digits, Digital100, false, false); result = process_doFlow(analogs, digits, Digital100, false, false);
TEST_ASSERT_EQUAL_STRING(expected, result.c_str()); TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
// checkConsistency=false und extendResolution=true
// checkConsistency=true
// checkConsistency NOT working correctly
//result = process_doFlow(analogs, digits, Digital100, true, false, -3);
//TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
// checkConsistency=true und extendResolution=true
result = process_doFlow(analogs, digits, Digital100, false, true); result = process_doFlow(analogs, digits, Digital100, false, true);
TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str()); TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
// Fehler bei V11.3.1
// https://github.com/jomjol/AI-on-the-edge-device/issues/1028#issuecomment-1250239481
digits = { 1.1, 6.0, 9.1, 3.0, 5.3, 9.4}; // 169.3493 als falsches Ergebnis
analogs = { 3.5};
expected = "169.3593";
expected_extended= "169.35935";
// extendResolution=false
result = process_doFlow(analogs, digits, Digital100, false, false, -3);
TEST_ASSERT_EQUAL_STRING(expected, result.c_str());
// checkConsistency=false und extendResolution=true
result = process_doFlow(analogs, digits, Digital100, false, true, -3);
TEST_ASSERT_EQUAL_STRING(expected_extended, result.c_str());
} }