Hallo

Ik gebruik de pic contr. 16F873A voor bepaalde metingen.
elke minuut worden de waarden op de 5 AD ingangen verzonden
naar een rs 232 uitgang
Dit werkt allemaal perfect
Maar er zitten weleens kleine meet foutjes in

om dit te voorkomen wil ik nu elke 5 seconden 1 meting
en deze tijdelijk opslaan in een wordArray

en na 1 minuut de wordArray bekijken en waarvan de meeste dezelfde meetwaarde heb die door zenden

Nu de vraag
hoe filter ik een wordArray uit om met de meest zelfde waardes

Ik gebruik Proton Basic

Wie heeft de goude tip
of klein voorbeeldje voor mij

als je genoeg metingen maakt kun je gewoon het gemiddelde nemen.

hoe meer samples in de berekening hoe minder afwijking door een uitschieter

Oke
Daar heb je gelijk in
Het gaat iederdaad om die uitschieters
daarom juist wil ik niet het gemiddelde nemen.

Hans

Als de uitschieters maar af en toe voorkomen: Eerst een gemiddelde over een aantal metingen berekenen. Daarna alles binnen de waarde (gemiddelde - bepaalde grens) < meting < (gemiddelde + bepaalde grens) gebruiken voor een 2e gemiddelde (mocht er in het eerste gemiddelde toch een uitschieter zitten).
En daarna de metingen met (gemiddelde - bepaalde grens) < meting < (gemiddelde + bepaalde grens) gebruiken.

Waarschijnlijk kan het veeeeeel simpeler, maar ik heb geen idee wat een pic allemaal voor standaardfuncties heeft.

Edit:
Heel slecht uitgelegd, maar kan het niet beter verwoorden :-p
Het 1e berekende gemiddelde heb je niet meer nodig als je het 2e gemiddelde hebt.

[Bericht gewijzigd door --pino-- op (13%)]

Oke
Maar dat is weer het gemiddelde
Om het gemiddelde te bepalen is niet zo moeilijk
dat heb ik wel
Maar dit is veel moeilijker
Ik heb een wordArray van 10 metingen
hier wil ik 1 Var. uit halen die de meeste keren dezelfde meting geeft
dit moet toch mogelijk zijn..

Hans

methode:

- bepaal gemiddelde van alle 10 metingen
- bepaal alle outliers (= metingen met meer dan bijvoorbeeld 10% afwijking tov dit gemiddelde)
- haal de outliers uit de lijst
- Doe een gemiddelde over alle metingen die over zijn
- uitgeven naar rs232
- klaar

[Bericht gewijzigd door fripster op (13%)]

Oke Fripster

Ik begrijp wat je bedoelt
dit zou het kunnen zijn
ik ga dit uitproberen
weet alleen niet hoe de formule van bijv. 10% afwijking niet optellen voor het gemiddelde moet op zetten
heb jij hier een voorbeeldje van
bijvoorbaat dank

Hans

Gemiddelde nemen, 10% daar bijoptellen, dit vergelijken met alle waarden.
Waarden die aan de voorwaarde voldoen uit de array halen door alle opvolgende waarden op te schuiven.
Hetzelfde nog een keer door 10% af te trekken en alles nog eens te vergelijken.

Elke keer als je dat doet de laatste waarde in de array 0 geven (tbv overzicht) en met een extra variabele bijhouden over hoeveel variabelen je het nieuwe gemiddelde moet nemen.

Gemiddelde over de overgebleven variabelen nemen en doorsturen.

Oke
Hartelijk dank .
Ik begrijp wel wat je bedoel
maar krijg dit niet in een basic code
ik kom even niet verder dan het gemiddelde
Hoop dat je me verder kan helpen

Het programma wacht op een signaal van Excel
dan verzend ie de gegevens totaal 5 maar in dit voorbeeld even 1


Start:

Waarde = 0
For Teller = 0 To 9
 If Waarde = 68 Then Break
 Var1Array[Teller] = ADIn 0
  For I = 0 To 200            'pause van 5 seconde
   Waarde = HRSin
   If Waarde = 68 Then Break  ' door  '68 is hex. D start commando excel
   DelayMS 25
  Next 
Next
If waarde <> 68 Then Goto Start

TotaalVar1 = 0
For I = 0 To Teller
TotaalVar1 = TotaalVar1 + Var1Array[Teller]
Next
Var1 = TotaalVar1 / Teller + 1

HRSOut "S","|"  'Start
HRSOut Dec Var1,"|" 
HRSOut "E"      'Eind
GoTo start

End

Als er echt afwijkende waarden in een reeks metingen zitten die niet veroorzaakt zijn door een slechte precisie (bv thermische ruis) maar door externe stoorimpulsen, dan wil je die waarden niet betrekken bij het gemiddelde om de preciesie te verbeteren. De nauwkeurigheid (dit is wat anders dan precisie) zal hierdoor verslechteren.

Wat je zou kunnen doen is de mediaan bepalen van de reeks metingen. Of nog beter: Maak een histogram van de reeks meetwaarden. De top van het histogram vertegenwoordigd de meest voorkomende meetwaarde.

Op 14 december 2009 23:10:26 schreef Habro:
Het programma wacht op een signaal van Excel
dan verzend ie de gegevens totaal 5 maar in dit voorbeeld even 1

Waarom tel je dan tot 9 en gebruik je breaks (gore programmeerpraktijk)?

Inlezen en middelen scheiden van het verzenden.

Oke freddy
dat is het
een hystogram
Maar ?
Hoe zet ik dat in het progr.

Hans

Precies, de median value nemen, of het gemiddelde van de middelste helft van de samples of zo, werkt meestal veel beter. Het grote voordeel van de median value is dat je geen afrondingsfouten krijgt, de waarde is echt zo gemeten, je bent alleen slim aan het kiezen tussen je gemeten samples.

Helaas is het berekenen van de median value behoorlijk rekenintensief. Wat vaak wordt gedaan, is de hele lijst sorteren d.m.v. quicksort of zo, en dan de stukken die je niet wilt hebben eraf kappen.

De kunt ook steeds de lijst doorlopen en daarbij de grootste en de kleinste waarde weg mikken, waarbij je bij elke pass een minimum en maximum bijhoudt, die je in de volgende pass uit de lijst haalt. Daarvoor moet je de lijst wel (N/2) + 1 keer doorlopen, waarbij N het aantal samples is dat je weg wilt mikken. Dus voor een lijst van 32 samples, waarvan je er 8 wilt overhouden (dus de bovenste en onderste 12 eruit mikken), moet je die loop 13 keer doorlopen. Dat is natuurlijk erg inefficiënt m.b.t. processortijd, maar het kan wel in-place.

Je kunt natuurlijk ook een ander in-place sort algoritme gebruiken, of met een extra buffer, als je daar ruimte voor hebt. Het probleem van quicksort is dat je in een embedded systeem meestal onvoldoende call stack hebt, maar ook dat is oplosbaar.

Lijkt me dat je meer dan genoeg processortijd over hebt om de waarden op volgorde te zetten, kleine moeite om dan van de middenste X waarden het gemiddelde te nemen.

Maak het nou niet te moeilijk voor de TS, hij krijgt mijn supersimpele benadering nog niet eens aan de praat. Laat hem dat maar eerst aan de praat krijgen.

fripster

Hartelijk dank voor alle reaktie's

Maar ik kom er echt niet verder mee
het is inderdaad maar een WORD Array van 10 variabele met meestal maar 1 of 2 meet fouten maar ook vaak geen fouten.

maar om dat te voorkomen wil ik graag (zoals ik mijn vraag begon)
de meest voorkomende zelfde variabele

Het blijkt dat het simpel is maar niemand wil helaas met een voorbeeld komen

Maak het nou niet te moeilijk voor de TS, hij krijgt mijn supersimpele benadering nog niet eens aan de praat. Laat hem dat maar eerst aan de praat krijgen.

Dit Forum is toch om elkaar te helpen niet waar.
ik denk me suf maar kom er echt niet verder mee

Is het wel zo simpel ??

Hans

sliding window integrator ...

Bubble Sort over die array? Het zijn maar 10 waarden, dus zo doorlopen.

Voorbeeld code: http://www.codecodex.com/wiki/Bubble_sort

klein beetje op weg helpen met pseudo-code voor het vinden van het meest voorkomende getal...


array A[alle mogelijke waarden]

voor alle invoer getallen doe:
  i = huidig invoer getal
  A[i]++
einde lus

daarna: maximum zoeken in A

Geweldig bedankt voor het reageren

Hugo ik denk dat ik daar wel verder mee kan
mooi voorbeeld ook.
en als ik dan als laatste bijv.
if Array[5]=Array[6] then .....else

Ja nu kan ik verder bedankt

en Miredox zo zat ik ook maar steeds te dokteren
dan blijkt het toch vervelender te zijn dan je dacht..

Hans