#include #include float yreal(float a1, float b1, float c1, float d1, float theta2); float yimaginary(float a1, float b1, float c1, float d1, float theta2); int shuffleinorder (float a[8], float b[8], float c[8], float d[8]); struct complex { float real; float imag; } ; complex MultiplybyTwiddleFactor (float a, float b, int k, int N) { struct complex returned; float Realpart, Imagpart; float c, d; float PI= 3.1415926; c= cos(-k*2.0*PI/N); /* Found a error on July 24, 2014 and corrected */ d= sin(-k*2.0*PI/N); /* (a + bJ)*(c+ dJ) */ Realpart= a*c - b*d; Imagpart= a*d+ b*c; returned.real= Realpart; returned.imag= Imagpart; return (returned); } complex complexmult(complex a, complex b) { complex product; product.real= a.real* b.real- a.real* b.imag; product.imag= a.real* b.imag+ a.imag* b.real; return(product) ; } int combo32(complex x1[16], complex x2[16]) { float a[32], b[32]; float e1[32], f1[32]; float theta1; int i; for (i= 0; i < 16; i++) { printf("x1[%i]=%f\n", i, x1[i].real); printf("x1[%i]=%f\n", i, x1[i].imag); } for (i= 0; i < 16; i++) { printf("x2[%i]=%f\n", i, x2[i].real); printf("x2[%i]=%f\n", i, x2[i].imag); } for (i= 0 ; i< 16 ; i++ ) { theta1 = - 2 * 3.1415926/32* i; a[i]= yreal(x1[i].real, x1[i].imag, x2[i].real, x2[i].imag, theta1); b[i]= yimaginary(x1[i].real, x1[i].imag, x2[i].real, x2[i].imag, theta1); theta1 = - 2 * 3.1415926/32* i + 3.141592; /* Output is in linear form , As well */ a[i+16]= yreal(x1[i].real, x1[i].imag, x2[i].real, x2[i].imag, theta1); b[i+16]= yimaginary(x1[i].real, x1[i].imag, x2[i].real, x2[i].imag, theta1); } for (i= 0; i < 32; i++) { printf("a[%i]=%f\n", i, a[i]); printf("b[%i]=%f\n", i, b[i]); } printf("decoupled so\n"); printf("real\n"); for (i=0; i< 32; i++) { printf ("%f\n",a[i]); } printf("imaginary\n"); for (i=0; i< 32; i++) { printf("%f\n",b[i]); } } int backend (float c6[32], float d6[32], float x[32], float y[32]) { int i,j,N; int m; float c1[64]; complex d1[32][4]; float twiddlefactorcoeff; complex number; complex Y2[32]; complex sum[32]; complex c[32], d[8][4]; complex s[64]; for (i=0; i< 32; i++) { c[i].real=c6[i]; c[i].imag=d6[i]; } for (i=0; i< 32; i++) { printf("c=%f\n", c[i].real); printf("c=%f\n", c[i].imag); } for (m=0; m< 8; m++) { for (i=0; i< 4; i++) { d[m][i].real=c[8*i+m].real; d[m][i].imag= c[8*i+m].imag; } } for (m=0; m<8; m++) { for (i=0; i< 4; i++) { printf("d=%f\n", d[m][i].real); printf("d=%f\n", d[m][i].imag); } } for (m= 0; m< 8; m++) { for (i=0; i< 4; i++) { twiddlefactorcoeff= (m*i )%32; number= MultiplybyTwiddleFactor( d[m][i].real, d[m][i].imag, twiddlefactorcoeff, 32); d1[m][i].real= number.real; d1[m][i].imag= number.imag; } } for (m= 8; m< 16; m++) { for (i=0; i< 4; i++) { twiddlefactorcoeff= (m*i )%32; number= MultiplybyTwiddleFactor( d[m-8][i].real, d[m-8][i].imag, twiddlefactorcoeff, 32); d1[m][i].real= number.real; d1[m][i].imag= number.imag; } } for (m=16; m< 24; m++) { for (i=0; i< 4; i++) { twiddlefactorcoeff= (m*i) %32; number= MultiplybyTwiddleFactor( d[m-16][i].real, d[m-16][i].imag, twiddlefactorcoeff, 32); d1[m][i].real= number.real; d1[m][i].imag= number.imag; } } for (m=24; m<32; m++) { for (i=0; i< 4; i++) { twiddlefactorcoeff= (m*i )%32; number= MultiplybyTwiddleFactor( d[m-24][i].real, d[m-24][i].imag, twiddlefactorcoeff, 32); d1[m][i].real= number.real; d1[m][i].imag= number.imag; } } for (m=0; m< 32; m++) { for (i=0; i< 4; i++) { printf("d1[%i][%i]= %f\n", m, i, d1[m][i].real); printf("d1[%i][%i]= %f\n", m, i, d1[m][i].imag); } } for (m=0; m< 32; m++) { sum[m].real= 0.0; sum[m].imag= 0.0; } for (m=0; m< 32; m++) { for (i= 0; i< 4; i++) { sum[m].real=d1[m][i].real+ sum[m].real; sum[m].imag=d1[m][i].imag+ sum[m].imag; } } for (m=0; m< 32; m++) { Y2[m].real= sum[m].real; Y2[m].imag= sum[m].imag; } for (m=0; m< 32; m++) { printf("Y2[%i].real= %f\n", m, Y2[m].real); printf("Y2[%i].imag= %f\n", m, Y2[m].imag); } for (m=0; m< 32; m++) { x[m]= Y2[m].real; y[m]= Y2[m].imag; } return(3); } int combo(complex x1[8], complex x2[8], complex z[16]) { float a[16], b[16]; float e1[16], f1[16]; float theta1; int i; for (i= 0; i < 8; i++) { printf("x1[%i]=%f\n", i, x1[i].real); printf("x1[%i]=%f\n", i, x1[i].imag); } for (i= 0; i < 8; i++) { printf("x2[%i]=%f\n", i, x2[i].real); printf("x2[%i]=%f\n", i, x2[i].imag); } for (i= 0 ; i< 8 ; i++ ) { theta1 = - 2 * 3.1415926/16* i; a[i]= yreal(x1[i].real, x1[i].imag, x2[i].real, x2[i].imag, theta1); b[i]= yimaginary(x1[i].real, x1[i].imag, x2[i].real, x2[i].imag, theta1); theta1 = - 2 * 3.1415926/16* i + 3.141592; /* Output is in linear form , As well */ a[i+8]= yreal(x1[i].real, x1[i].imag, x2[i].real, x2[i].imag, theta1); b[i+8]= yimaginary(x1[i].real, x1[i].imag, x2[i].real, x2[i].imag, theta1); } for (i= 0; i < 16; i++) { printf("a[%i]=%f\n", i, a[i]); printf("b[%i]=%f\n", i, b[i]); } for (i=0; i< 16; i++) { z[i].real= a[i]; z[i].imag= b[i]; } printf("decoupled so\n"); printf("real\n"); for (i=0; i< 16; i++) { printf ("%f\n",a[i]); } printf("imaginary\n"); for (i=0; i< 16; i++) { printf("%f\n",b[i]); } } main() { int i; float a1[32], b1[32], a2[32], b2[32]; float e1[8], f1[8]; float a[8], b[8]; float a4[32], b4[32]; float x[32], y[32]; int count; int i1; int j; complex x2[8], y2[8], x3[8], y3[8]; FILE *sombrero; float theta2; complex z2[16], z3[16]; sombrero= fopen( "Card23.IN", "r"); for (i= 0; i< 32; i++) { fscanf(sombrero, "%f\n", &a2[i]); fscanf(sombrero, "%f\n", &b2[i]); } fclose(sombrero); for (i=0; i< 32; i++) { printf("a2[%i]= %f\n", i, a2[i]); printf("b2[%i]= %f\n", i, b2[i]); } count=0; for (i=0; i< 16; i++) { a1[i]= a2[2*i]; b1[i]= b2[2*i]; } for (i=0; i< 16; i++) { a1[i+16]= a2[2*i+1]; b1[i+16]= b2[2*i+1]; } /* first shuffle even over odds */ for (i=0; i< 8; i++) { a2[i]= a1[2*i]; b2[i]= b1[2*i]; } for (i=0; i< 8; i++) { a2[i+8]= a1[2*i+1]; b2[i+8]= b1[2*i+1]; } for (i=0; i< 8; i++) { a2[i+16]= a1[2*i+16]; b2[i+16]= b1[2*i+16]; } for (i=0; i< 8; i++) { a2[i+24]= a1[2*i+1+16]; b2[i+24]= b1[2*i+1+16]; } while (count <4) { i1= count; { e1[0]= a2[0+8*i1]; f1[0]= b2[0+8*i1]; e1[1]= a2[4+8*i1]; f1[1]= b2[4+8*i1]; e1[2]= a2[2+8*i1]; f1[2]= b2[2+8*i1]; e1[3]= a2[6+8*i1]; f1[3]= b2[6+8*i1]; e1[4]= a2[1+8*i1]; f1[4]= b2[1+8*i1]; e1[5]= a2[5+8*i1]; f1[5]= b2[5+8*i1]; e1[6]= a2[3+8*i1]; f1[6]= b2[3+8*i1]; e1[7]= a2[7+8*i1]; f1[7]= b2[7+8*i1]; } shuffleinorder(e1, f1, a, b); for (i=0; i< 8; i++) { a4[8*i1+i]= a[i]; b4[8*i1+i]= b[i]; } count= count +1; } for (i=0; i< 32; i++) { printf("a4[%i]= %f\n", i, a4[i]); printf("b4[%i]= %f\n", i, b4[i]); } for (i=0; i< 8; i++) { x2[i].real= a4[i]; x2[i].imag= b4[i]; y2[i].real= a4[i+8]; y2[i].imag= b4[i+8]; } for (i=0; i< 8; i++) { x3[i].real= a4[i+16]; x3[i].imag= b4[i+16]; y3[i].real= a4[i+8+16]; y3[i].imag= b4[i+8+16]; } j=combo(x2, y2, z2); j=combo(x3, y3, z3); j= combo32(z2, z3); /* j= backend(a4, b4, x, y); for (i=0; i< 32; i++) { printf("X[%i].real=%f\n", i, x[i]); printf("X[%i].imag=%f\n", i, y[i]); } */ } float yreal(float a, float b, float c, float d, float theta1) { float sum1; sum1=0.0; sum1= a+ c*cos(theta1)-d*sin(theta1); return sum1; } float yimaginary(float a, float b, float c, float d, float theta1) { float sum2; sum2=0.0; sum2=b+d*cos(theta1)+c*sin(theta1); return sum2; } int shuffleinorder (float a[8], float b[8], float c[8], float d[8]) { float theta1; int i, j; float e1[8], f1[8], e[8], f[8]; float y0real, y0imaginary; float increment, increment2, increment3; increment= -2* 3.1415926/2.0; increment2= -2*3.141592/4.0; increment3= -2* 3.141592/8.0; for (i=0; i< 8; i++) { e1[i]= a[i]; f1[i]= b[i]; } printf("Input values\n"); for (i= 0; i< 8; i++) { printf("e1[%i]=%f\n", i, e1[i]); printf("f1[%i]=%f\n", i, f1[i]); } printf("\n"); for (i= 0; i< 8; i++) { e[i]=e1[i]; f[i]=f1[i]; } for (i= 0; i< 4; i++) { theta1=0.0; y0real=yreal(e[2*i],f[2*i],e[2*i+1],f[2*i+1], theta1); y0imaginary=yimaginary(e[2*i],f[2*i],e[2*i+1],f[2*i+1], theta1); e1[2*i]= y0real; f1[2*i]= y0imaginary; theta1=increment; y0real=yreal(e[2*i],f[2*i],e[2*i+1],f[2*i+1], theta1); y0imaginary=yimaginary(e[2*i],f[2*i],e[2*i+1],f[2*i+1], theta1); e1[2*i+1]= y0real; f1[2*i+1]= y0imaginary; } printf("After the First Round\n"); for (i=0; i< 8; i++) { printf ("e1[%i] = %f\n", i, e1[i]); printf ("f1[%i] = %f\n", i, f1[i]); } printf("\n"); e[0]= e1[0]; f[0]= f1[0]; e[1]= e1[2]; f[1]= f1[2]; e[2]= e1[1]; f[2]= f1[1]; e[3]= e1[3]; f[3]= f1[3]; e[4]= e1[4]; f[4]= f1[4]; e[5]= e1[6]; f[5]= f1[6]; e[6]= e1[5]; f[6]= f1[5]; e[7]= e1[7]; f[7]= f1[7]; for (i=0; i< 2; i++) { for(j=0; j< 2; j++) { theta1=j*increment2; y0real=yreal(e[4*i+2*j],f[4*i+2*j],e[4*i+2*j+1],f[4*i+2*j+1], theta1); y0imaginary=yimaginary(e[4*i+2*j],f[4*i+2*j],e[4*i+2*j+1],f[4*i+2*j+1], theta1); e1[4*i+2*j]= y0real; f1[4*i+2*j]= y0imaginary; theta1=(j+2)*increment2; y0real=yreal(e[4*i+2*j],f[4*i+2*j],e[4*i+2*j+1],f[4*i+2*j+1], theta1); y0imaginary=yimaginary(e[4*i+2*j],f[4*i+2*j],e[4*i+2*j+1],f[4*i+2*j+1], theta1); e1[4*i+2*j+1]= y0real; f1[4*i+2*j+1]= y0imaginary; } } printf("After the 2nd Round\n"); for (i=0; i< 8; i++) { printf ("e1[%i] = %f\n", i, e1[i]); printf ("f1[%i] = %f\n", i, f1[i]); } printf("\n"); e[0]= e1[0]; f[0]= f1[0]; e[1]= e1[2]; f[1]= f1[2]; e[2]= e1[1]; f[2]= f1[1]; e[3]= e1[3]; f[3]= f1[3]; e[4]= e1[4]; f[4]= f1[4]; e[5]= e1[6]; f[5]= f1[6]; e[6]= e1[5]; f[6]= f1[5]; e[7]= e1[7]; f[7]= f1[7]; printf("\n"); printf("Shuffle into linear order \n"); for (i=0; i< 8; i++) { printf ("e[%i] = %f\n", i, e[i]); printf ("f[%i] = %f\n", i, f[i]); } printf("\n"); e1[0]= e[0]; f1[0]= f[0]; e1[1]= e[4]; f1[1]= f[4]; e1[2]= e[1]; f1[2]= f[1]; e1[3]= e[5]; f1[3]= f[5]; e1[4]= e[2]; f1[4]= f[2]; e1[5]= e[6]; f1[5]= f[6]; e1[6]= e[3]; f1[6]= f[3]; e1[7]= e[7]; f1[7]= f[7]; for (i=0; i< 4; i++) { theta1= i*increment3; y0real=yreal(e1[2*i],f1[2*i],e1[2*i+1],f1[2*i+1], theta1); y0imaginary=yimaginary(e1[2*i],f1[2*i],e1[2*i+1],f1[2*i+1], theta1); e[2*i]= y0real; f[2*i]= y0imaginary; theta1= (i+4)*increment3; y0real=yreal(e1[2*i],f1[2*i],e1[2*i+1],f1[2*i+1], theta1); y0imaginary=yimaginary(e1[2*i],f1[2*i],e1[2*i+1],f1[2*i+1], theta1); e[2*i+1]= y0real; f[2*i+1]= y0imaginary; } for (i=0; i< 8; i++) { printf ("e[%i] = %f\n", i, e[i]); printf ("f[%i] = %f\n", i, f[i]); } for (i=0; i< 4; i++) { c[i]= e[2*i]; d[i]= f[2*i]; c[i+4]= e[2*i+1]; d[i+4]= f[2*i+1]; } }