Pages: [1] 2 3   Go Down
 Author Topic: smoothing pot input  (Read 2367 times) 0 Members and 1 Guest are viewing this topic.
Offline
Full Member
Karma: 0
Posts: 217
 « on: April 29, 2012, 03:02:01 am » Bigger Smaller Reset

Googling arund I found this smoothing algorithm. Seems simple, but I follow how it would work.
Code:
// declared globally

// inside loop() or other repeating function

Make sense to anyone?
 Logged

Smithfield, Rhode Island
Offline
God Member
Karma: 3
Posts: 843
 « Reply #1 on: April 29, 2012, 03:07:18 am » Bigger Smaller Reset

No, that makes no sense as written. Are you sure nothing is omitted? That code uses an uninitialized variable, which can never ever work.
 Logged

Smithfield, Rhode Island
Offline
God Member
Karma: 3
Posts: 843
 « Reply #2 on: April 29, 2012, 03:08:35 am » Bigger Smaller Reset

What you could do instead is save the last n values and average them. Depending upon the nature of the data that is an easy way to do it that can work well.
 Logged

Global Moderator
Dallas
Online
Shannon Member
Karma: 208
Posts: 12932
 « Reply #3 on: April 29, 2012, 03:11:17 am » Bigger Smaller Reset

Quote
Googling arund I found this smoothing algorithm.

It's an "exponentially weighted moving average" or EMWA (missing the proper initialization as skyjumper mentioned).
 Logged

'round the world...
Offline
Karma: 42
Posts: 3266
 « Reply #4 on: April 29, 2012, 03:13:29 am » Bigger Smaller Reset

No, that makes no sense as written. Are you sure nothing is omitted? That code uses an uninitialized variable, which can never ever work.

I think he asked if the algorithm is correct, not if the code was properly written. And it is only the initialization of the variable that is missing (which most likely is cleared and set in more than one place in the code).

That formula you have is a sort of averaging filter. Weighed average I think may be a better name for it.

Basically you have this:

Code:
smooth = ((smooth * 9) + analogRead(0))/10;

So every new sample has an effect of 10% in your signal. A little Excel sheet can do wonders to show the result of this and different weights applied to this formula.

 Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Smithfield, Rhode Island
Offline
God Member
Karma: 3
Posts: 843
 « Reply #5 on: April 29, 2012, 04:13:36 am » Bigger Smaller Reset

Can a filter like this be used to smooth the last n samples, so that old data is at some point essentially discarded? Currently I am storing the last 20 samples and averaging them, but I have been looking for a way to achieve this without consuming 80 bytes (20 floats)...

 Logged

Manchester (England England)
Offline
Brattain Member
Karma: 627
Posts: 34220
Solder is electric glue
 « Reply #6 on: April 29, 2012, 04:27:33 am » Bigger Smaller Reset

Quote
Can a filter like this be used to smooth the last n samples, so that old data is at some point essentially discarded?
I think you are missing the point after many iterations the old data is so diluted that it has no effect, this is not homeopathic computing.

The alternative is to use an array and apply a different weighting to each sample. In this way any required filter response can be created providing you have enough terms. However, the increase in processing time reduces the top frequency of the filter. This sort of programming is known as digital signal processing.
 Logged

Global Moderator
Dallas
Online
Shannon Member
Karma: 208
Posts: 12932
 « Reply #7 on: April 29, 2012, 01:09:04 pm » Bigger Smaller Reset

Can a filter like this be used to smooth the last n samples, so that old data is at some point essentially discarded?

A follow-up to @Grumpy_Mike's answer: Assuming your samples are integers (e.g. from the analog-to-digital converter), using db2db's α = 0.9, the contribution for the seventh previous value becomes so small that it is not present in a float.  In other words, for practical purposes it's zero.  α = 0.9 gives a history of six samples (the contribution of the six is 1 / 1E-06; not much).

Quote
Currently I am storing the last 20 samples and averaging them, but I have been looking for a way to achieve this without consuming 80 bytes (20 floats)...

What are you trying to achieve?  Is the goal to filter out noise when reading a stable signal (in which case the "windowed average" you're doing now is probably the right choice)?  Do you need the average to "respond quickly" to signal changes?
 Logged

Offline
Full Member
Karma: 0
Posts: 217
 « Reply #8 on: April 29, 2012, 03:04:27 pm » Bigger Smaller Reset

This seems to work, but is very slow to respond. How can I speed up the response?

Code:

float smooth ;

void loop()
{
SSerial.print(analogRead(5));  //show raw output of pot value

smooth = 0.9 * smooth + 0.1 * analogRead(5);
SSerial_println(smooth);  //show filtered output of pot value

delay (100);
}
 « Last Edit: April 29, 2012, 03:06:56 pm by db2db » Logged

Gosport, UK
Offline
Karma: 21
Posts: 3113
 « Reply #9 on: April 29, 2012, 03:08:36 pm » Bigger Smaller Reset

Take the delay() out?
 Logged

Global Moderator
Dallas
Online
Shannon Member
Karma: 208
Posts: 12932
 « Reply #10 on: April 29, 2012, 03:28:26 pm » Bigger Smaller Reset

This seems to work, but is very slow to respond. How can I speed up the response?

First, let's review snippets from some of the replies...

Quote
That code uses an uninitialized variable

Quote
missing the proper initialization

Quote
And it is only the initialization of the variable that is missing

I can't help but notice that the code you posted does not initialize smooth.  Do you think that might be the problem?
 Logged

Global Moderator
UK
Offline
Brattain Member
Karma: 302
Posts: 26332
I don't think you connected the grounds, Dave.
 « Reply #11 on: April 29, 2012, 03:34:08 pm » Bigger Smaller Reset

smooth is initialised to zero by the compiler, so it is going to take a while to ramp up.
 Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Smithfield, Rhode Island
Offline
God Member
Karma: 3
Posts: 843
 « Reply #12 on: April 29, 2012, 03:41:02 pm » Bigger Smaller Reset

smooth is initialised to zero by the compiler, so it is going to take a while to ramp up.

No, its not. Only static variables are initialized by the compiler. Non-statics will have a random value.

My question is, what is a reasonable value to initialize with?
 Logged

Global Moderator
UK
Offline
Brattain Member
Karma: 302
Posts: 26332
I don't think you connected the grounds, Dave.
 « Reply #13 on: April 29, 2012, 03:43:21 pm » Bigger Smaller Reset

Quote
No, its not. Only static variables are initialized by the compiler. Non-statics will have a random value.
It's a global; it is initialised to zero.
Happily, the float representation of zero is the same as int or long.
 « Last Edit: April 29, 2012, 03:47:38 pm by AWOL » Logged

"Pete, it's a fool looks for logic in the chambers of the human heart." Ulysses Everett McGill.
Do not send technical questions via personal messaging - they will be ignored.

Manchester (England England)
Offline
Brattain Member
Karma: 627
Posts: 34220
Solder is electric glue
 « Reply #14 on: April 29, 2012, 03:45:03 pm » Bigger Smaller Reset

Quote
My question is, what is a reasonable value to initialize with?