Forum: Mikrocontroller und Digitale Elektronik Ringpuffer so richtig?


von Gerd (Gast)


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
von Helmut L. (helmi1)


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.
von Gerd (Gast)


Lesenswert?

Helmut Lenzen schrieb:
> Was du brauchst ist ein Pointer der immer auf das aelteste Element
> zeigt.

Stimmt, hab ich so noch garnicht gesehen! Geht so natürlich deutlcih 
schneller! Ein FIFO ist hier auch garnicht nötig, stimmt.


Grüße,
Gerd
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.