Filtrera ett 10-bitars värde

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Hej!

Sitter och labbar med RGB-modulen från den här tråden.
Värdet som modulen spottar tillbaka är en frekvens som i nuläget representeras av ett 10-bitarstal.

Jag upplever lite skiftande värden fastän allt är statiskt så jag måste prova att filtrera lite. Min tanke är att typ göra 10st frekvensläsningar, kasta bort dom 3 högsta och dom 3 lägsta, och sen göra ett snitt av dom sista 4.
Hur skulle det här kunna se ut i kod? Finns det något magiskt sätt att gallra bort dom 3 högsta och 3 lägsta?
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Filtrera ett 10-bitars värde

Inlägg av Icecap »

Ingen magi kan göra det. Man reserverar plats för alla mätningarna och gör jobbet.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Filtrera ett 10-bitars värde

Inlägg av guckrum »

Du vill bygga en detektor som skickar ut en symbol för varje färg den ser. (Eller hur?) Det finns ett begränsat antal färger. (Hur många?)
Inuti detektorn har du ett tiobitars värde som du kan sampla en eller flera gånger för varje enskild detektering. Värdet varierar. Det kan ha flera orsaker som vi inte närmare går in på just nu. Bättre att titta på hur värdena fördelar sig för att se hur bra problemet går att lösa.
Kan du ta ett antal sampel (ju fler desto bättre: 100, 1000, ...) för varje färg och göra histogram över fördelningarna? Om du vill kan du postar mätvärdena och få hjälp med det. Histogrammen kan användas för att bestämma om problemet går att lösa, vilken algoritm som är lämplig, sannolikheten att den gör fel och på vilka färger med mera. Och på köpet kommer man kanske att lära sig lite om systemet och sensorn. (Man undrar också över bandbredden i systemet - samplar du för snabbt kommer efterföljande värden att vara beroende av varandra.)
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Tack för svaret!

Nedan ser ni en bild på hur riggen just nu ser ut. Modulen skickar ut en signal där pulsbredden per färg motsvarar hur mycket som reflekteras (som jag förstår det).
Koden jag hittat tar en färg i taget (RGB) och mäter pulsbredden och skickar ut detta på seriesnöret.

För att ta ett exempel så har jag bifogat två mätningar. Den första med ingen pärla under sensorn, dvs bara svart. Den andra mätningen är en väldigt röd pärla. 200 samples per uppställning.
Tyvärr finns det många färger och även med transparens.
Tanken var att lägga in de pärlor som är kända och sedan sortera "resten" i en slask-burk. Behöver man lägga in en ny färg så hade det varit roligt med en integrerad kalibrering där man får ut värdena från den nya färgen och kan sedan koda in dessa. Dock känner jag att det är överkurs just nu.

Har inte kollat än om det gör skillnad om jag samplar mindre frekvent. Just nu läser den av R/G/B 2 ggr i sekunden.

Utan pärla:

Kod: Markera allt

R= 402  G= 448  B= 325  
R= 408  G= 454  B= 332  
R= 408  G= 448  B= 331  
R= 402  G= 454  B= 325  
R= 407  G= 453  B= 331  
R= 400  G= 447  B= 325  
R= 407  G= 454  B= 332  
R= 408  G= 448  B= 331  
R= 401  G= 455  B= 326  
R= 408  G= 454  B= 331  
R= 402  G= 447  B= 331  
R= 408  G= 454  B= 332  
R= 408  G= 447  B= 331  
R= 400  G= 453  B= 325  
R= 407  G= 453  B= 331  
R= 401  G= 448  B= 332  
R= 408  G= 454  B= 332  
R= 408  G= 448  B= 332  
R= 402  G= 454  B= 326  
R= 408  G= 454  B= 332  
R= 401  G= 447  B= 331  
R= 407  G= 453  B= 331  
R= 407  G= 447  B= 331  
R= 402  G= 454  B= 325  
R= 408  G= 454  B= 332  
R= 402  G= 448  B= 332  
R= 408  G= 454  B= 331  
R= 408  G= 448  B= 332  
R= 401  G= 453  B= 324  
R= 407  G= 453  B= 331  
R= 401  G= 447  B= 325  
R= 408  G= 454  B= 332  
R= 407  G= 448  B= 332  
R= 402  G= 453  B= 327  
R= 408  G= 448  B= 332  
R= 402  G= 454  B= 325  
R= 407  G= 453  B= 331  
R= 400  G= 446  B= 331  
R= 407  G= 454  B= 332  
R= 408  G= 448  B= 331  
R= 402  G= 454  B= 326  
R= 408  G= 447  B= 331  
R= 401  G= 454  B= 326  
R= 408  G= 453  B= 331  
R= 401  G= 446  B= 325  
R= 407  G= 453  B= 331  
R= 401  G= 448  B= 331  
R= 408  G= 454  B= 332  
R= 408  G= 448  B= 332  
R= 401  G= 454  B= 325  
R= 408  G= 448  B= 331  
R= 402  G= 453  B= 324  
R= 407  G= 453  B= 331  
R= 401  G= 447  B= 325  
R= 408  G= 454  B= 332  
R= 408  G= 448  B= 331  
R= 407  G= 454  B= 331  
R= 408  G= 448  B= 332  
R= 402  G= 454  B= 325  
R= 407  G= 453  B= 331  
R= 400  G= 447  B= 325  
R= 407  G= 454  B= 332  
R= 402  G= 448  B= 331  
R= 407  G= 454  B= 331  
R= 408  G= 448  B= 331  
R= 402  G= 454  B= 326  
R= 407  G= 453  B= 331  
R= 401  G= 447  B= 331  
R= 407  G= 453  B= 331  
R= 407  G= 448  B= 331  
R= 401  G= 454  B= 326  
R= 408  G= 454  B= 331  
R= 402  G= 448  B= 325  
R= 408  G= 453  B= 331  
R= 401  G= 447  B= 331  
R= 407  G= 453  B= 331  
R= 407  G= 447  B= 331  
R= 402  G= 454  B= 325  
R= 408  G= 454  B= 331  
R= 402  G= 448  B= 325  
R= 408  G= 454  B= 331  
R= 407  G= 447  B= 331  
R= 401  G= 453  B= 324  
R= 407  G= 453  B= 332  
R= 401  G= 448  B= 325  
R= 408  G= 454  B= 332  
R= 408  G= 447  B= 331  
R= 401  G= 454  B= 326  
R= 408  G= 453  B= 331  
R= 401  G= 447  B= 330  
R= 407  G= 453  B= 331  
R= 407  G= 447  B= 331  
R= 402  G= 454  B= 325  
R= 408  G= 454  B= 331  
R= 401  G= 448  B= 331  
R= 408  G= 454  B= 332  
R= 408  G= 447  B= 331  
R= 401  G= 453  B= 324  
R= 407  G= 452  B= 331  
R= 401  G= 448  B= 325  
R= 408  G= 454  B= 332  
R= 408  G= 448  B= 331  
R= 402  G= 454  B= 325  
R= 408  G= 455  B= 332  
R= 401  G= 447  B= 331  
R= 407  G= 454  B= 331  
R= 407  G= 447  B= 331  
R= 401  G= 454  B= 326  
R= 408  G= 454  B= 331  
R= 402  G= 447  B= 332  
R= 408  G= 454  B= 332  
R= 408  G= 448  B= 332  
R= 401  G= 454  B= 325  
R= 408  G= 453  B= 331  
R= 401  G= 446  B= 331  
R= 407  G= 454  B= 331  
R= 408  G= 449  B= 332  
R= 403  G= 448  B= 325  
R= 408  G= 454  B= 332  
R= 408  G= 448  B= 332  
R= 402  G= 447  B= 325  
R= 407  G= 453  B= 331  
R= 407  G= 446  B= 331  
R= 401  G= 447  B= 325  
R= 408  G= 454  B= 331  
R= 402  G= 448  B= 332  
R= 407  G= 454  B= 326  
R= 408  G= 448  B= 332  
R= 402  G= 448  B= 325  
R= 407  G= 453  B= 330  
R= 400  G= 447  B= 331  
R= 407  G= 453  B= 325  
R= 407  G= 448  B= 332  
R= 402  G= 454  B= 326  
R= 408  G= 454  B= 332  
R= 402  G= 448  B= 332  
R= 408  G= 454  B= 332  
R= 409  G= 448  B= 331  
R= 401  G= 453  B= 324  
R= 407  G= 447  B= 331  
R= 401  G= 447  B= 325  
R= 407  G= 454  B= 332  
R= 408  G= 448  B= 331  
R= 402  G= 454  B= 326  
R= 407  G= 454  B= 332  
R= 402  G= 448  B= 326  
R= 408  G= 454  B= 331  
R= 407  G= 447  B= 331  
R= 401  G= 453  B= 324  
R= 407  G= 447  B= 331  
R= 402  G= 454  B= 325  
R= 408  G= 454  B= 332  
R= 402  G= 448  B= 331  
R= 408  G= 453  B= 331  
R= 408  G= 448  B= 332  
R= 401  G= 454  B= 324  
R= 407  G= 453  B= 331  
R= 401  G= 447  B= 325  
R= 407  G= 453  B= 331  
R= 402  G= 448  B= 331  
R= 408  G= 454  B= 326  
R= 408  G= 448  B= 331  
R= 402  G= 448  B= 325  
R= 408  G= 454  B= 332  
R= 401  G= 447  B= 331  
R= 407  G= 452  B= 325  
R= 406  G= 447  B= 331  
R= 401  G= 454  B= 325  
R= 408  G= 454  B= 332  
R= 402  G= 448  B= 331  
R= 408  G= 455  B= 325  
R= 408  G= 448  B= 332  
R= 402  G= 454  B= 325  
R= 407  G= 453  B= 330  
R= 401  G= 447  B= 331  
R= 407  G= 453  B= 331  
R= 408  G= 448  B= 331  
R= 402  G= 454  B= 326  
R= 408  G= 454  B= 332  
R= 402  G= 448  B= 331  
R= 408  G= 454  B= 326  
R= 408  G= 453  B= 331  
R= 400  G= 447  B= 331  
R= 407  G= 454  B= 325  
R= 408  G= 447  B= 331  
R= 402  G= 448  B= 326  
R= 408  G= 455  B= 331  
R= 408  G= 447  B= 331  
R= 402  G= 454  B= 326  
R= 408  G= 453  B= 331  
R= 400  G= 447  B= 331  
R= 407  G= 452  B= 324  
R= 407  G= 447  B= 331  
R= 401  G= 448  B= 329  
R= 408  G= 454  B= 331  
R= 408  G= 448  B= 331  
R= 402  G= 449  B= 325  
R= 408  G= 455  B= 331  
R= 408  G= 447  B= 331  
R= 400  G= 453  B= 325  
Med röd pärla:

Kod: Markera allt

R= 404  G= 453  B= 330  
R= 398  G= 448  B= 330  
R= 404  G= 454  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 331  
R= 399  G= 449  B= 331  
R= 405  G= 454  B= 325  
R= 405  G= 447  B= 330  
R= 404  G= 453  B= 324  
R= 404  G= 447  B= 330  
R= 404  G= 454  B= 325  
R= 405  G= 448  B= 331  
R= 399  G= 454  B= 325  
R= 405  G= 454  B= 331  
R= 399  G= 455  B= 325  
R= 405  G= 454  B= 331  
R= 397  G= 447  B= 325  
R= 405  G= 453  B= 330  
R= 397  G= 448  B= 331  
R= 405  G= 454  B= 332  
R= 405  G= 449  B= 331  
R= 403  G= 454  B= 325  
R= 405  G= 448  B= 331  
R= 399  G= 454  B= 324  
R= 404  G= 453  B= 330  
R= 398  G= 447  B= 330  
R= 404  G= 453  B= 331  
R= 399  G= 449  B= 332  
R= 405  G= 454  B= 325  
R= 405  G= 448  B= 331  
R= 399  G= 455  B= 325  
R= 405  G= 455  B= 331  
R= 398  G= 447  B= 330  
R= 404  G= 453  B= 330  
R= 398  G= 447  B= 330  
R= 405  G= 455  B= 325  
R= 399  G= 448  B= 331  
R= 405  G= 455  B= 325  
R= 405  G= 448  B= 331  
R= 399  G= 454  B= 325  
R= 405  G= 454  B= 331  
R= 397  G= 447  B= 330  
R= 404  G= 454  B= 330  
R= 398  G= 448  B= 331  
R= 405  G= 454  B= 325  
R= 405  G= 448  B= 331  
R= 405  G= 454  B= 325  
R= 405  G= 454  B= 331  
R= 399  G= 448  B= 331  
R= 404  G= 453  B= 330  
R= 398  G= 447  B= 331  
R= 404  G= 454  B= 324  
R= 405  G= 448  B= 331  
R= 399  G= 454  B= 325  
R= 405  G= 454  B= 331  
R= 398  G= 448  B= 331  
R= 405  G= 454  B= 325  
R= 405  G= 448  B= 330  
R= 398  G= 453  B= 324  
R= 404  G= 453  B= 330  
R= 397  G= 447  B= 326  
R= 405  G= 455  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 325  
R= 405  G= 448  B= 331  
R= 399  G= 455  B= 325  
R= 405  G= 454  B= 330  
R= 398  G= 448  B= 330  
R= 404  G= 453  B= 330  
R= 398  G= 448  B= 330  
R= 404  G= 454  B= 325  
R= 405  G= 454  B= 331  
R= 399  G= 449  B= 325  
R= 405  G= 455  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 453  B= 324  
R= 405  G= 447  B= 330  
R= 398  G= 453  B= 324  
R= 404  G= 453  B= 331  
R= 398  G= 448  B= 331  
R= 406  G= 455  B= 325  
R= 405  G= 448  B= 331  
R= 405  G= 454  B= 324  
R= 405  G= 454  B= 331  
R= 399  G= 448  B= 330  
R= 404  G= 453  B= 330  
R= 398  G= 448  B= 330  
R= 404  G= 454  B= 324  
R= 404  G= 448  B= 331  
R= 399  G= 450  B= 325  
R= 405  G= 455  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 455  B= 325  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 324  
R= 404  G= 453  B= 330  
R= 397  G= 447  B= 330  
R= 404  G= 453  B= 331  
R= 398  G= 448  B= 331  
R= 405  G= 455  B= 325  
R= 406  G= 455  B= 331  
R= 399  G= 448  B= 325  
R= 405  G= 454  B= 331  
R= 399  G= 447  B= 330  
R= 405  G= 453  B= 324  
R= 404  G= 453  B= 330  
R= 398  G= 448  B= 325  
R= 404  G= 454  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 325  
R= 405  G= 449  B= 331  
R= 399  G= 449  B= 325  
R= 405  G= 454  B= 331  
R= 398  G= 447  B= 331  
R= 405  G= 453  B= 324  
R= 404  G= 447  B= 330  
R= 398  G= 448  B= 331  
R= 405  G= 455  B= 332  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 324  
R= 405  G= 454  B= 331  
R= 399  G= 449  B= 331  
R= 405  G= 454  B= 324  
R= 404  G= 447  B= 330  
R= 397  G= 453  B= 324  
R= 405  G= 454  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 324  
R= 405  G= 448  B= 331  
R= 398  G= 455  B= 325  
R= 405  G= 454  B= 330  
R= 399  G= 448  B= 331  
R= 404  G= 453  B= 324  
R= 404  G= 454  B= 330  
R= 398  G= 448  B= 325  
R= 405  G= 454  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 324  
R= 405  G= 454  B= 331  
R= 399  G= 447  B= 330  
R= 404  G= 453  B= 330  
R= 398  G= 447  B= 330  
R= 404  G= 454  B= 325  
R= 405  G= 454  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 325  
R= 405  G= 455  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 453  B= 324  
R= 404  G= 447  B= 330  
R= 398  G= 448  B= 331  
R= 405  G= 455  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 325  
R= 405  G= 454  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 453  B= 324  
R= 404  G= 448  B= 330  
R= 398  G= 448  B= 331  
R= 404  G= 455  B= 331  
R= 399  G= 449  B= 331  
R= 405  G= 454  B= 325  
R= 405  G= 455  B= 331  
R= 399  G= 448  B= 331  
R= 404  G= 453  B= 324  
R= 404  G= 453  B= 330  
R= 397  G= 447  B= 331  
R= 405  G= 455  B= 325  
R= 405  G= 448  B= 331  
R= 400  G= 448  B= 326  
R= 405  G= 454  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 324  
R= 404  G= 454  B= 330  
R= 398  G= 447  B= 331  
R= 404  G= 454  B= 325  
R= 405  G= 448  B= 332  
R= 398  G= 449  B= 331  
R= 405  G= 454  B= 331  
R= 399  G= 448  B= 331  
R= 405  G= 454  B= 324  
R= 404  G= 453  B= 330  
R= 398  G= 447  B= 330  
R= 404  G= 454  B= 325  
R= 405  G= 449  B= 331  
R= 400  G= 449  B= 332  
R= 405  G= 454  B= 330  
R= 399  G= 449  B= 331  
R= 399  G= 455  B= 324  
R= 404  G= 453  B= 330  
R= 398  G= 447  B= 330  
R= 404  G= 454  B= 324  
R= 404  G= 454  B= 331  
R= 399  G= 449  B= 331  
R= 405  G= 454  B= 325  
R= 399  G= 449  B= 331  
R= 399  G= 449  B= 327  
R= 405  G= 454  B= 330  
R= 398  G= 448  B= 330  
R= 405  G= 453  B= 324
20180608_212121.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av Magnus_K 8 juni 2018, 21:43:05, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Filtrera ett 10-bitars värde

