Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2014
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.44 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <conio.h>
  4. #include <time.h>
  5.  
  6.  
  7. typedef struct{
  8.     double a, b;
  9. } complex;
  10.  
  11. complex criandowr(int N ,int i);
  12. void ordenandoxn(int N, int nbits,complex *xn);
  13. int obtendoN();
  14. float *lendoarquivo(int N);
  15. void fft(int nbits,int N,complex *xn,complex *wn);
  16. complex soma(complex z1, complex z2);
  17. complex subtr(complex z1, complex z2);
  18. complex mult(complex z1, complex z2);
  19. complex div(complex z1, complex z2);
  20. double modulo(complex z);
  21. double angle(complex z);
  22. void mostra(complex z);
  23. complex le(void);
  24.  
  25.  
  26.  
  27.  
  28. double pi = M_PI;
  29.  
  30.  
  31.  
  32. void main (){
  33.     time_t inicio, fim,result;
  34.     int i,j;
  35.     int n,N;
  36.     double nbits;
  37.     N =  obtendoN();
  38.  
  39.     complex*  wr = (complex*)malloc(N * sizeof(complex));
  40.     complex*  Xn = (complex*)malloc(N * sizeof(complex));
  41.     complex *xn = lendoarquivo(N);
  42.  
  43.     printf("Numero de Amostras %i",N);
  44.  
  45.     //resolvendo a DFT
  46.  
  47.     for(i=0;i<N;i++){
  48.         Xn[i].a = 0;
  49.         Xn[i].b = 0;
  50.     }
  51.  
  52.  /*
  53.     inicio= time(NULL);
  54.     for(i=0;i<=(N-1);i++){
  55.         for (j=0;j<=(N-1);j++){
  56.            wr[i].a =  cos((2*pi*i*j)/N);
  57.            wr[i].b =  -sin((2*pi*i*j)/N);
  58.            Xn[i].a =  Xn[i].a + (xn[j].a * wr[i].a);
  59.            Xn[i].b =  Xn[i].b + (xn[j].a * wr[i].b );
  60.         }
  61.     }
  62.  
  63.  
  64.     fim= time(NULL);
  65.     printf("\n O tempo de Execucao(DFT) foi : %.2f",difftime(fim,inicio));
  66.  
  67. */
  68.  
  69.  
  70.     //Calculando o numerod de bits para a FFT
  71.     nbits = (log10(N)/log10(2));
  72.     nbits = (int) nbits;
  73.  
  74.  
  75.     //Criando os valores Wn e colocando no vetor para FFT
  76.     for(i =0 ; i<=(N-1); i++){
  77.         wr[i] = criandowr(N,i);
  78.         //printf("\n Valor Wn[%i]= %lf + j %lf",i,wr[i].a,wr[i].b);
  79.     }
  80.  
  81.  
  82.  
  83.     //Chamada da funcao que ordena os Xn
  84.     ordenandoxn(nbits,N,xn);
  85.  
  86.  
  87.  
  88.     fft(nbits,N,xn,wr);
  89.  
  90.  
  91.  
  92.  
  93. }
  94.  
  95. /* Nao precisava criar um vetor da estrutura complex, voce so precisa retornar uma dela... */
  96. complex criandowr(int N ,int i){
  97.  
  98.     complex wr;
  99.     wr.a =  cos((2*pi*i)/N);
  100.     wr.b =  -sin((2*pi*i)/N);
  101.  
  102.     return wr ;
  103.  
  104. }
  105. void ordenandoxn(int nbits,int N,complex *xn){
  106.     int i,j;
  107.  
  108.  
  109.    // int array[N][nbits];
  110.  
  111.     //N= 13;
  112.     int **array ;
  113.     array=(int**) malloc(N*nbits*sizeof(int));
  114.     for(i=0;i < N;i++){
  115.         array[i]=(int*)malloc(nbits*sizeof(int));
  116.     }
  117.  
  118.  
  119.  
  120.     for(j=0;j<(N);j++){
  121.  
  122.         for(i=0;i<(nbits);i++){
  123.             printf("\n DEBUG %i %i",j,i);
  124.             array[j][i]=0;
  125.         }
  126.     }
  127.  
  128.  
  129.  
  130.     // conveterndo de decimal para binario(ja esta invertendo)
  131.         for(i=0;i<=(N-1);i++){
  132.             int a=0;
  133.             int  aux = i;
  134.             while(aux>=2 || aux==1){
  135.                 array[i][a] = aux % 2;
  136.                 a++;
  137.                 if(aux==2){
  138.                     array[i][a] = aux/2;
  139.                     }
  140.                 aux = aux/2;
  141.             }
  142.         }
  143.  
  144.         for(i=0;i<N;i++){
  145.             for(j=0;j<(nbits);j++){
  146.              //printf("%i", array[i][j]);
  147.             }
  148.         }
  149.  
  150.         //conveterndo de binairo pra decimal
  151.         int a ;
  152.         int  arrayaux[N];
  153.  
  154.          for (i=0; i<N ; i++){
  155.             arrayaux[i]=0;
  156.  
  157.          }
  158.  
  159.         for(i=0;i<N;i++){
  160.             int expoente = nbits  ;
  161.             for(j=0;j<nbits;j++){
  162.                 expoente = expoente - 1 ;
  163.                 a = (array[i][j] * pow((2),(expoente)));
  164.                 arrayaux[i]= a + arrayaux[i];
  165.  
  166.             }
  167.  
  168.          //   printf("\n Valor de Arrayaux[%i] = %i",i,arrayaux[i]);
  169.         }
  170.  
  171.  
  172.         int Aux[N];
  173.         for(i=0;i<N;i++){
  174.             Aux[i]= arrayaux[i];
  175.  
  176.            // printf("\n Valor de AUX %i",Aux[i]);
  177.  
  178.         }
  179.  
  180.  
  181.         float arrayvd[N];
  182.  
  183.         for(i=0;i<N;i++){
  184.             arrayvd[i] = xn[i].a;
  185.         }
  186.  
  187.         for(i=0;i<N;i++){
  188.            xn[Aux[i]].a= arrayvd[i];
  189.         }
  190.  
  191.  
  192.         for(i=0;i<N;i++){
  193.            // printf("\n Valor de X[%i]= %lf",i,xn[i].a);
  194.         }
  195.  
  196. }
  197. void fft(int nbits,int N,complex *xn,complex *wr){
  198.  
  199.     time_t inicio , fim;
  200.     //int caixas, pares,fatores;
  201.  
  202.      //para tamanho do passo dos fatores
  203.     complex *oldxn = (complex*)malloc(N * sizeof(complex));
  204.     int caixas = malloc(N * sizeof(int));
  205.     int pares = malloc(N * sizeof(int));
  206.     int fatores = malloc(N * sizeof(int));
  207.     int i = malloc(N * sizeof(int));
  208.     int j = malloc(N * sizeof(int));
  209.     int k = malloc(N * sizeof(int));
  210.     int incr = malloc(N * sizeof(int));
  211.     int incrxn = malloc(N * sizeof(int));
  212.     int p = malloc(N * sizeof(int));
  213.  
  214.     caixas = ((N)/2);
  215.     pares = ((N)/(N));
  216.     fatores = ((N)/2);
  217.     incr=0;
  218.     incrxn=0;
  219.     p;
  220.  
  221.     printf("caixas %i pares %i fatores %i",caixas,pares,fatores);
  222.  
  223.     inicio= time(NULL);
  224.     for(i = 0; i < nbits; i++) {
  225.       //  printf("\nEstágio Número: %i", i);
  226.         for (j = 0; j < caixas; j++){
  227.             //printf("\nCaixa Número: %i", j);
  228.             incr = 0;
  229.             for (k = 0; k < pares; k++){
  230.               //  printf("\nPares: %i", k);
  231.                 if (i == 0)
  232.                 {
  233.                     incr = 0;
  234.                 }
  235.                 if (k != 0)
  236.                 {
  237.                     incr = incr + caixas;
  238.                 }
  239.  
  240.                     oldxn[incrxn] = soma(xn[incrxn],(mult(wr[incr],xn[incrxn+pares])));
  241.                     xn[incrxn+pares] = soma(xn[incrxn],(mult(wr[incr+fatores],xn[incrxn+pares])));
  242.                     xn[incrxn] = oldxn[incrxn];
  243.                 incrxn = incrxn + 1;
  244.                 p = incrxn + pares;
  245.             }
  246.             incrxn = p;
  247.             //printf("\n");
  248.         }
  249.         caixas = caixas/2;
  250.         pares = pares*2;
  251.         incrxn =0;
  252.        // printf("\n\n");
  253.     }
  254.  
  255.     fim= time(NULL);
  256.     printf("\n O tempo de Execucao(FFT) foi : %.2f",difftime(fim,inicio));
  257.  
  258.  
  259.         for(i=0;i<20;i++){
  260.              printf("\n X[%i] = %lf   j %lf",i, xn[i].a, xn[i].b);
  261.  
  262.         }
  263. }
  264. complex soma(complex z1, complex z2){
  265.  
  266.     complex resultado ;
  267.     resultado.a = (z1.a + z2.a);
  268.     resultado.b = (z1.b + z2.b);
  269.     return resultado;
  270. }
  271. complex subtr(complex z1, complex z2){
  272.  
  273.     complex resultado ;
  274.  
  275.     resultado.a = (z1.a - z2.a);
  276.     resultado.b = (z1.b - z2.b);
  277.  
  278.     return resultado;
  279. }
  280. complex mult(complex z1, complex z2){
  281.  
  282.     complex resultado ;
  283.  
  284.     resultado.a = ((z1.a * z2.a)-(z1.b * z2.b));
  285.     resultado.b = ((z1.a * z2.b)+(z1.b * z2.a));
  286.  
  287.     return resultado;
  288. }
  289. complex div(complex z1, complex z2){
  290.  
  291.     complex resultado ;
  292.  
  293.     resultado.a = ((z1.a * z2.a)+(z1.b * z2.b))/((z2.a * z2.a)+(z2.b * z2.b));
  294.     resultado.b = ((z2.a * z1.b)-(z1.a * z2.b))/((z2.a * z2.a)+(z2.b * z2.b));
  295.  
  296.     return resultado;
  297. }
  298. int obtendoN(){
  299.  
  300.     int N;
  301.     char url[] = "voz.txt";
  302.     FILE *arq;
  303.     arq = fopen(url, "r");
  304.  
  305.     if (arq == NULL)
  306.         printf("Erro! Não foi possivel abrir o arquivo!\n");
  307.     else {
  308.         char info[7], aux[50];
  309.         fgets(info, sizeof (info), arq);
  310.         N = (int) atoi(info);
  311.     }
  312.     fclose(arq);
  313.  
  314.     return N;
  315.  
  316. }
  317. float *lendoarquivo(int N){
  318.  
  319.  
  320.     FILE *fp = fopen("voz.txt", "r");
  321.     double current_val;
  322.     int n;
  323.  
  324.     //Le quantos valores existem
  325.     fscanf(fp, "%i", &n);
  326.  
  327.     //Aloca o espaco necessario para guardar n floats
  328.     complex* xn = (complex*)malloc(n * sizeof(complex));
  329.  
  330.     int i;
  331.     for(i = 0; i < n; i++) {
  332.         fscanf(fp, "%lf", &current_val);
  333.         xn[i].a = current_val;
  334.         //printf("\n x[%i]=%lf",i,xn[i]);
  335.     }
  336.  
  337.     return xn;
  338.  
  339. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement