summaryrefslogtreecommitdiff
path: root/_PROGRAMs/C++/УСРЕДНЕНИЕ.md
blob: 3204281a95970fc8474521cc6a1a9b53f8e2b19f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

```C++
################################################
// бегущее среднее
float k = 0.1; // коэффициент фильтрации, 0.0-1.0
float expRunningAverage(float newVal) {
	static float filVal = 0;
	filVal += (newVal - filVal) * k;
	return filVal;
}

################################################
// медиана на 3 значения со своим буфером
float medianRoom(float newValRoom) {
	static float bufRoom[3] = {0, 0, 0};
	if (!(bufRoom[0] + bufRoom[1] + bufRoom[2]))
		bufRoom[0] = bufRoom[1] = bufRoom[2] = newValRoom;
	static byte countRoom = 0;
	bufRoom[countRoom] = newValRoom;
	if (++countRoom >= 3)
		countRoom = 0;
	float dataRoom = (max(bufRoom[0], bufRoom[1]) == max(bufRoom[1], bufRoom[2]))
	? max(bufRoom[0], bufRoom[2])
	: max(bufRoom[1], min(bufRoom[0], bufRoom[2]));
	// return expRunningAverage(data);
	return dataRoom;
}

################################################

# это не совсем средние это апериодичное звено или простейший фильтр НЧ , и он имеет зону не чувствительности, скользящие средние делается через массив, код для ПЫКов , ну думаю разберетесь.  

unsigned int ReadADC_AN0(void)  
{ static unsigned char s_ucCount;  
  static unsigned int  m_TempResalt[32];  
  static unsigned int  s_uiSymm;  
   
  s_ucCount++;  
  s_ucCount&=0b00011111;  
  s_uiSymm -= m_TempResalt[s_ucCount];  
  __delay_us(20);   
  ADCON0bits.GO_DONE=1;  
  while(ADCON0bits.GO_DONE) continue;  
  __delay_us(5);  
  m_TempResalt[s_ucCount] = ADRESH;  
  m_TempResalt[s_ucCount]<<=8;  
  m_TempResalt[s_ucCount]+= ADRESL;  
  s_uiSymm += m_TempResalt[s_ucCount];  
  return s_uiSymm/32;     
}

################################################
//    AVR: Усредняем показания:
// revOld = старое значение
uint16_t filtr(uint16_t rev)
{
  static uint8_t a = pow(2, KOEFF) - 1;
  (revOld > rev / KOEFF) ? revOld = (a * revOld + rev) >> KOEFF : revOld = rev;
  return revOld;
}

################################################


################################################
```