Inlägg av Icecap »

Det var en väldigt liten skillnad, snudd på obefintlig.
Hur belyser du pärlorna? En vit LED kan mycket väl vara bara blå + ljus gul, det ska vara båda en röd, en grön och en blå LED.

Hur ser ditt kretslopp ut? Med den usla skillnad känns det som att något är ganska fel.

Har du mätt spänningen på de olika sensorernas utgångar? Ändrar de sig med olika färger? Motsvarar A/D-värden de spänningar?
Senast redigerad av Icecap 8 juni 2018, 21:45:56, redigerad totalt 1 gång.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Modulen heter TCS230 och ser ut så här, dvs med integrerad belysning.
Och ja, väldigt liten skillnad. Därav tanken om filtrering kan hjälpa.

Obs, lånad bild.
TCS230.JPG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Xyzzy
Inlägg: 1222
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Re: Filtrera ett 10-bitars värde

Inlägg av Xyzzy »

Vad kul att du pratat med sensorn! Kom ihåg att den legat länge på hyllan, vad som helst kan ha hänt med den.

Säkerställ funktionen på sensorn innan du lägger för mycket tid Magnus, prova större helfärgade objekt, prova täcka själva sensorn helt osv och se om du får ut något vettigt öht.

Jag hoppas verkligen den fungerar och du kommer fram åt!
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Jag tycker nog den fungerar jättebra, men tyvärr använder jag nog fel teknik för att läsa av små objekt. Hade hoppats att slippa optik...

