Autor |
Beitrag |
colaka
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: Fr 30.01.09 06:54
Hallo,
ich lade verschiedene Dateien über eine IdHTTP-Komponente herunter und habe für eine Geschwindigkeitsanzeige in das OnWork-Ereignis den folgenden Code geschrieben:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TFHaupt.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); var h, m, sec, MS : Word; DLTime : Double; begin Gauge.Progress := AWorkCount; DecodeTime(Now - Zeit0, h, m, sec, MS); sec := sec + m * 60 + h * 3600; DLTime := sec + MS/1000; if DLTime > 0 then LabelV.Caption := FormatFloat('0.00 KB/s', (AWorkCount / 1024) / DLTime); Application.ProcessMessages; end; |
Da die Anzeige sehr stark schwankt, möchte ich sie etwas glätten. Leider fehlen mir dazu die nötigen Mathematikkenntnisse.
Über einen Tipp würde ich mich riesig freuen.
Danke Ebi
Zuletzt bearbeitet von colaka am So 01.02.09 08:27, insgesamt 1-mal bearbeitet
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Fr 30.01.09 08:11
Hi,
wie wäre es mit einem gleitenden Mittelwert? Einfach die letzten x Werte behalten und dann immer den Mittelwert über x Werte bilden. Ob man nun 3, 5 oder 10 dafür nimmt, kann man ja einfach in einem Versuch ausprobieren.
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Fr 30.01.09 13:58
Wenn du wie in enes Vorschlag vorgehst, könntest du auch die neueren Werte stärker gewichten, vielleicht führt das zu einem noch besseren Ergebnis.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 30.01.09 14:44
Hallo,
ich habe mal ein kleine Klasse dafür gepinselt, wie man sieht, mache ich das nie...
Ich wollte dieses dämliche ständige Komplettneurechnen einsparen.
Dieser Ansatz führt nur zu Problemen, wenn die einzelnen Werte um mehrere Zehnerpotenzen auseinanderliegen, aber bei Mbit/s zu Bit/s stellt dies kein Problem dar, jemals die komplette Summe zu berechnen.
Vielleicht sollte man den Durchschnitt zu Beginn,wenn noch nicht alle Felder belegt sind, nur mit den vorhandenen berechnen.
EDIT: geändert
Leider kann ich so nicht verschiedene Gewichtungen einführen, wie es Nagel vorschlägt.
Gruß Horst
EDIT:
Ich habe mal das Startverhalten geändert.
Mit Rampe werden die ersten Werte auf die gesamte Anzahl, über die gemittelt werden soll, gemittelt.
Also wenn 1 eingefügt wird und über 10 Werte gemittelt wird erscheint 0.1 .
Ohne Rampe erscheint der Mittelwert, der bisher eingegebenen Werte, also bei 1 als ersten Wert kommt auch 1 als Mittelwert heraus.
Den Effekt sieht man grafisch recht schön, wenn gemittelte Werte gemittelt werden.
Einloggen, um Attachments anzusehen!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Sa 31.01.09 14:49
Das mit der unterschiedlichen Wichtung kannst Du auch recht einfach lösen:
Nehmen wir die Messreihe 3,4,5,4,5, die einen Durchschnitt von 4,2 ergibt. Möchte man nun immer aktuellere Werte stärker bewertet haben, so kann man die Werte Multiplizieren, und zwar so, dass ältere Werte ausgeblendet werden.
Eie Formel dafür könnte so hier aussehen:
(3*n^4 + 4*n^3 + 5*n^2 + 4*n^1 + 5*n^0) / (n^4 + n^3 + n^2 + n^1 + n^0)
was für dieses Beispiel (mit n=0,75) ungefähr 4,408 liefert. n gibt dabei an, wie stark alte Werte reduziert werden sollen ... Diese Implementierung lässt sich zudem gut vereinfachen um sie in einer Schleife zu berechnen, da man hier das Horner-Schema anwenden kann und allein den letzen (mit n^4 gewichteten) Messwert abziehen muss, bevor man einen neuen hinzufügt.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Sa 31.01.09 19:44
Hallo,
das Ziel bei meinem gleitenden Durchschnitt war, diesen zu berechnen ohne die Werte zuvor vollständig vorliegen zu haben, sondern nach und nach im zirkulärem Speicher abzulegen und falls nötig zu überschreiben.
Ausserdem fand ich es simpel einfach nur die Werte zu übergeben, ohne mich um den Rest kümmern zu müssen.
Sonst hätte man es ja gleich wie www.delphipraxis.net..._moving+average.html machen können.
Die jeweils vollständige Berechnung wollte ich auch wie bei Delphipraxs auch einsparen, aber ab und an doch ausführen, um Fehler klein zu halten.
Da sum aus der unit math es jetzt doch tut, ist der Vorteil, des nicht ständig Neurechnens, entsprechend geschrumpft. Wer braucht einen gleitenden Durchschnitt über 30 oder mehr Werte.
Bei 1000 war der Vorteil 200:1 .
Eine Wichtung in der Art von BenBe lässt sich leicht realisieren, indem ich vom alten Mittelwert den letzen Term Y[n]*faktor^n abziehe. Anschliessend den neuen Wert Y[1] addiere und diese Summe mit Faktor multipliziere.
Mal schauen, wie das ausschaut.
Gruß Horst
P.S.
Wie weit ist colaka
|
|
colaka 
      
