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;
}