Här nedan ser ni värden från stora ytor (färgat papper):

Kod: Markera allt

RÖD:
R= 149  G= 305  B= 220

BLÅ:
R= 282  G= 225  B= 130

SVART:
R= 400  G= 444  B= 327
Användarvisningsbild
Xyzzy
Inlägg: 1222
Blev medlem: 30 januari 2004, 22:31:07
Ort: Uppsala, Sweden

Re: Filtrera ett 10-bitars värde

Inlägg av Xyzzy »

Vad skönt, ja nog verkar den funka allt.
Optik är utanför min bekvämlighetszon, men hoppas någon här kan ge dig en hint.
Står det inget om fokusavstånd och vad allt nu kan heta, I databladet?
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Precis vad jag letat efter som en tok men hittar inget. Här är tex ett datablad men inget matnyttigt i den.
Min gissning är att det inte finns något direkt optimalt avstånd utan allt handlar om att belysa objektet och få reflektionerna in i sensorn.
Kikar man på en del andra moduler så har dom en svart skärm över sensorn som täcker direkt ljus mellan sensor/belysning. Det kanske är vägen att gå?
Kanske borde tejpa på ett långt rör på sensorn? :)
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Filtrera ett 10-bitars värde

Inlägg av Krille Krokodil »

När man klassificerar på färg är det enklare att jobba med HSV, omvandlar du till det så kommer du nog att få så tydliga skillnader i Hue att du enkelt kan skilja pärlorna åt.

