/******************************************************************************************************************
 *  File: transvec.c
 *  Authors : Ktatruc (Areabot)
 *  Date : 29/10/2005
 *  This program is released under the GNU Public License.
 *  
 *  Ce programme recupère la sortie du testbench Verilog, et calcule une FFT du signal de sortie pour
 *  visionner son spectre (avec gnuplot).
 *
 *  Usage : transvec xxx.dat
 *  Il est appelé par le Makefile
 *
 *  ATTENTION : je l'ai ecrit en 10 minutes, il y a *BEAUCOUP* de choses immondes la-dedans...
 * 
 *******************************************************************************************************************/



#include <stdlib.h>
#include <stdio.h>
#include <fftw3.h>
#include <math.h>
#include <string.h>


fftw_complex *out;
double *in;
fftw_plan p;
long N=0;
char * filename;
double duree;


void init_tableaux() {
    long i,j, k;
    FILE *fin;
    char c[1000];

    // Read src.dat et compte le nombre de samples
    fin = fopen(filename, "r");
    N=0;
    if(fscanf(fin, "%lf\n", &duree)!=1) {
        fprintf(stderr, "Il manque la duree de simu dans le fichier de log !\n");
        exit(-1);
    }
    duree = duree / 1000000000;
    printf("Duree de simulation : %lf(s)\n", duree);

    while (!feof(fin)) {
        N +=fread(c, sizeof(char), 1000, fin);
    }
    printf("Nombre de samples : %d\n", N);
    
    in = fftw_malloc(sizeof(double) * N);
    out = fftw_malloc(sizeof(fftw_complex) * N);
    
    // Read src.dat et remplit le tableau
    fseek(fin, 0, SEEK_SET);
    do {
        fread(c, sizeof(char), 1, fin);
    }
    while(c[0]!='\n');
    k = 0;
    while (!feof(fin)) {
        i = fread(c, sizeof(char), 1000, fin);
        for(j=0; j<i; j++)
            in[k++] = (c[j]=='1') ? 1.0 : 0.0;
    }
    fclose(fin);
}


void compute_fft() {
    p = fftw_plan_dft_r2c_1d(N, in, out, FFTW_ESTIMATE);
    fftw_execute(p);
    fftw_destroy_plan(p);
}

void write_files() {
    FILE *fout;
    double a;
    long i;
    char filename_out[1000];
    char *pos;
    
    sprintf(filename_out, "%s", basename(filename));
    pos = strstr(filename_out, ".dat");
    sprintf(pos, ".fft");
    fout = fopen(filename_out, "w");
    // Ecrit dest.dat

    // Le premier élement a un traitement particulier 
    i=0;
    a = sqrt(out[i][0]*out[i][0]+out[i][1]*out[i][1]);
    a = a / N;

    // Les autres ont un facteur 2...
    fprintf(fout, "%f %12f\n", (double)0, a);
    for(i=1; i<N; i++) {
        a = sqrt(out[i][0]*out[i][0]+out[i][1]*out[i][1]);
        a = 2 * a / N;
        fprintf(fout, "%f %12f\n", ((double)i)/duree, a);
    }

    fclose(fout);

}


int main(int argc, char** argv) {

    if(argc!=2) {
        fprintf(stderr, "Usage : truc filename\n");
        exit(-1);
    }

    filename = argv[1];
    init_tableaux();

    printf("Computing FFT\n");
    compute_fft();

    printf("Writing output file\n");
    write_files();

    fftw_free(in); fftw_free(out);

    exit(0);
}

