Hi, Can somebody please take a look at the following code and give me some hints on how to improve the efficiency of this code, like making it several times faster? I've tried to modify it many times, but none of them seemed to give me any significant improvement. Thank You very much!!
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
float pi=3.14159265358979;
#define matrix_element(i,j) ((i)*2+(j)-1)
int fft(int N,float *a,float *b)
{ int i;
float WNi[2];
float *x1,*x2,*X1,*X2;
if (N==1) {b[matrix_element(0,1)]=a[matrix_element(0,1)];b[matrix_element(0,2)]=a[matrix_element(0,2)];return 1;}
x1=(float *)malloc(N*sizeof(float));
x2=(float *)malloc(N*sizeof(float));
X1=(float *)malloc(N*sizeof(float));
X2=(float *)malloc(N*sizeof(float));
for(i=0;i<N;i++){
if (i%2){
x2[matrix_element((i/2),1)]=a[matrix_element(i,1)];
x2[matrix_element((i/2),2)]=a[matrix_element(i,2)];
}
else{
x1[matrix_element((i/2),1)]=a[matrix_element(i,1)];
x1[matrix_element((i/2),2)]=a[matrix_element(i,2)];
}
}
fft(N/2,x1,X1);
fft(N/2,x2,X2);
for(i=0;i<(N/2);i++){
WNi[matrix_element(0,1)]=cos(i*2*pi/N);
WNi[matrix_element(0,2)]=-sin(i*2*pi/N);
b[matrix_element(i,1)]=X1[matrix_element(i,1)]+X2[matrix_element(i,1)]*WNi[matrix_element(0,1)]-X2[matrix_element(i,2)]*WNi[matrix_element(0,2)];
b[matrix_element(i,2)]=X1[matrix_element(i,2)]+X2[matrix_element(i,1)]*WNi[matrix_element(0,2)]+X2[matrix_element(i,2)]*WNi[matrix_element(0,1)];
b[matrix_element((i+N/2),1)]=X1[matrix_element(i,1)]-X2[matrix_element(i,1)]*WNi[matrix_element(0,1)]+X2[matrix_element(i,2)]*WNi[matrix_element(0,2)];
b[matrix_element((i+N/2),2)]=X1[matrix_element(i,2)]-X2[matrix_element(i,1)]*WNi[matrix_element(0,2)]-X2[matrix_element(i,2)]*WNi[matrix_element(0,1)];
}
free(x1);
free(x2);
free(X1);
free(X2);
return 1;
}
int main()
{
FILE *fp0,*fp1;
clock_t start,finish;
float *input_array, *output_array;
float real,im;
int lengtha=1;
int i=0;
input_array=(float *)malloc(2*lengtha*sizeof(float));
fp0=fopen("infile","r"
;
fscanf(fp0,"%f",&real);
while(fscanf(fp0,"%f",&im)!=EOF){
if((i+1)>lengtha){lengtha=lengtha*2;
if((input_array=(float *)realloc((void *)input_array,2*lengtha*sizeof(float)))==NULL) {printf("Memory allocation error\n"
; return 0;}}
input_array[matrix_element(i,1)]=real;
input_array[matrix_element(i,2)]=im;
i++;
fscanf(fp0,"%f",&real);
}
fclose(fp0);
output_array=(float *)malloc(2*lengtha*sizeof(float));
start=clock();
fft(lengtha,input_array,output_array);
finish=clock();
printf("Computed FFT in %f seconds",((float)(finish-start))/CLK_TCK);
fp1=fopen("outfile","w"
;
for(i=0;i<=lengtha-1;i++){
fprintf(fp1,"%f %f\n",output_array[matrix_element(i,1)],output_array[matrix_element(i,2)]);}
fclose(fp1);
}
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
float pi=3.14159265358979;
#define matrix_element(i,j) ((i)*2+(j)-1)
int fft(int N,float *a,float *b)
{ int i;
float WNi[2];
float *x1,*x2,*X1,*X2;
if (N==1) {b[matrix_element(0,1)]=a[matrix_element(0,1)];b[matrix_element(0,2)]=a[matrix_element(0,2)];return 1;}
x1=(float *)malloc(N*sizeof(float));
x2=(float *)malloc(N*sizeof(float));
X1=(float *)malloc(N*sizeof(float));
X2=(float *)malloc(N*sizeof(float));
for(i=0;i<N;i++){
if (i%2){
x2[matrix_element((i/2),1)]=a[matrix_element(i,1)];
x2[matrix_element((i/2),2)]=a[matrix_element(i,2)];
}
else{
x1[matrix_element((i/2),1)]=a[matrix_element(i,1)];
x1[matrix_element((i/2),2)]=a[matrix_element(i,2)];
}
}
fft(N/2,x1,X1);
fft(N/2,x2,X2);
for(i=0;i<(N/2);i++){
WNi[matrix_element(0,1)]=cos(i*2*pi/N);
WNi[matrix_element(0,2)]=-sin(i*2*pi/N);
b[matrix_element(i,1)]=X1[matrix_element(i,1)]+X2[matrix_element(i,1)]*WNi[matrix_element(0,1)]-X2[matrix_element(i,2)]*WNi[matrix_element(0,2)];
b[matrix_element(i,2)]=X1[matrix_element(i,2)]+X2[matrix_element(i,1)]*WNi[matrix_element(0,2)]+X2[matrix_element(i,2)]*WNi[matrix_element(0,1)];
b[matrix_element((i+N/2),1)]=X1[matrix_element(i,1)]-X2[matrix_element(i,1)]*WNi[matrix_element(0,1)]+X2[matrix_element(i,2)]*WNi[matrix_element(0,2)];
b[matrix_element((i+N/2),2)]=X1[matrix_element(i,2)]-X2[matrix_element(i,1)]*WNi[matrix_element(0,2)]-X2[matrix_element(i,2)]*WNi[matrix_element(0,1)];
}
free(x1);
free(x2);
free(X1);
free(X2);
return 1;
}
int main()
{
FILE *fp0,*fp1;
clock_t start,finish;
float *input_array, *output_array;
float real,im;
int lengtha=1;
int i=0;
input_array=(float *)malloc(2*lengtha*sizeof(float));
fp0=fopen("infile","r"
fscanf(fp0,"%f",&real);
while(fscanf(fp0,"%f",&im)!=EOF){
if((i+1)>lengtha){lengtha=lengtha*2;
if((input_array=(float *)realloc((void *)input_array,2*lengtha*sizeof(float)))==NULL) {printf("Memory allocation error\n"
input_array[matrix_element(i,1)]=real;
input_array[matrix_element(i,2)]=im;
i++;
fscanf(fp0,"%f",&real);
}
fclose(fp0);
output_array=(float *)malloc(2*lengtha*sizeof(float));
start=clock();
fft(lengtha,input_array,output_array);
finish=clock();
printf("Computed FFT in %f seconds",((float)(finish-start))/CLK_TCK);
fp1=fopen("outfile","w"
for(i=0;i<=lengtha-1;i++){
fprintf(fp1,"%f %f\n",output_array[matrix_element(i,1)],output_array[matrix_element(i,2)]);}
fclose(fp1);
}