https://stackoverflow.com/questions/301 ... 5-for-both
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Filtrera ett 10-bitars värde

Inlägg av Icecap »

De LED ser ut att vara rimligt smala ideras strålmönster. Kolla med vanligt tunnt papper vilken avstånd det ska vara förrän alla färger överlapper.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Filtrera ett 10-bitars värde

Inlägg av guckrum »

Tack för datan! Två saker.
1. Som redan påpekats behöver din uppställning modifieras på något sätt. Sensorn verkar fungera på stora ytor, men vid pärlmätning får du väldigt liten skillnad i mätvärden. Mer om det nedan.
2. Det är något mysko med samplingen. Titta på kurvan nedan som visar rödkanalen för referenssignalen för några tiotal sampel
none_red_time.png
Samplingarna verkar gå i fas med datan som samplas. Påföljande värden är mycket starkt korrelerade. Ett "maxvärde" följs antingen av ett nytt "maxvärde" eller ett "minvärde". Ett "minvärde" följs alltid av ett "maxvärde"! Jag har ingen aning om hur din uppställning ser ut, men det finns nog en bra förklaring. Notera att värdena i "mitten" aldrig inträffar, utan samplena är antingen låga eller höga. Glider inte över tid. Verkar som att sensorn+avläsningslogik levererar två olika resultat i en icke-slumpmässig ordning.

Så om vi går över till histogram syns detta tydligt (referensssignal, rödkanal):
none_red_hist.png
Man får antingen höga värden eller låga värden. Oftare höga. Aldrig något emellan.

Och för röd pärla, röd signal:
red_red_hist.png
Histogrammen har samma x-axel, så värdena överlappar kraftigt.

Jag hade väntat mig att se EN "bula" i histogrammen, inte två. Fundera på
1. om du kan modifiera uppställningen så att du mäter "mera färg och mindre bakgrundsljus".
2. ta reda på varför mekanismen spottar ut, så att säga, två olika resultat, ungefär varannan gång, för samma mätning.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
MJH
Inlägg: 31
Blev medlem: 26 maj 2018, 12:05:29

Re: Filtrera ett 10-bitars värde

Inlägg av MJH »

