[C] Problema Programma FFt

di il
3 risposte

[C] Problema Programma FFt

RAGAZZI SONO UNA MATEMATICA, UN Pò IMPACCIATA IN PROGRAMMAZIONE..QUALCHE PROGRAMMATORE IN C POTREBBE DARMI UNA MANO CON UN PROGRAMMA FFT???
CI STO PROVANDO DA GIORNI IL MIO CODICE PARTE...MA IN MODO DICIAMO STRANO???UFFI

3 Risposte

  • Re: [C] Problema Programma FFt

    Spiegati megli (posta testo dell'esercizio e codice che hai scritto)...
    qualcuno saprà di sicuro darti una mano.... magari anche io....
  • Re: [C] Problema Programma FFt

    Grazie...ecco il mio codice...credo ci siano problemi nella function bitrev...
    
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
    
    void fft(int m,double **F);
    void esp( int b, int N , double **pot);
    int bitrev(int h, int i);
    void reorder(double **f, int m);
    
    /*SCOPO:calcolo della FFT di una seguenza di numeri complessi*/
    
    
    
    /*
    DESCRIZINE PARAMETRI
     m:(input) intero.La lunghezza della seguenza è 
     F:(input e output ) array di reali in doppia precisione  di dimensione
     In input F(i,0) contiene la parte reale di F,
      f(i,1) quella immaginaria.In otput contiene la DFT del vettore in input
    
    VARIABILI ESTERNE
     bitrev:funzione di tipo intero;inverte i bits di un intero
     esp:funzioner di tip void;calcola gli esponenziali
     extern int bitrev( int h,int i);
     extern void esp(intb, i nt N, double **pot);
     extern void reorder( double **F,int m);
    
     VARIABILI LOCALI
     i,j,k:interi.Contatori.
     a,h:interi.Variabili dìappoggio
     b:intero.b=
     N:intero.N=
     dual:intero.Indice del duale di un nodo.
     skip:intero.Distanza tra due nodi duali.
     index:intero.Variabile d'appoggio utilizzata per determinare l'esponenziale 
           corrispondente al passo ed all'indice dell'elemento da aggiornare
      reprod:reale in doppia precisione.Variabile d'appoggio
     improd.:reale in doppia precisione.Variabili d'appoggio.
     pot:puntatore a puntatori a reali in oppia precisione.Contiene gli esponenziali per il calcolo della DFT.
    */
    
    
    
    
    #include<math.h>
    #include<stdio.h>
    #include <stdlib.h>
    main()
    {
    int b,N,k,i,s,a,h,dual,skip,index,j,c,m;
    double reprod,improd;
    double **pot;
    double **F;
    /*Fase di lettura*/
    
    printf("L'esponente di 2 della sequenza è:\n");
    scanf("%d",&m);
    printf("%d\n\n",m);
    
    
    b=1<<(m-1);
    printf("Valore di b:\n");
    printf("%d\n",b);
    N=1<<m;
    printf("La dimensione delle righe dell'array è\n");
    printf("%d\n",N);
    
    
    
    printf("La dimensione delle colonne di un array è\n");
    scanf("%d",&c);
    printf("%d\n\n",c);
    
    /*allocazione memoria per la matrice F*/
    F=(double **)calloc(N,sizeof(double));
    for(i=0;i<N;i++)
    {
    F[i]=(double *)calloc( 2,sizeof(double));
    }
    
    printf("Inserisco il vettore\n");
    for(i=0;i<N;i++)
    {
    for(j=0;j<c-1;j++)
    {
    scanf("%lf",&F[i][j]);
    printf("F[%d][%d]=%lf",i,j,F[i][j]);
    printf("\n");
    }
    }
    
    
    
    /* Allocazione memoria per pot */
    
    pot=(double**)calloc(b,sizeof(double));
    for(k=0; k<b; k++)
    	pot[k]=(double *)calloc(2,sizeof(double));
    
    
    
    
    /* Chiamata alla routine per il calcolo degli esponenziali */
    esp(b,N,pot);
    for(k=0;k<b;k++){
    for(j=0;j<c-1;j++){
    printf("pot[%d][%d]=%lf",k,j,pot[k][j]);
    printf("\n");
    }
    }
    for(k=1;k<=m;k++)
    /*printf("k=\n");*/
    printf("%d\n\n",k);
    { /* Ciclo sui passi */       
    	skip=2<<(m-k);/*Distanza tra i nodi duali */    
    	h= 2*skip;/*esponenti utilizzati al passo corrente*/
           
    	for(i=0;i<=(N-h);i+=h){ /*Aggiornamento nodi duali */
    		index=(s+i)>>(m-k);
    		index=bitrev(index,k);
    		index=index<<(m-k);
    		for(j=i; j<i+skip; j++){
    			dual=j+skip;
    			reprod=pot[index][0]*F[dual][0];
    			reprod-=(pot[index][1]*F[dual][1]);
    			improd=pot[index][0]*F[dual][1];
    			improd+=(pot[index][1]*F[dual][0]);
    			F[dual][0]=F[j][0]-reprod;
    			F[dual][1]=F[j][1]-improd;
    			F[j][0]+=reprod;
    			F[j][1]+=improd;
    
    			}
    		}
             }
    reorder(F,m);/* di bit-revrsing sul risultato*/
    
    
    
    printf(" DFT di F\n");
    
    for(i=0;i<N;i++){
        for(j=0;j<c-1;j++){
        printf("F[%d][%d]=%lf",i,j,F[i][j]);
         printf("\n");
         }
    
    }
    return;
    } 
    
    
    
    
    
    #include<math.h>
    #include<stdio.h>
    #include <stdlib.h>
    void esp( int b, int N , double **pot)
    /*SCOPO:calcolo degli esponenziali ricorrenti nel calcolo della DFT */
    {
    
    
    /*DESCRIZIONE PARAMETRI
      b.(input) vale N\2
      N:(input) lunghezza della sequenza di cui si vuole calcolare la DFT
      pi:reale in doppia precisione .Vale 3.14
      arg:reale in doppia precisione .Argomento dell'esponenziale complesso
    */
    
    
    
      int i,k;
      double pi, arg;
    	printf("pi greco vale=\n",pi);
      	pi=acos(-1.); /*Caloclo di pi greco*/
    	printf("%lf\n",pi);
      /* Inizializzazione di pot*/
         pot[0][0]=1;
         pot[0][1]=0;
         printf("arg vale =\n",arg);
         arg=2.*pi/N;
         printf("%lf\n",arg);
         pot[1][0]=cos(arg);
         pot[1][1]=-sin(arg);
    
       
     /*Applicazione delle formule di addizione per seno e coseno*/
       for(i=2; i<b; i++){
    	pot[i][0]=pot[i-1][0]*pot[1][0];
    	pot[i][0]-=pot[i-1][1]*pot[1][1];
    	pot[i][1]=-(pot[i-1][0]*pot[1][1]);	
    	pot[i][1]-=pot[i-1][1]*pot[1][0];
    	printf("...........\n");
            printf("\n");
      }
    
    
      return;
     
    
    }
    
    
    
    
    #include<stdio.h>
    #include<math.h>
    #include <stdlib.h>
    
    int bitrev(int h, int i)
    
    /*SCOPO:inversione di un nunero prefissato di bits di un intero*/
    /*PARAMETRI
     h:(input) valore dell'intero del quale si vogliono invertire i bits
     i:(input) nunero di bits da invertirer
    
     j,k:interi.Contatori
     f,z.interi.Variabili d'appoggio
     z:intero.Valore di ritorno della funzione
    */
    
    {
     int j,k,l;
     int f,z;
    
     if(i!=1 && i!=0){
        z=0;/*Inizializzazione della variabile in uscita*/
        printf("f vale\n");
        f=1<<(i-1);
       printf("%d\n",f);
    
        for(k=1;k<=i; k++){
            printf("l vale\n");
      	l=h<<(i-k);
    	l=l&f;
             printf("%d\n",l);
    	z=z/l;printf("%d\n",z);
    	z=z>>(k-1);
    }
     }
    
     else 
    {
       z=h;
    
    }
    
    return(z);
    
    }
    
    
    
    
    
    
    #include<stdio.h>
    #include<math.h>
    #include <stdlib.h>
    
    void reorder(double **f, int m)
    /*SCOPO:riordinamento di un vettore, in modo che a 
            ciascuna componentevenga sostituita quella 
            il cui indice è il bit reversal dell'indice 
            di tale componente
    
      DESCRIZIONE PARAMETRI
       f:(input\output) in input contiene il vettore di
        cui si vogliono riordinare le componenti,in output 
        il vettore riordinato.
       m:(input) la lunghezza di f è.
    */
    
    {
    
       int i,k;  /*Contatori*/
       double **v;  /*Variabili d'appoggio*/
    
    
       v=(double **) calloc(1<<m,sizeof(double *));
       for(k=0;k<(1<<m);k++)
       	v[k]=(double*)calloc(2,sizeof(double));
    
    
       	for(k=0;k<(1<<m);k++){
       	/*Inversione bits */
    		i=bitrev(k,m);
    		v[k]=f[i];
    	}
    free(v);
    
    return;
    
    }
    
  • Re: [C] Problema Programma FFt

    Ciao annarella

    come primi messaggi hai "violato" qualche regola del forum
    La prossima volta ricordati di dare un titolo più consono al thread e di inserire il sorgente all'interno dei tag code (trovi il pulsante nella barra in alto).

    il programma con cui hai problemi è solo per linux o è un programma C in generale, perchè altrimenti va spostato
Devi accedere o registrarti per scrivere nel forum
3 risposte