Ringpuffer so richtig?

Gast #2473927
Lesenswert?

Hallo,
ich möchte gern einen Ringpuffer benutzen um einen gleitenden Mittelwert 
zu bilden. Mach ich das so richtig?

Prototyp:
1
unsigned int calc_floating_average (unsigned int new_value);

Puffer:
1
volatile unsigned int floating_average[16];

Auswertung Puffer:
1
unsigned int calc_floating_average (unsigned int new_value)
2
{
3
  unsigned long average_sum=0;
4
  /* rotate value storage */
5
  for(unsigned char i=15; i>1;i--)
6
  {
7
    floating_average[i]=floating_average[i-1];
8
  }
9
  
10
  /* apply new value into buffer */
11
  floating_average[0] = new_value;
12
  
13
  /* sum all values */
14
  for (unsigned char j=0;j<15;j++)
15
  {
16
    average_sum+= floating_average[j]; 
17
  }
18
  
19
  /* calc middle */
20
  average_sum/=16;
21
  return (unsigned int)average_sum;
22
}

Besten Dank,
Gerd
#2473937
Lesenswert?

Gerd schrieb:
> ich möchte gern einen Ringpuffer benutzen um einen gleitenden Mittelwert
> zu bilden. Mach ich das so richtig?

Etwas umstaendlich.

Das schieben hier kannst du dir sparen:

>  for(unsigned char i=15; i>1;i--)
>  {
>    floating_average[i]=floating_average[i-1];
>  }
>
>  /* apply new value into buffer */
>  floating_average[0] = new_value;

Was du brauchst ist ein Pointer der immer auf das aelteste Element 
zeigt.

Also so in etwa:

floating_average[n++] = new_value;
if (n >= MAXBUFFER) n = 0;

MAXBUFFER ist die Groesse deines Ringbuffers.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren