diff options
Diffstat (limited to '_PROGRAMs/C++/УСРЕДНЕНИЕ.md')
| -rw-r--r-- | _PROGRAMs/C++/УСРЕДНЕНИЕ.md | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/_PROGRAMs/C++/УСРЕДНЕНИЕ.md b/_PROGRAMs/C++/УСРЕДНЕНИЕ.md new file mode 100644 index 0000000..3204281 --- /dev/null +++ b/_PROGRAMs/C++/УСРЕДНЕНИЕ.md @@ -0,0 +1,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; +} + +################################################ + + +################################################ +``` + |
