X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=transform.c;h=8b525d177122f5efd7d92c73e735a8fbedda8176;hb=b24d6584ce3c44cdb5ba9ebe6aa525ff7ecd477c;hp=74582a79fac83bf5fa894b6f94481115a2bd0cee;hpb=966751be50b3ae8d7a8c6e2e61eef1aacd1c5fda;p=android-x86%2Fhardware-intel-libsensors.git diff --git a/transform.c b/transform.c index 74582a7..8b525d1 100644 --- a/transform.c +++ b/transform.c @@ -199,10 +199,10 @@ static void denoise (struct sensor_info_t* si, struct sensors_event_t* data, */ int i; - float total; int f; int sampling_rate = (int) si->sampling_rate; int history_size; + int history_full = 0; /* Don't denoise anything if we have less than two samples per second */ if (sampling_rate < 2) @@ -221,32 +221,43 @@ static void denoise (struct sensor_info_t* si, struct sensors_event_t* data, si->history_index = 0; si->history = (float*) realloc(si->history, si->history_size * num_fields * sizeof(float)); + if (si->history) { + si->history_sum = (float*) realloc(si->history_sum, + num_fields * sizeof(float)); + if (si->history_sum) + memset(si->history_sum, 0, num_fields * sizeof(float)); + } } - if (!si->history) + if (!si->history || !si->history_sum) return; /* Unlikely, but still... */ /* Update initialized samples count */ if (si->history_entries < si->history_size) si->history_entries++; + else + history_full = 1; - /* Record new sample */ - for (f=0; f < num_fields; f++) - si->history[si->history_index * num_fields + f] = data->data[f]; - - /* Update our rolling index (next evicted cell) */ - si->history_index = (si->history_index + 1) % si->history_size; - - /* For now simply compute a mobile mean for each field */ + /* Record new sample and calculate the moving sum */ for (f=0; f < num_fields; f++) { - total = 0; + /** + * A field is going to be overwritten if + * history is full, so decrease the history sum + */ + if (history_full) + si->history_sum[f] -= + si->history[si->history_index * num_fields + f]; - for (i=0; i < si->history_entries; i++) - total += si->history[i * num_fields + f]; + si->history[si->history_index * num_fields + f] = data->data[f]; + si->history_sum[f] += data->data[f]; - /* Output filtered data */ - data->data[f] = total / si->history_entries; + /* For now simply compute a mobile mean for each field */ + /* and output filtered data */ + data->data[f] = si->history_sum[f] / si->history_entries; } + + /* Update our rolling index (next evicted cell) */ + si->history_index = (si->history_index + 1) % si->history_size; }