Daniel R. schrieb:
> uint16_t getNextPeak(uint16_t new_value)
> {
> // shift old samples and fade them away
> for(uint8_t n=PEAKHOLD_N-1; n>0; n--)
> {
> peaks[n] = (peaks[n-1] >> 2);
Das ist eine Division durch 4 und nicht durch 2
Wenn du durch 2 dividieren willst, dann schreib auch Division durch 2!
Dein Compiler weiß schon, wann er das mit Schieben erledigen kann und
wann er tatsächlich dividieren muss.
Ich würds so machen:
Wenn der neue Werte größer ist als der alte, dann übernimm ihn direkt.
Ist er kleiner, dann wird der alte Wert einfach nur um 1 verringert.
Wenn das je nach Wertebereich zu langsam wieder runter fällt, dann eben
2 abziehen (oder halbieren oder ...)
1 | static uint16_t oldPeak;
|
2 |
|
3 | uint16_t getNextPeak(uint16_t new_value)
|
4 | {
|
5 | if( new_value > oldPeak )
|
6 | oldPeak = new_value;
|
7 |
|
8 | else if( oldPeak > 0 )
|
9 | oldPeak--;
|
10 |
|
11 | return oldPeak;
|
12 | }
|
Ziel: ansteigende Werte werden sofort übernommen. Fällt der Wert, dann
tut er das langsam.