H.9 spectrum_analyzer.c

/*  
 * spectrum_analyzer.c -- Analizador de espectros.  
 *  
 * Este fichero fuente puede encontrarse en:  
 * http://www.ace.ual.es/~vruiz/docencia/redes/practicas/spectrum_analyzer.c  
 *  
 * Compilar escribiendo (el paquete fftw debería estar instalado!):  
 * gcc spectrum_analyzer.c -o spectrum_analyzer spin.o -lfftw3 -lm  
 *  
 * Más información en: http/www.fftw.org  
 *  
 * gse. 2007  
 */  
 
#include <stdio.h>  
#include <stdlib.h>  
#include <math.h>  
#include <fftw3.h>  
#include "spin.h"  
 
main(int argc, char *argv[]) {  
  if(argc < 2) {  
    fprintf(stderr,"%s input_signal.float > spectrum.txt\n",argv[0]);  
  } else {  
    FILE *input_file = fopen(argv[1],"rb");  
    if(!input_file) {  
      fprintf(stderr,"%s: unable to open input file \"%s\"\n"  
              ,argv[0],argv[2]);  
      exit(1);  
    }  
 
    int samples = compute_number_of_samples(input_file);  
    fprintf(stderr,"%s: number of samples = %d\n",argv[0],samples);  
 
    double       *in  = (double       *)fftw_malloc(samples*sizeof(double      ));  
    fftw_complex *out = (fftw_complex *)fftw_malloc(samples*sizeof(fftw_complex));  
 
    /* Creamos un plan para la fftw */  
    fftw_plan p = fftw_plan_dft_r2c_1d(samples, in, out, 0);  
 
    read_signal(in, input_file, samples);  
 
    /* Calculamos la transformada de Fourier */  
    fftw_execute(p);  
 
    /* Generamos el espectro de la señal */ {  
      int k;  
      for(k=0; k<samples/2; k++) {  
        double power_spectrum = sqrt(out[k][0]*out[k][0] + out[k][1]*out[k][1]);  
        fprintf(stdout,"%f\n",power_spectrum);  
      }  
    }  
 
    /* Destruímos el plan */  
    fftw_destroy_plan(p);  
 
    /* Liberamos memoria */  
    free(out);  
    free(in);  
  }  
  return 0;  
}  
 
int compute_number_of_samples(FILE *input_file) {  
  fseek(input_file,0,SEEK_END);  
  int samples = ftell(input_file)/sizeof(float);  
  rewind(input_file);  
  return samples;  
}  
 
read_signal(double *in, FILE *input_file, int samples) {  
  int i;  
  for(i=0; i<samples; i++) {  
    float x;  
    fread(&x,sizeof(float),1,input_file);  
    in[i] = (double)x;  
    spin();  
  }  
}