リスト1
/* */
/* List 1 */
/* DC auto offset --- C source */
/* copyright (C) 2007 thinking-j, All Rights Reserved. */
/* */
#define OFFSET_MAX_COUNT 96 #define OFFSET_THRESHOLD 8
#define SENSEOR_MAX_COUNT 5
struct cyclic_array {
int index;
int data[OFFSET_MAX_COUNT];
int data_count;
};
int ca_input(int data, cyclic_array *array) {
array->data[array->index++] = data;
if (array->data_count < OFFSET_MAX_COUNT) array->data_count++;
if (array->index >= OFFSET_MAX_COUNT)
array->index = 0;
return array->data_count;
}
void ca_initialize(cyclic_array *array) {
int i = 0;
array->index = 0;
array->data_count = 0;
for (i=0; i < OFFSET_MAX_COUNT; i++) array->data[i] = 0;
}
int ca_average(cyclic_array *array) {
int average = 0;
int i = 0;
if (array->data_count == 0) return 0;
while (i < array->data_count)
average += array->data[i++];
return average/i;
}
int ca_n_average(int first, int count, cyclic_array *array) {
int average;
int max;
int i , j;
if (first > array->data_count) return 0;
if (array->data_count < OFFSET_MAX_COUNT)
j = 0;
else
j = first + array->index + 1;
if (j>=OFFSET_MAX_COUNT) j -= OFFSET_MAX_COUNT;
if (count > array->data_count)
max = array->data_count;
else
max = count;
average = 0;
for(i=0; i < max; i++) {
average += array->data[j++];
if (j==OFFSET_MAX_COUNT) j = 0;
}
return average/max;
}
int ca_smoothing(int count, cyclic_array *array) {
int average;
int max;
int i , j;
if (array->data_count < count)
j = 0;
else
j = array->index - count + 1;
if (j < 0) j += OFFSET_MAX_COUNT;
if (count > array->data_count)
max = array->data_count;
else
max = count;
average = 0;
for(i=0; i < max; i++) {
average += array->data[j++];
if (j==OFFSET_MAX_COUNT) j = 0;
}
return average/max;
}
int auto_offset(int data, cyclic_array *array, int old_ave, int max_count, int threshold) {
int average;
int half;
int part_1, part_2;
half = max_count/2;
if (ca_input(data, array) < max_count)
average = ca_average(array);
else { part_1 = ca_n_average(0, half, array);
part_1 = ca_n_average(half, half, array);
if (abs(part_1 - part_2) < threshold)
average = part_2;
else
average = old_ave;
}
return average;
}
int auto_offset3(int data, cyclic_array *array, int old_ave, int max_count, int threshold) {
int average;
int one_third;
int part_1, part_2, part_3;
one_third = max_count/3;
if (ca_input(data, array) < max_count)
average = ca_average(array);
else {
part_1 = ca_n_average(0, one_third, array);
part_2 = ca_n_average(one_third, one_third, array);
part_3 = ca_n_average(2*one_third, one_third, array);
if ((abs(part_1 - part_2) < threshold) && (abs(part_3 - part_2) < threshold))
average = part_3;
else
average = old_ave;
}
return average;
}