int32_t feedIntMovingStdDev(IntMovingStdDev* container, int32_t sample) { int i = 0; if(container == NULL) return 0; feedIntMovingMean(container->meanContainer, sample); if (container->meanContainer->count < 2) { container->stdDev = 0; } else { container->squareSum = 0; for(i = 0; i < container->meanContainer->count; i++) { container->squareSum += ( sample - container->meanContainer->mean ) * ( sample - container->meanContainer->mean ); } container->stdDev = sqrt ( container->squareSum / (container->meanContainer->count - 1 )); } return container->stdDev; }
Boolean feedIntMovingStatFilter(IntMovingStatFilter* container, int32_t sample) { if(container == NULL) return 0; if(container->filterType == FILTER_NONE) { container->output = sample; return TRUE; } else { /* cheat - the mean container is used as a general purpose sliding window */ feedIntMovingMean(container->meanContainer, sample); } container->counter++; container->counter = container->counter % container->meanContainer->capacity; switch(container->filterType) { case FILTER_MEAN: container->output = container->meanContainer->mean; break; case FILTER_MEDIAN: { int count = container->meanContainer->count; int32_t sortedSamples[count]; Boolean odd = ((count %2 ) == 1); memcpy(sortedSamples, container->meanContainer->samples, count * sizeof(sample)); qsort(sortedSamples, count, sizeof(sample), cmpInt32); if(odd) { container->output = sortedSamples[(count / 2)]; } else { container->output = (sortedSamples[(count / 2) -1] + sortedSamples[(count / 2)]) / 2; } } break; case FILTER_MIN: { int count = container->meanContainer->count; int32_t sortedSamples[count]; memcpy(sortedSamples, container->meanContainer->samples, count * sizeof(sample)); qsort(sortedSamples, count, sizeof(sample), cmpInt32); container->output = sortedSamples[0]; } break; case FILTER_MAX: { int count = container->meanContainer->count; int32_t sortedSamples[count]; memcpy(sortedSamples, container->meanContainer->samples, count * sizeof(sample)); qsort(sortedSamples, count, sizeof(sample), cmpInt32); container->output = sortedSamples[count - 1]; } break; case FILTER_ABSMIN: { int count = container->meanContainer->count; int32_t sortedSamples[count]; memcpy(sortedSamples, container->meanContainer->samples, count * sizeof(sample)); qsort(sortedSamples, count, sizeof(sample), cmpAbsInt32); container->output = sortedSamples[0]; } break; case FILTER_ABSMAX: { int count = container->meanContainer->count; int32_t sortedSamples[count]; memcpy(sortedSamples, container->meanContainer->samples, count * sizeof(sample)); qsort(sortedSamples, count, sizeof(sample), cmpAbsInt32); container->output = sortedSamples[count - 1]; } break; default: container->output = sample; return TRUE; } DBGV("filter %s, Sample %d output %d\n", container->identifier, sample, container->output); if((container->windowType == WINDOW_INTERVAL) && (container->counter != 0)) { return FALSE; } return TRUE; }