Фильтрация входных данных
- Войдите на сайт для отправки комментариев
Ср, 05/08/2015 - 08:12
есть такой входной поток:
Sensor 1 Sensor 2 Sensor 3 Sensor 4 #1 31, 53, 25, 37, 46, 36, 2, 17, 2, 49, 94, 75, #2 27, 53, 27, 27, 46, 37, 16, 17, 2, 64, 95, 51, #3 33, 53, 33, 30, 46, 25, 3, 17, 2, 50, 95, 51, #4 35, 53, 37, 37, 46, 35, 2, 17, 2, 63, 95, 51, #5 27, 53, 26, 37, 46, 37, 2, 17, 16, 50, 95, 34, #6 27, 53, 27, 37, 46, 37, 2, 17, 12, 50, 95, 51, #7 30, 53, 37, 37, 46, 29, 2, 17, 2, 50, 95, 51, #8 8, 53, 1, 27, 46, 19, 11, 17, 2, 57, 95, 51, #9 27, 53, 9, 37, 46, 37, 2, 17, 2, 50, 95, 77, #10 29, 53, 27, 25, 46, 33, 16, 17, 2, 47, 95, 51, #11 33, 53, 28, 37, 46, 25, 2, 17, 2, 44, 95, 51, #12 31, 53, 27, 28, 46, 30, 2, 17, 2, 50, 95, 52, #13 35, 54, 37, 37, 46, 20, 2, 17, 2, 71, 95, 51, #14 27, 55, 27, 37, 47, 37, 2, 17, 2, 76, 95, 51, #15 28, 57, 28, 37, 46, 37, 2, 17, 2, 54, 95, 55, #16 28, 57, 28, 37, 47, 38, 2, 17, 2, 51, 95, 51, #17 28, 55, 28, 38, 47, 38, 2, 17, 0, 50, 95, 51, #18 21, 54, 23, 37, 47, 26, 2, 17, 2, 69, 95, 51, #19 34, 54, 37, 37, 47, 37, 2, 17, 2, 51, 96, 72, #20 0, 53, 27, 28, 47, 37, 16, 17, 2, 51, 96, 68, #21 23, 53, 27, 34, 46, 37, 16, 17, 2, 51, 96, 69, #22 27, 53, 27, 26, 47, 25, 16, 17, 2, 69, 96, 51, #23 27, 53, 28, 37, 47, 37, 2, 17, 2, 72, 96, 51, #24 27, 53, 28, 37, 47, 37, 2, 17, 16, 51, 96, 47, #25 27, 53, 27, 35, 47, 37, 2, 17, 2, 56, 96, 51, #26 31, 54, 34, 37, 47, 32, 2, 17, 2, 51, 96, 24, #27 27, 53, 27, 26, 47, 36, 16, 17, 2, 51, 96, 51, #28 31, 54, 37, 37, 46, 28, 2, 17, 2, 67, 96, 46, #29 9, 53, 27, 24, 46, 37, 16, 17, 2, 70, 96, 51, #30 27, 53, 25, 37, 47, 37, 2, 17, 2, 51, 96, 67, #31 27, 53, 27, 12, 47, 37, 2, 17, 2, 51, 96, 56, #32 37, 53, 7, 19, 47, 31, 2, 17, 2, 51, 96, 70, #33 30, 54, 27, 32, 47, 24, 11, 17, 2, 7, 96, 51, #34 28, 54, 37, 36, 46, 26, 2, 17, 2, 25, 96, 10, #35 6, 54, 27, 18, 47, 31, 16, 17, 2, 51, 96, 51, #36 27, 54, 24, 37, 47, 37, 2, 17, 16, 51, 96, 61, #37 27, 54, 27, 21, 47, 37, 16, 17, 2, 51, 96, 59, #38 35, 54, 29, 23, 46, 27, 2, 17, 2, 46, 95, 16, #39 27, 53, 27, 37, 46, 37, 2, 17, 2, 65, 96, 51, #40 27, 53, 27, 37, 47, 37, 2, 17, 16, 51, 96, 15, #41 27, 53, 27, 32, 47, 37, 8, 17, 2, 51, 96, 51, #42 35, 53, 35, 37, 46, 25, 2, 17, 2, 54, 95, 53, #43 27, 53, 27, 33, 46, 37, 1, 17, 2, 51, 95, 50, #44 37, 53, 13, 22, 46, 20, 2, 17, 2, 51, 95, 51, #45 14, 53, 35, 37, 46, 27, 2, 17, 2, 63, 95, 51, #46 33, 53, 37, 37, 46, 36, 2, 17, 2, 71, 95, 51, #47 27, 53, 8, 37, 46, 37, 2, 17, 2, 51, 95, 61, #48 12, 53, 27, 26, 46, 37, 2, 17, 12, 51, 95, 76, #49 29, 53, 27, 32, 46, 26, 13, 17, 2, 78, 95, 51, #50 27, 53, 26, 33, 46, 37, 2, 17, 3, 51, 95, 65, #51 33, 53, 32, 37, 47, 25, 2, 17, 2, 75, 95, 51, #52 27, 53, 27, 37, 46, 36, 2, 17, 2, 59, 95, 41, #53 27, 53, 27, 37, 46, 37, 2, 17, 2, 54, 95, 59, #54 27, 53, 27, 35, 46, 37, 2, 17, 4, 51, 95, 52, #55 31, 53, 4, 34, 46, 30, 8, 17, 2, 51, 95, 56, #56 37, 53, 4, 33, 47, 22, 1, 17, 2, 3, 95, 50, #57 27, 53, 26, 37, 46, 37, 2, 17, 2, 51, 95, 74, #58 33, 53, 27, 26, 46, 31, 16, 17, 2, 62, 95, 51, #59 27, 53, 27, 37, 47, 37, 2, 17, 14, 64, 95, 51, #60 29, 53, 35, 37, 46, 32, 2, 17, 2, 51, 95, 30, #61 27, 53, 27, 29, 46, 37, 16, 17, 2, 51, 95, 63, #62 0, 53, 27, 23, 46, 15, 16, 17, 2, 51, 95, 69, #63 19, 53, 27, 26, 47, 26, 16, 17, 2, 61, 95, 51, #64 26, 53, 33, 37, 46, 31, 2, 17, 2, 51, 95, 58, #65 13, 53, 27, 31, 46, 37, 16, 17, 2, 52, 95, 51, #66 30, 53, 13, 36, 46, 27, 2, 17, 2, 73, 95, 51, #67 27, 53, 24, 37, 46, 36, 2, 17, 2, 75, 95, 51, #68 27, 53, 27, 35, 46, 37, 2, 17, 14, 51, 95, 15, #69 27, 53, 27, 37, 46, 36, 2, 17, 2, 59, 95, 42, #70 27, 53, 27, 29, 46, 37, 16, 17, 2, 51, 95, 51, #71 29, 53, 31, 36, 46, 27, 2, 17, 2, 63, 95, 51, #72 27, 53, 33, 37, 47, 37, 2, 17, 15, 51, 95, 64, #73 37, 53, 28, 34, 46, 4, 9, 17, 2, 51, 95, 66, #74 3, 53, 27, 23, 47, 29, 2, 17, 2, 51, 95, 44, #75 27, 53, 27, 37, 46, 37, 2, 17, 16, 62, 95, 51, #76 30, 53, 33, 37, 46, 32, 2, 17, 2, 69, 95, 51, #77 27, 53, 27, 37, 46, 37, 2, 17, 14, 65, 95, 51, #78 29, 53, 32, 37, 46, 37, 2, 17, 16, 51, 95, 72, #79 37, 53, 8, 9, 46, 21, 16, 17, 2, 51, 95, 53, #80 4, 53, 27, 26, 46, 36, 16, 17, 2, 51, 95, 47, #81 27, 53, 27, 35, 46, 37, 10, 17, 2, 55, 95, 51, #82 26, 53, 28, 37, 46, 37, 2, 17, 2, 51, 95, 56, #83 27, 53, 27, 37, 46, 37, 2, 17, 2, 44, 95, 51, #84 27, 53, 27, 37, 46, 37, 2, 17, 16, 51, 95, 18, #85 27, 53, 24, 37, 46, 37, 2, 17, 2, 54, 95, 54, #86 27, 53, 27, 37, 46, 37, 2, 17, 16, 39, 95, 11, #87 31, 53, 27, 27, 46, 37, 16, 17, 2, 58, 95, 51, #88 27, 53, 29, 37, 46, 37, 2, 17, 15, 51, 95, 70, #89 0, 53, 27, 30, 46, 37, 16, 17, 2, 51, 95, 67, #90 20, 53, 27, 30, 46, 37, 16, 17, 2, 54, 95, 51, #91 28, 53, 5, 23, 46, 28, 2, 17, 2, 51, 95, 51, #92 30, 53, 27, 29, 47, 22, 0, 17, 2, 51, 95, 55, #93 33, 53, 34, 37, 46, 36, 2, 17, 2, 49, 95, 51, #94 26, 53, 33, 37, 46, 28, 2, 17, 2, 66, 95, 51, #95 31, 53, 0, 26, 46, 31, 7, 17, 2, 68, 95, 51, #96 27, 53, 27, 37, 46, 37, 2, 17, 16, 50, 95, 63, #97 27, 53, 27, 12, 46, 37, 2, 17, 12, 39, 95, 51, #98 36, 53, 35, 37, 46, 31, 2, 17, 2, 70, 95, 51, #99 27, 53, 20, 37, 46, 37, 2, 17, 14, 54, 95, 51, #100 26, 53, 35, 37, 46, 33, 2, 17, 2, 67, 95, 51, #101 26, 53, 33, 37, 46, 34, 2, 17, 2, 64, 95, 51, #102 27, 53, 17, 37, 46, 37, 2, 17, 2, 51, 95, 68, #103 27, 53, 27, 25, 46, 37, 16, 17, 2, 51, 95, 73, #104 37, 53, 33, 37, 46, 36, 2, 17, 2, 60, 95, 61, #105 27, 53, 27, 37, 46, 37, 2, 17, 2, 49, 95, 39, #106 27, 53, 10, 37, 46, 36, 2, 17, 2, 73, 95, 51, #107 27, 53, 27, 37, 46, 37, 2, 17, 2, 50, 95, 64, #108 27, 53, 27, 28, 46, 37, 16, 17, 2, 57, 95, 51, #109 27, 53, 27, 37, 46, 37, 2, 17, 1, 51, 95, 51, #110 26, 53, 34, 37, 46, 37, 2, 17, 16, 40, 95, 51, #111 31, 53, 37, 37, 46, 32, 2, 17, 2, 60, 95, 51, #112 25, 53, 34, 37, 47, 37, 2, 17, 16, 51, 95, 73, #113 30, 53, 27, 33, 46, 26, 12, 17, 2, 51, 95, 50, #114 35, 53, 37, 37, 46, 36, 2, 17, 2, 38, 95, 51, #115 35, 53, 37, 37, 47, 29, 2, 17, 2, 55, 95, 49, #116 27, 53, 27, 34, 46, 37, 2, 17, 2, 51, 95, 51, #117 27, 53, 27, 27, 46, 33, 16, 17, 2, 68, 95, 51, #118 27, 53, 27, 37, 47, 37, 2, 17, 16, 51, 95, 64, #119 4, 53, 27, 3, 46, 37, 2, 17, 16, 51, 95, 72, #120 29, 53, 27, 31, 46, 27, 14, 17, 2, 51, 95, 63, #121 35, 53, 37, 37, 46, 27, 2, 17, 2, 63, 95, 51, #122 27, 53, 25, 37, 46, 37, 2, 17, 2, 51, 95, 62, #123 27, 53, 27, 28, 46, 37, 16, 17, 2, 51, 95, 50, #124 8, 53, 6, 24, 46, 34, 16, 17, 2, 72, 95, 51, #125 27, 53, 24, 37, 46, 37, 2, 17, 2, 51, 95, 70, #126 27, 53, 27, 31, 46, 37, 16, 17, 2, 59, 95, 51, #127 27, 53, 23, 37, 46, 37, 2, 17, 2, 51, 95, 71, #128 9, 53, 27, 0, 46, 37, 2, 17, 15, 51, 95, 71, #129 3, 53, 27, 21, 46, 37, 10, 17, 2, 50, 95, 51, #130 29, 53, 0, 26, 46, 36, 16, 17, 2, 50, 95, 51, #131 30, 53, 37, 37, 46, 28, 2, 17, 2, 65, 95, 45, #132 27, 53, 26, 37, 46, 37, 2, 17, 16, 51, 95, 64, #133 33, 53, 27, 34, 46, 25, 1, 17, 2, 51, 95, 57, #134 35, 53, 33, 37, 46, 36, 2, 17, 2, 60, 95, 51, #135 27, 53, 26, 33, 46, 37, 16, 17, 2, 51, 95, 55, #136 27, 53, 27, 30, 46, 37, 16, 17, 2, 68, 95, 51, #137 27, 53, 33, 37, 47, 37, 2, 17, 16, 51, 95, 30, #138 27, 53, 27, 34, 46, 37, 8, 17, 2, 51, 95, 42, #139 34, 53, 10, 23, 46, 36, 16, 17, 2, 51, 95, 1, #140 27, 53, 27, 34, 47, 37, 2, 17, 12, 51, 95, 2, #141 27, 53, 23, 37, 46, 36, 2, 17, 2, 32, 95, 51, #142 27, 53, 0, 37, 46, 10, 2, 17, 2, 69, 95, 51, #143 27, 53, 28, 37, 46, 37, 2, 17, 16, 51, 95, 76, #144 0, 53, 27, 26, 46, 27, 3, 17, 2, 46, 95, 51, #145 27, 53, 18, 37, 46, 37, 2, 17, 2, 51, 95, 70, #146 14, 53, 27, 35, 46, 37, 2, 17, 5, 51, 95, 52, #147 29, 53, 29, 37, 47, 37, 2, 17, 2, 51, 95, 81, #148 31, 53, 27, 27, 46, 37, 16, 17, 2, 51, 95, 69, #149 6, 53, 27, 28, 46, 28, 2, 17, 2, 70, 95, 51, #150 27, 53, 26, 37, 46, 37, 2, 17, 7, 51, 95, 67, #151 34, 53, 27, 36, 47, 27, 2, 17, 2, 51, 95, 40, #152 17, 53, 27, 28, 46, 33, 16, 17, 2, 69, 95, 51, #153 26, 53, 36, 37, 46, 37, 2, 17, 16, 51, 95, 65, #154 12, 53, 27, 34, 46, 37, 2, 17, 7, 44, 95, 48, #155 29, 53, 0, 26, 46, 36, 16, 17, 2, 51, 95, 51, #156 26, 53, 28, 37, 46, 30, 2, 17, 2, 55, 95, 51, #157 27, 53, 27, 37, 46, 37, 2, 17, 2, 67, 95, 51, #158 27, 53, 26, 37, 46, 36, 2, 17, 2, 60, 95, 51, #159 27, 53, 8, 37, 46, 37, 2, 17, 2, 49, 95, 65, #160 20, 53, 27, 27, 46, 37, 16, 17, 2, 50, 95, 51, #161 3, 53, 4, 33, 46, 25, 2, 17, 2, 51, 95, 57, #162 30, 53, 27, 32, 46, 26, 13, 17, 2, 74, 95, 51, #163 27, 53, 1, 37, 46, 36, 2, 17, 2, 76, 95, 51, #164 27, 53, 21, 37, 47, 37, 2, 17, 16, 51, 95, 36, #165 27, 53, 27, 37, 46, 37, 2, 17, 16, 50, 95, 50, #166 27, 53, 26, 37, 47, 37, 2, 17, 2, 50, 95, 70, #167 23, 53, 27, 28, 46, 37, 13, 17, 2, 51, 95, 55, #168 30, 53, 29, 37, 47, 20, 2, 17, 2, 61, 95, 51, #169 27, 53, 27, 33, 46, 37, 2, 17, 2, 51, 95, 62, #170 27, 53, 17, 36, 46, 4, 15, 17, 2, 71, 95, 51, #171 27, 53, 27, 37, 46, 37, 2, 17, 2, 51, 95, 65, #172 32, 53, 27, 27, 46, 37, 9, 17, 2, 51, 95, 35, #173 31, 53, 27, 35, 46, 26, 9, 17, 2, 68, 95, 51, #174 27, 53, 27, 37, 46, 37, 2, 17, 2, 78, 95, 51, #175 27, 53, 27, 37, 46, 37, 2, 17, 2, 76, 95, 51, #176 27, 53, 27, 33, 46, 37, 2, 17, 3, 51, 95, 18, #177 27, 53, 27, 37, 46, 36, 2, 17, 2, 63, 95, 54, #178 27, 53, 27, 26, 46, 36, 16, 17, 2, 51, 95, 65, #179 27, 53, 27, 23, 46, 32, 2, 17, 2, 20, 95, 51, #180 27, 53, 25, 37, 46, 25, 2, 17, 2, 51, 95, 53, #181 35, 53, 19, 36, 46, 20, 2, 17, 2, 51, 95, 52, #182 26, 53, 29, 37, 46, 37, 2, 17, 2, 51, 95, 66, #183 27, 53, 27, 29, 46, 36, 16, 17, 2, 51, 95, 51, #184 28, 53, 7, 35, 46, 27, 2, 17, 2, 51, 95, 42, #185 27, 53, 27, 22, 46, 37, 16, 17, 2, 51, 95, 57, #186 22, 53, 27, 26, 46, 33, 16, 17, 2, 54, 95, 51, #187 31, 53, 37, 37, 46, 28, 2, 17, 2, 70, 95, 51, #188 27, 53, 27, 37, 47, 37, 2, 17, 16, 51, 95, 80, #189 31, 53, 27, 25, 46, 36, 16, 17, 2, 69, 95, 51, #190 27, 53, 27, 36, 46, 37, 2, 17, 6, 51, 95, 63, #191 2, 53, 27, 26, 47, 37, 16, 17, 2, 51, 95, 65, #192 27, 53, 27, 22, 46, 32, 2, 17, 2, 2, 95, 51, #193 25, 53, 34, 37, 46, 37, 2, 17, 2, 51, 95, 62, #194 27, 53, 27, 31, 46, 37, 16, 17, 2, 51, 95, 59, #195 11, 53, 3, 28, 46, 37, 11, 17, 2, 51, 95, 69, #196 26, 53, 27, 29, 46, 4, 16, 17, 2, 51, 95, 70, #197 18, 53, 27, 35, 46, 37, 2, 17, 7, 51, 95, 19, #198 27, 53, 27, 36, 46, 37, 2, 17, 6, 51, 95, 54, #199 27, 53, 26, 37, 46, 37, 2, 17, 2, 49, 95, 71, #200 27, 53, 27, 28, 46, 37, 16, 17, 2, 55, 95, 55,
Как можно выделить из этого два наиболее встречающихся числа из трех, для каждого сенсора?
Т.е. в данном случае получить тройки [*, 53, 27], [*, 46, 37], [2, 17 *], [*, 95, 51].
Сейчас используется среднее арифметическое, но из-за случайных всплесков отклонение от эталона получается более 3 единиц, что не устраивает: получается [25, 53, 25], [32, 46, 33], [5, 17, 4], [54, 95, 52].
#define DELTA 4 // допустимая погрешность #define compare(etalon,value) ((etalon<(value+DELTA))&&(etalon>=(value-DELTA)))?(true):(false) // возвращает true если цвет сенсора находится в заданном диапазоне // value - значение с сенсора, etalon - цветовая константа boolean matchSensor[4]={ false,false,false,false }; // признак совпадения цвета с эталоном для датчиков 1-4 void loop() { readSensor(SENSOR1_OUT); // получаем компоненты R, G, B с первого сенсора matchSensor[0] = compareColor(etalonSensor1[0], etalonSensor1[1], etalonSensor1[2]); // проверяем совпадение с эталоном readSensor(SENSOR2_OUT); // получаем компоненты R, G, B с первого сенсора matchSensor[1] = compareColor(etalonSensor2[0], etalonSensor2[1], etalonSensor2[2]); // проверяем совпадение с эталоном readSensor(SENSOR3_OUT); // получаем компоненты R, G, B с первого сенсора matchSensor[2] = compareColor(etalonSensor3[0], etalonSensor3[1], etalonSensor3[2]); // проверяем совпадение с эталоном readSensor(SENSOR4_OUT); // получаем компоненты R, G, B с первого сенсора matchSensor[3] = compareColor(etalonSensor4[0], etalonSensor4[1], etalonSensor4[2]); // проверяем совпадение с эталоном } boolean compareColor(byte etalonRColor, byte etalonGColor, byte etalonBColor) { boolean rColor = compare(etalonRColor,rawSensor[0]); boolean gColor = compare(etalonGColor,rawSensor[1]); boolean bColor = compare(etalonBColor,rawSensor[2]); byte result = rColor + gColor + bColor; if (result >= 2) return true; // если хотя есть бы два совпадения, то считаем что шар совпадает с эталоном else return false; }
Легко.
Заведи массив, скажем 3 на 50... и увеличивай каждую ячейку. Типа принял с датчика 32,17,45.... значит в 1-32 увелим на 1 и 2-17 плюс 1 и 3-45 на 1...
А потом просто посмотрим какая ячейка в кпждом ряде больше остальных в этом же ряду...
1. Не нашел в алгоритме "среднего арифметического", тогда зачем мозг пудрить? (риторический)
2. Почему здесь сравнение с эталоном, а не то, что написано в условии задачи "выделить из этого два наиболее встречающихся числа из трех, для каждого сенсора"?
3. Если рассматривать только одно условие задачи, а именно "выделить из этого два наиболее встречающихся числа из трех, для каждого сенсора", то фактически необходимо найти для каждой колонки число с максимальной частотой появления и выбрать из каждой тройки два наиболее часто встречающихся, так?
4. Следующее неизвестное: обработка идет неспешно, либо в живом потоке данных? Если второе, то частота по всему потоку, либо по скользящему окну (тогда размер окна нужен)?
5. Не описан дипазон значений в каждой колонке. Можно предполагать, что это 0-100, но не факт, а от этого может зависеть решение, памяти то не совсем "дофига".
Если решать задачу в лоб, то тупой БПФ по каждому столбцу, потом собираем максимумы и получаем ответ. Но этот вариант медленный и жрет памяти немало (впрочем это еще пока неизвестно).
Еще, можно ли обрабатывать столбцы раздельно? Т.е. сначала пробежаться по левому столбцу, потом по следующему и т.п.? В этом случае можно съэкономить памяти, но тогда потратим больше времени.
Это всё так, навскидку, пока что слишком много неясного в условии задачи.
Для определения "эталона" (два наиболее встречающихся числа для каждого сенсора) допустимо потратить и 200 циклов измерений (т.е. из 200 чисел в каждой колонке найти для каждой колонки число с максимальной частотой появления и выбрать из каждой тройки два наиболее часто встречающихся, , а при дальнейшем анализе поступающих данных (для сравнения с эталоном) лучше ограничиться выборкой из 10-20 измерений, т.к. такие тройки чисел поступают 5-10 раз в секунду, чтобы получать результат с минимальной задержкой.
Т.е. фактически сначала идет подготовительная часть, где производится поиск эталона. А потом, порциями, приходят данные, которые мы фильтруем эталоном, а остальные отбрасываем, впрочем эта часть есть в виде кода, не важно.
Тогда, если идем по колонкам, то получается достаточно просто:
1. Очищаем массив максимумов (обнуляем)
2. Берем число из колонки и используем его как индекс в массиме максимумов (что и писал Пухлявый), т.е. значение в массиве максимумов с этим индексом увеличиваем на 1.
3. После этого цикла находим максимум в массиве максимумов и запоминаем. Затем переходим к следующей колонке.
Далее берём эти максимумы тройками и в каждой тройке берем два максимально встречающихся значения. Эталон найден.
Спасибо, поэкспериментирую.
А фильтр Калмана тут можно использовать?http://habrahabr.ru/post/166693/
Увы, тут я не помощник. Здесь нужно понимать какие данные на входе и какие ошибки могут возникать. Собрать статистику, попробовать. Но это вроде бы очевидно.
Я бы ещё порылся в инете по фильтрации, если она действительно нужна.
Положение спас медианный фильтр, при глубине 10-20 итераций все лишнее замечательно отсекается, хоть и возникает небольшая инерционность при реалтайм обработке. Код был взят из этой темы, автор - гуру этого форума leshak, спасибо ему.
До Калмана так и не дошло. Попутно в сторонних библиотеках были найдены функции digitalSmooth и find_similar, но до них тоже дело не дошло :)