Exemple #1
0
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;

}
Exemple #2
0
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;

}