[Wiskunde/PowerShell] Berekening Skype kwaliteit klopt niet

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Kroga
  • Registratie: Juli 2004
  • Laatst online: 12:22
Mijn vraag
Vanuit Skype haal ik een aantal cijfers op om de kwaliteit van een gesprek te meten.
Dit doe ik door gebruik te maken van drie getallen.
  • Packet Loss
  • Jitter
  • Roundtrip
Deze getallen wil ik omrekenen naar een score van 0 tot en met 10.
Ik wil ze alle drie even sterk mee laten tellen.

CategorieScorePacket LossJitterRoundTrip
Good8 to 10<=1%0-200-300
Impacted4 to 7.99>1% - 10%>20-30>300-500
Poor0 to 3.99>10% - 50%>30-100>500-800
Bad0>50%>100>800


Het probleem ontstaat dat het behalen van een maximale score binnen de categorie Impacted of Poor, dit is niet mogelijk. Omdat er minimaal een getal (PacketLoss/Jitter/RoundTrip) een slechtere score moet halen om in die categorie terecht te komen.

Iemand enig idee hoe ik dat op zou kunnen lossen?

Relevante software en hardware die ik gebruik
[QoEMetrics].[dbo].[QoEReportsCallListView] Skype view en PowerShell ISE

Wat ik al gevonden of geprobeerd heb.

PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Function CalculateScore
{
    Param
    (
        [Parameter(Mandatory=$true, Position=0, HelpMessage = 'Input the PacketLoss as a percentage')]
        $packetloss,
        [Parameter(Mandatory=$true, Position=1, HelpMessage = 'Input the Jitter')]
        $jitter,
        [Parameter(Mandatory=$true, Position=2, HelpMessage = 'Input the RoundTrip')]
        $roundtrip
    )

    #Bad
    If($packetloss -gt 50 -or $jitter -gt 100 -or $roundtrip -gt 800)
    {
        $score = 0
    }
    #Poor
    ElseIf(($packetloss -gt 10 -and $packetloss -le 50) -or ($jitter -gt 30 -and $jitter -le 100) -or ($roundtrip -gt 500 -and $roundtrip -le 800))
    {                           
        #"0.01 to 3.99"
        $maxscore = 3.99
        $plscore = $maxscore - ($maxscore/50)*$packetloss
        $jitscore = $maxscore - ($maxscore/100)*$jitter
        $rtscore = $maxscore - ($maxscore/800)*$roundtrip

        $score = ($plscore + $jitscore + $rtscore)/3
    } 
    #Impacted
    ElseIf(($packetloss -gt 1 -and $packetloss -le 10) -or ($jitter -gt 20 -and $jitter -le 30) -or ($roundtrip -gt 300 -and $roundtrip -le 500))
    {
        #"4 to 7.99"
        $maxscore = 3.99
        $plscore = $maxscore - ($maxscore/10)*$packetloss
        $jitscore = $maxscore - ($maxscore/30)*$jitter
        $rtscore = $maxscore - ($maxscore/500)*$roundtrip

        $score = (($plscore + $jitscore + $rtscore)/3)+4
    }
    #Good
    ElseIf(($packetloss -le 1) -and ($jitter -le 20) -and ($roundtrip -le 300))
    {
        #"8 to 10"
        $maxscore = 1.99
        $plscore = $maxscore - ($maxscore/1)*$packetloss
        $jitscore = $maxscore - ($maxscore/20)*$jitter
        $rtscore = $maxscore - ($maxscore/300)*$roundtrip

        $score = (($plscore + $jitscore + $rtscore)/3)+8
    }
    
    return [string]$score
}

[ Voor 0% gewijzigd door RobIII op 20-08-2019 12:56 . Reden: Gebruik code-tags i.p.v. quote tags om code te posten ;) ]

Beste antwoord (via Kroga op 20-08-2019 16:31)


  • mathias82
  • Registratie: April 2017
  • Laatst online: 18-09 10:24
Kroga schreef op dinsdag 20 augustus 2019 @ 13:30:
[...]


Als ik het goed begrijp dan haalt de max functie de hoogste waarde op uit een rij.
Dit zou betekenen dat $maxPerCat altijd de hoogste waarde is?

Aangezien het een OR functie betreft kan er een de hoogste zijn, ze hoeven niet allemaal boven die waarde te zijn.

Voorbeeld voor Impacted, waarbij RoundTrip ervoor zorgt dat het gesprek Impacted is:
Packet Loss = 4.06
Jitter = 6
RoundTrip = 386

Maar jouw voorbeeld bracht mij wel aan het denken.
Kan kijken welke getallen er wel binnen vallen.
Dus bijvoorbeeld 386 - 300 en dan daarover de score berekenen

Weet dan niet hoe ik dat doe als zowel RoundTrip als Packet Loss erbinnen vallen...

P.S. Kon de code tag eerder niet vinden sorry... :?
Wat ik gewoon doe is het volgende:
- De maximale score nemen voor een categorie (bvb 7.99 voor Impacted)
- Deze score delen door 3 voor de verschillende elementen (bvb max 2,66 per element bij Impacted)
- De score voor elk element berekenen. Wat ik doe is 2,66 vermenigvuldigen met een waarde tussen 0 en 1 die berekend wordt door de eigenlijke waarde van het element te delen door het verschil tussen de minimale en de maximale waarde van het element. MAAR het is mogelijk dat de waarde beter is dan het beste voor dat bepaald element (je kan bvb en jitter waarde van 10 hebben in de Impacted categorie). In dat geval wordt deze berekende waarde GROTER dan 1, en krijg je een score boven de 2,66 voor dit element, wat uiteraard niet mag. Daarom de max() functie, die er dus voor zorgt dat de waarde nooit boven 2,66 uitkomt.
Blijkbaar was ik echter nog niet goed wakker want die max() moet dus min() zijn: de kleinste waarde van de 2 moet gekozen worden, anders ga je natuurlijk altijd de maximale score halen 8)7 Ik heb het voorbeeld aangepast.

