/*
* 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(); } } |