Beiträge: 200
Erhaltene Danke: 4
Win XP, W7
Delphi 2005 Prof.
|
Verfasst: So 01.02.09 08:35
Vielen Dank für Eure Bemühungen.
Ich habe das jetzt mit dem gleitenden Durchschnitt gemacht. Das beruhigt die Anzeige schon so weit, daß das Auge bequem mitkommt.
Ursprünglich hatte ich nach einer Formel gesucht. Da es sich um eine Geschwindigkeitsanzeige handelt, müßte man den Wert doch auch über das Integral der Ableitung (oder umgekehrt ?) glätten können, wobei man den Glättungsfaktor über die Zeit variieren könnte. Aber wie schon erwähnt, dafür reichen meine Mathematikkenntnisse leider nicht aus.
Danke Ebi
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: So 01.02.09 11:50
colaka hat folgendes geschrieben : | .... Da es sich um eine Geschwindigkeitsanzeige handelt, müßte man den Wert doch auch über das Integral der Ableitung (oder umgekehrt ?) glätten können, wobei man den Glättungsfaktor über die Zeit variieren könnte. Aber wie schon erwähnt, dafür reichen meine Mathematikkenntnisse leider nicht aus.
... |
Hallo,
ein gleitender Durchschschnitt ist mathematisch ein Integral und entspricht auch physikalisch einer Integrierschaltung (z.B. RC-Glied). Du brauchst also nicht weiter zu suchen.
Gruss Reinhard
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: So 01.02.09 17:41
Hallo,
anbei ein gleitender/( exponentieller ) Durchschnitt mit grafischer Darstellung.
EDIT: Das ist Kein exponentieler Durchschnitt wie in http://de.wikipedia.org/wiki/Exponentielle_Glättung beschrieben.
Die gelbe Kurve ist der ~exponentielle Mittelwert, der näher am Original (rot) bleibt, als der schwarze gleitende Mittelwert.
Ein Sinus der nur aus -1 0 1 besteht wird durch 3-fache Mittelwertbildung gefiltert ( von wegen R_C Filter , das stimmt nicht so ganz, denn es ist nicht die "Spannungsdifferenz" die wirkt. Sieht eher wie ein Konstantstrom aus, der dafür sorgt, dass nach Anzahlwerte Schritten der entsprechende Wert erreicht wird.)
Gruß Horst
Einloggen, um Attachments anzusehen!
|
|
|