> Hur skulle det här kunna se ut i kod? Finns det något magiskt sätt att gallra bort dom 3 högsta och 3 lägsta?

Vet inte om det är relevant än, men spånade kring att tex. att ta ut 4 värden från tio värden som du frågade i ditt första inlägg TS.

Ett enkelt sätt då det inte är frågan om större mängd data är att använda något likt detta.
Annars så kanske man skall kika på någon mer avancerad algoritmer för sortering.

Men då det handlar om en mindre mängd data som skall sorteras så duger förmodligen detta en bit på vägen.

Kod: Markera allt

// Sort.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#define ReadNumberValues 10 // Antal värde som skall läsas in
#define SaveNumberValues 4  // Antal värden som skall sparas för beslut

int main()
{
	int ReadValues[ReadNumberValues] = { 5, 8, 1, 3, 10, 4, 6, 7, 2, 9 }; // Inlästa värden
	int SoredValues[ReadNumberValues];
	int SavedNumberValues[SaveNumberValues];
	bool Sort = true; // Sortera!
	int ValuesTmp1;
	int ValuesTmp2;

	// Om INT används stoppa INT när ReadNumbervalus är uppfylld om inte en ringbuffert används (ringbufferten sköter sig sjäv den vet vad som är utläst).

	// Läst in ReadNumberValues, kopiera över värdena till sored Values
	for (int i = 0; i < ReadNumberValues; i++)
	{
		SoredValues[i] = ReadValues[i];
	}

	// INT kan aktiveras för insamling igen, om stoppad vid enklare insamling
		 
	// Sortera värdena
	while (Sort)
	{
		// initera for lopp
		Sort = false; // Om sort är false efter for lopp så är sorteringen klar.
		
		for (int i = 0; i < ReadNumberValues-1; i++)
		{
			ValuesTmp1 = SoredValues[i];
			ValuesTmp2 = SoredValues[i+1];

			// Tmp2 mindre än Tmp1 byt plats
			if (ValuesTmp2 < ValuesTmp1)
			{
				SoredValues[i] = ValuesTmp2;
				SoredValues[i+1] = ValuesTmp1;
				Sort = true;	// Skall sorteras minst en ggr till
			}
		}
	}

	int ii = 0;

	// Sorterade värden sparas x-antal av dessa, baserat på inlägget att kasta 3 lägsta och högsta.

	for (int i = ((ReadNumberValues- SaveNumberValues)/2); i < SaveNumberValues; i++)
	{
		SavedNumberValues[ii] = SoredValues[i];
		++ii;
	}
	// Gör något beslut baserat på sparade värden

    return true;
}

Edit.
Liten ändring, man skall debuga minst tre ggr på en så pass liten kod, men får väl acceptera att det kan bli fel ibland.
En ändring i koden!

Kod: Markera allt

// Sorterade värden sparas x-antal av dessa, baserat på inlägget att kasta 3 lägsta och högsta.

	for (int i = ((ReadNumberValues- SaveNumberValues)/2); ii < SaveNumberValues; i++)
	{
		SavedNumberValues[ii] = SoredValues[i];
		++ii;
	}
Senast redigerad av MJH 9 juni 2018, 12:13:06, redigerad totalt 1 gång.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Filtrera ett 10-bitars värde

Inlägg av Magnus_K »

Återkommer senare ikväll med mer mätningar och när jag läst igenom allt igen. OTROLIGT tacksam för alla seriösa svar!

En snabbis bara, guckrum, tror du det kan ha att göra med timern i AVR:en?
Ska visa mer i kväll hur kod och annat ser ut men jag använder någon Arduino-funktion som kallas "pulseIn()", den ska mäta mellan stigande/fallande flank, som jag förstår det. Skulle det kunna vara så att upplösningen för den timern är så grov så samlingsresultatet är helt enkelt en bit mer eller mindre?
Skriv svar