00001 #include <sys/time.h>
00002 #include <unistd.h>
00003 #include <cstdlib>
00004 #include <cstring>
00005 #include <cstdio>
00006 #include <cmath>
00007
00008 #include "jitterometer.h"
00009
00010 Jitterometer::Jitterometer(char *nname, int ncycles)
00011 {
00012 times = (unsigned *)malloc(ncycles * sizeof(unsigned));
00013
00014 count = 0;
00015 starttime_valid = 0;
00016 num_cycles = ncycles;
00017 name = strdup(nname);
00018 }
00019
00020 Jitterometer::~Jitterometer()
00021 {
00022 free(times);
00023 free(name);
00024 }
00025
00026 bool Jitterometer::RecordCycleTime()
00027 {
00028 bool ret = RecordEndTime();
00029 RecordStartTime();
00030
00031 return ret;
00032 }
00033
00034 bool Jitterometer::RecordEndTime()
00035 {
00036 struct timeval timenow;
00037
00038 gettimeofday(&timenow, NULL);
00039
00040 if (starttime_valid)
00041 {
00042 times[count] =
00043 (timenow.tv_sec - starttime.tv_sec ) * 1000000 +
00044 (timenow.tv_usec - starttime.tv_usec) ;
00045
00046
00047
00048 count++;
00049 }
00050
00051 starttime_valid = 0;
00052
00053 if (count==num_cycles)
00054 {
00055
00056
00057 double mean = 0, sum_of_squared_deviations=0;
00058 double standard_deviation;
00059 double fps = 0, tottime = 0;
00060 int i;
00061
00062
00063 for(i=0; i<num_cycles; i++)
00064 {
00065 mean += times[i];
00066 }
00067 tottime = mean;
00068 mean /= num_cycles;
00069
00070 fps = num_cycles / tottime * 1000000;
00071
00072
00073 for(i=0; i<num_cycles;i++)
00074 {
00075 sum_of_squared_deviations += (mean - times[i]) * (mean - times[i]);
00076 }
00077
00078
00079 standard_deviation = sqrt(sum_of_squared_deviations / (num_cycles - 1));
00080
00081 printf("'%s' mean = '%.2f', std. dev. = '%.2f', fps = '%.2f'\n", name, mean, standard_deviation, fps);
00082
00083 count = 0;
00084
00085 return true;
00086 }
00087 return false;
00088 }
00089
00090 void Jitterometer::RecordStartTime()
00091 {
00092 gettimeofday(&starttime, NULL);
00093 starttime_valid = 1;
00094 }