histogram.c

//
// Postprocess samples.dat
//

//
// Author: P.J. Drongowski
// 8 June 2013
//
// Copyright (c) 2013 Paul. J. Drongowski
//

#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

#define SAMPLES_FILE_NAME "samples.dat"
FILE* samples_file = NULL ;

#define RESULTS_FILE_NAME "histogram.txt"
FILE* results_file = NULL ;

unsigned int number_of_samples = 1000 ;
unsigned int* samples ;

#define NUMBER_OF_BINS 50
#define MIN_VALUE      0
#define MAX_VALUE      200
#define BIN_SIZE       ((MAX_VALUE-MIN_VALUE)/NUMBER_OF_BINS)
unsigned long int bins[NUMBER_OF_BINS] ;
unsigned long int overflows = 0 ;

int main(int argc, char* argv[])
{
  int status = 0 ;
  int index = 0 ;
  unsigned long int sample = 0 ;
  int i ;

  double sum = 0.0 ;
  double mean = 0.0 ;

  if ((samples_file = fopen(SAMPLES_FILE_NAME, "r")) == NULL) {
    fprintf(stderr, "*error* Couldn't open samples file\n") ;
    exit( EXIT_FAILURE ) ;
  }

  if ((results_file = fopen(RESULTS_FILE_NAME, "w")) == NULL) {
    fprintf(stderr, "*error* Couldn't open results file\n") ;
    exit( EXIT_FAILURE ) ;
  }

  status = fscanf(samples_file, "%lu", &number_of_samples) ;
  if (errno) {
    fprintf(stderr, "*error* File I/O failed\n") ;
    exit( EXIT_FAILURE ) ;
  }
  samples = (unsigned int*)malloc(number_of_samples * sizeof(unsigned int)) ;

  index = 0 ;
  do {
    status = fscanf(samples_file, "%lu", &sample) ;
    samples[index] = sample ;
    index++ ;
  } while (status != EOF) ;

  if (errno) {
    fprintf(stderr, "*error* File I/O failed\n") ;
    exit( EXIT_FAILURE ) ;
  }
  fprintf(results_file, "Read %d samples\n", index-1) ;

  for (i = 0 ; i < NUMBER_OF_BINS ; i++) {
    bins[i] = 0 ;
  }

  sum = 0.0 ;
  overflows = 0 ;
  for (i = 0 ; i < number_of_samples ; i++) {
    index = samples[i] / BIN_SIZE ;
    if (index >= NUMBER_OF_BINS) {
      // fprintf(results_file, "Sample: %lu\n", samples[i]) ;
      overflows++ ;
    } else {
      bins[index]++ ;
    }
    sum += samples[i] ;
  }

  fprintf(results_file, "Mean: %7.2f\n", sum / (double)number_of_samples) ;
  fprintf(results_file, "%ld overflow samples\n", overflows) ;
  fprintf(results_file, "Bin size is %d cycles\n", BIN_SIZE) ;

  for (i = 0 ; i < NUMBER_OF_BINS ; i++) {
    fprintf(results_file, "Bin[%3d]: %ld\n", i, bins[i]) ;
  }

  fclose(results_file) ;
  fclose(samples_file) ;
  return( EXIT_SUCCESS ) ;
}