Alle reacties


Acties:
  • 0 Henk 'm!

  • mathias82
  • Registratie: April 2017
  • Laatst online: 18-09 10:24
Zoiets voor de categorie impacted:

code:
1
2
3
4
5
6
$maxScore = 7.99
$maxPerCat = $maxScore / 3
$plScore = min($maxPerCat, $maxPerCat * (1 - (($packetloss) / 10)))
$jitScore = min($maxPerCat, $maxPerCat * (1 - (($jitter-20) / 10)))
$rtScore = min($maxPerCat, $maxPerCat * (1 - (($roundtrip-300) / 200)))
$score = $plScore + $jitScore + $rtScore


Rinse and repeat voor de andere categorieën.
PS: ik weet niet of de max functie bestaat in PS maar er zal wel iets gelijkaardigs zijn...

[ Voor 7% gewijzigd door mathias82 op 20-08-2019 16:29 ]


Acties:
  • 0 Henk 'm!

  • Kroga
  • Registratie: Juli 2004
  • Laatst online: 12:22
mathias82 schreef op dinsdag 20 augustus 2019 @ 12:29:
Zoiets voor de categorie impacted:

code:
1
2
3
4
5
6
$maxScore = 7.99
$maxPerCat = $maxScore / 3
$plScore = max($maxPerCat, $maxPerCat * (1 - (($packetloss) / 10)))
$jitScore = max($maxPerCat, $maxPerCat * (1 - (($jitter-20) / 10)))
$rtScore = max($maxPerCat, $maxPerCat * (1 - (($roundtrip-300) / 200)))
$score = $plScore + $jitScore + $rtScore


Rinse and repeat voor de andere categorieën.
PS: ik weet niet of de max functie bestaat in PS maar er zal wel iets gelijkaardigs zijn...
Als ik het goed begrijp dan haalt de max functie de hoogste waarde op uit een rij.
Dit zou betekenen dat $maxPerCat altijd de hoogste waarde is?

Aangezien het een OR functie betreft kan er een de hoogste zijn, ze hoeven niet allemaal boven die waarde te zijn.

Voorbeeld voor Impacted, waarbij RoundTrip ervoor zorgt dat het gesprek Impacted is:
Packet Loss = 4.06
Jitter = 6
RoundTrip = 386

Maar jouw voorbeeld bracht mij wel aan het denken.
Kan kijken welke getallen er wel binnen vallen.
Dus bijvoorbeeld 386 - 300 en dan daarover de score berekenen

Weet dan niet hoe ik dat doe als zowel RoundTrip als Packet Loss erbinnen vallen...

P.S. Kon de code tag eerder niet vinden sorry... :?

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • mathias82
  • Registratie: April 2017
  • Laatst online: 18-09 10:24
Kroga schreef op dinsdag 20 augustus 2019 @ 13:30:
[...]


Als ik het goed begrijp dan haalt de max functie de hoogste waarde op uit een rij.
Dit zou betekenen dat $maxPerCat altijd de hoogste waarde is?

Aangezien het een OR functie betreft kan er een de hoogste zijn, ze hoeven niet allemaal boven die waarde te zijn.

Voorbeeld voor Impacted, waarbij RoundTrip ervoor zorgt dat het gesprek Impacted is:
Packet Loss = 4.06
Jitter = 6
RoundTrip = 386

Maar jouw voorbeeld bracht mij wel aan het denken.
Kan kijken welke getallen er wel binnen vallen.
Dus bijvoorbeeld 386 - 300 en dan daarover de score berekenen

Weet dan niet hoe ik dat doe als zowel RoundTrip als Packet Loss erbinnen vallen...

P.S. Kon de code tag eerder niet vinden sorry... :?
Wat ik gewoon doe is het volgende:
- De maximale score nemen voor een categorie (bvb 7.99 voor Impacted)
- Deze score delen door 3 voor de verschillende elementen (bvb max 2,66 per element bij Impacted)
- De score voor elk element berekenen. Wat ik doe is 2,66 vermenigvuldigen met een waarde tussen 0 en 1 die berekend wordt door de eigenlijke waarde van het element te delen door het verschil tussen de minimale en de maximale waarde van het element. MAAR het is mogelijk dat de waarde beter is dan het beste voor dat bepaald element (je kan bvb en jitter waarde van 10 hebben in de Impacted categorie). In dat geval wordt deze berekende waarde GROTER dan 1, en krijg je een score boven de 2,66 voor dit element, wat uiteraard niet mag. Daarom de max() functie, die er dus voor zorgt dat de waarde nooit boven 2,66 uitkomt.
Blijkbaar was ik echter nog niet goed wakker want die max() moet dus min() zijn: de kleinste waarde van de 2 moet gekozen worden, anders ga je natuurlijk altijd de maximale score halen 8)7 Ik heb het voorbeeld aangepast.

Acties:
  • 0 Henk 'm!

  • Kroga
  • Registratie: Juli 2004
  • Laatst online: 12:22
Dank je, zo kan ik er inderdaad een limiet erop zetten.