void fun_fourier_transform_FFT_mixed_radix_5(int N,std::complex<double> tab[])
{
//source:
//Rabiner L.R., Gold B. Theory and application of digital signal processing p 378
const double pi=3.141592653589793238462;
std::complex<double> tab2[4096]={}; // tab2[]==N
std::complex<double> w1[1]={{1,0}};
std::complex<double> w2[1]={{1,0}};
std::complex<double> w3[1]={{1,0}};
std::complex<double> w4[1]={{1,0}};
std::complex<double> w40[1]={{1,0}};
std::complex<double> w5[1]={{1,0}};
std::complex<double> w6[1]={{1,0}};
std::complex<double> w7[1]={{1,0}};
std::complex<double> w11[1]={{1,0}};
std::complex<double> w12[1]={{1,0}};
std::complex<double> w13[1]={{1,0}};
std::complex<double> w14[1]={{1,0}};
std::complex<double> w15[1]={{1,0}};
std::complex<double> w16[1]={{1,0}};
std::complex<double> w17[1]={{1,0}};
std::complex<double> w18[1]={{1,0}};
std::complex<double> w19[1]={{1,0}};
std::complex<double> w20[1]={{1,0}};
std::complex<double> tmp1,tmp2,tmp3,tmp4,tmp11;
double tmp5;
double tmp6;
double tmp7;
double tmp8;
tmp5=2*pi/(N/1);
tmp6=2*pi/(N/1);
tmp7=2*pi/(3/1);
tmp8=2*pi/(5/1);
//radix 3 fundament
w4[0].real()=cos(0*tmp7);
w4[0].imag()=-sin(0*tmp7);
w5[0].real()=cos(1*tmp7);
w5[0].imag()=-sin(1*tmp7);
w6[0].real()=cos(2*tmp7);
w6[0].imag()=-sin(2*tmp7);
w7[0].real()=cos(4*tmp7);
w7[0].imag()=-sin(4*tmp7);
//radix 5 fundament
w11[0].real()=cos(0*tmp8);
w11[0].imag()=-sin(0*tmp8);
w12[0].real()=cos(1*tmp8);
w12[0].imag()=-sin(1*tmp8);
w13[0].real()=cos(2*tmp8);
w13[0].imag()=-sin(2*tmp8);
w14[0].real()=cos(3*tmp8);
w14[0].imag()=-sin(3*tmp8);
w15[0].real()=cos(4*tmp8);
w15[0].imag()=-sin(4*tmp8);
w16[0].real()=cos(6*tmp8);
w16[0].imag()=-sin(6*tmp8);
w17[0].real()=cos(8*tmp8);
w17[0].imag()=-sin(8*tmp8);
w18[0].real()=cos(9*tmp8);
w18[0].imag()=-sin(9*tmp8);
w19[0].real()=cos(12*tmp8);
w19[0].imag()=-sin(12*tmp8);
w20[0].real()=cos(16*tmp8);
w20[0].imag()=-sin(16*tmp8);
//stage 1 radix-5
w1[0].real()=cos(0);
w1[0].imag()=-sin(0);
w2[0].real()=cos(0);
w2[0].imag()=-sin(0);
w3[0].real()=cos(0);
w3[0].imag()=-sin(0);
w4[0].real()=cos(0);
w4[0].imag()=-sin(0);
w40[0].real()=cos(0);
w40[0].imag()=-sin(0);
for(int i=0;i<6;i++)
{
tmp1=w1[0]*tab[i+0];
tmp2=w2[0]*tab[i+6];
tmp3=w3[0]*tab[i+12];
tmp4=w4[0]*tab[i+18];
tmp11=w40[0]*tab[i+24];
//radix-5
tab2[i] =w11[0]*tmp1+w11[0]*tmp2+w11[0]*tmp3+w11[0]*tmp4+w11[0]*tmp11;
tab2[i+6] =w11[0]*tmp1+w12[0]*tmp2+w13[0]*tmp3+w14[0]*tmp4+w15[0]*tmp11;
tab2[i+12] =w11[0]*tmp1+w13[0]*tmp2+w15[0]*tmp3+w16[0]*tmp4+w17[0]*tmp11;
tab2[i+18] =w11[0]*tmp1+w14[0]*tmp2+w16[0]*tmp3+w18[0]*tmp4+w19[0]*tmp11;
tab2[i+24] =w11[0]*tmp1+w15[0]*tmp2+w17[0]*tmp3+w19[0]*tmp4+w20[0]*tmp11;
}
//stage 2 radix-2
int i=0;
w1[0].real()= cos(0*tmp5);
w1[0].imag()=-sin(0*tmp5);
w2[0].real()= cos(0*tmp5);
w2[0].imag()=-sin(0*tmp5);
tmp1=w1[0]*tab2[0+i];
tmp2=w2[0]*tab2[3+i];
tab[0+i]=tmp1+tmp2;
tab[3+i]=tmp1-tmp2;
w1[0].real()= cos(0*tmp5);
w1[0].imag()=-sin(0*tmp5);
w2[0].real()= cos(0*tmp5);
w2[0].imag()=-sin(0*tmp5);
tmp1=w1[0]*tab2[1+i];
tmp2=w2[0]*tab2[4+i];
tab[1+i]=tmp1+tmp2;
tab[4+i]=tmp1-tmp2;
w1[0].real()= cos(0*tmp5);
w1[0].imag()=-sin(0*tmp5);
w2[0].real()= cos(0*tmp5);
w2[0].imag()=-sin(0*tmp5);
tmp1=w1[0]*tab2[2+i];
tmp2=w2[0]*tab2[5+i];
tab[2+i]=tmp1+tmp2;
tab[5+i]=tmp1-tmp2;
i=6;
w1[0].real()= cos(0*tmp5);
w1[0].imag()=-sin(0*tmp5);
w2[0].real()= cos(3*tmp5);
w2[0].imag()=-sin(3*tmp5);
tmp1=w1[0]*tab2[0+i];
tmp2=w2[0]*tab2[3+i];
tab[0+i]=tmp1+tmp2;
tab[3+i]=tmp1-tmp2;
w1[0].real()= cos(1*tmp5);
w1[0].imag()=-sin(1*tmp5);
w2[0].real()= cos(4*tmp5);
w2[0].imag()=-sin(4*tmp5);
tmp1=w1[0]*tab2[1+i];
tmp2=w2[0]*tab2[4+i];
tab[1+i]=tmp1+tmp2;
tab[4+i]=tmp1-tmp2;
w1[0].real()= cos(2*tmp5);
w1[0].imag()=-sin(2*tmp5);
w2[0].real()= cos(5*tmp5);
w2[0].imag()=-sin(5*tmp5);
tmp1=w1[0]*tab2[2+i];
tmp2=w2[0]*tab2[5+i];
tab[2+i]=tmp1+tmp2;
tab[5+i]=tmp1-tmp2;
i=12;
int j=2;
w1[0].real()= cos(0*j*tmp5);
w1[0].imag()=-sin(0*j*tmp5);
w2[0].real()= cos(3*j*tmp5);
w2[0].imag()=-sin(3*j*tmp5);
tmp1=w1[0]*tab2[0+i];
tmp2=w2[0]*tab2[3+i];
tab[0+i]=tmp1+tmp2;
tab[3+i]=tmp1-tmp2;
w1[0].real()= cos(1*j*tmp5);
w1[0].imag()=-sin(1*j*tmp5);
w2[0].real()= cos(4*j*tmp5);
w2[0].imag()=-sin(4*j*tmp5);
tmp1=w1[0]*tab2[1+i];
tmp2=w2[0]*tab2[4+i];
tab[1+i]=tmp1+tmp2;
tab[4+i]=tmp1-tmp2;
w1[0].real()= cos(2*j*tmp5);
w1[0].imag()=-sin(2*j*tmp5);
w2[0].real()= cos(5*j*tmp5);
w2[0].imag()=-sin(5*j*tmp5);
tmp1=w1[0]*tab2[2+i];
tmp2=w2[0]*tab2[5+i];
tab[2+i]=tmp1+tmp2;
tab[5+i]=tmp1-tmp2;
i=18;
j=3;
w1[0].real()= cos(0*j*tmp5);
w1[0].imag()=-sin(0*j*tmp5);
w2[0].real()= cos(3*j*tmp5);
w2[0].imag()=-sin(3*j*tmp5);
tmp1=w1[0]*tab2[0+i];
tmp2=w2[0]*tab2[3+i];
tab[0+i]=tmp1+tmp2;
tab[3+i]=tmp1-tmp2;
w1[0].real()= cos(1*j*tmp5);
w1[0].imag()=-sin(1*j*tmp5);
w2[0].real()= cos(4*j*tmp5);
w2[0].imag()=-sin(4*j*tmp5);
tmp1=w1[0]*tab2[1+i];
tmp2=w2[0]*tab2[4+i];
tab[1+i]=tmp1+tmp2;
tab[4+i]=tmp1-tmp2;
w1[0].real()= cos(2*j*tmp5);
w1[0].imag()=-sin(2*j*tmp5);
w2[0].real()= cos(5*j*tmp5);
w2[0].imag()=-sin(5*j*tmp5);
tmp1=w1[0]*tab2[2+i];
tmp2=w2[0]*tab2[5+i];
tab[2+i]=tmp1+tmp2;
tab[5+i]=tmp1-tmp2;
i=24;
j=4;
w1[0].real()= cos(0*j*tmp5);
w1[0].imag()=-sin(0*j*tmp5);
w2[0].real()= cos(3*j*tmp5);
w2[0].imag()=-sin(3*j*tmp5);
tmp1=w1[0]*tab2[0+i];
tmp2=w2[0]*tab2[3+i];
tab[0+i]=tmp1+tmp2;
tab[3+i]=tmp1-tmp2;
w1[0].real()= cos(1*j*tmp5);
w1[0].imag()=-sin(1*j*tmp5);
w2[0].real()= cos(4*j*tmp5);
w2[0].imag()=-sin(4*j*tmp5);
tmp1=w1[0]*tab2[1+i];
tmp2=w2[0]*tab2[4+i];
tab[1+i]=tmp1+tmp2;
tab[4+i]=tmp1-tmp2;
w1[0].real()= cos(2*j*tmp5);
w1[0].imag()=-sin(2*j*tmp5);
w2[0].real()= cos(5*j*tmp5);
w2[0].imag()=-sin(5*j*tmp5);
tmp1=w1[0]*tab2[2+i];
tmp2=w2[0]*tab2[5+i];
tab[2+i]=tmp1+tmp2;
tab[5+i]=tmp1-tmp2;
//stage 3 radix-3
i=0;
int b=1;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*0*tmp6);
w2[0].imag()=-sin(b*0*tmp6);
w3[0].real()=cos(b*0*tmp6);
w3[0].imag()=-sin(b*0*tmp6);
tmp1=w1[0]*tab[i+0];
tmp2=w2[0]*tab[i+1];
tmp3=w3[0]*tab[i+2];
//radix-3
tab2[i+0] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+1] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+2] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*5*tmp6);
w2[0].imag()=-sin(b*5*tmp6);
w3[0].real()=cos(b*10*tmp6);
w3[0].imag()=-sin(b*10*tmp6);
tmp1=w1[0]*tab[i+3];
tmp2=w2[0]*tab[i+4];
tmp3=w3[0]*tab[i+5];
//radix-3
tab2[i+3] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+4] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+5] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
i=6;
b=1;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*0*tmp6);
w2[0].imag()=-sin(b*0*tmp6);
w3[0].real()=cos(b*0*tmp6);
w3[0].imag()=-sin(b*0*tmp6);
tmp1=w1[0]*tab[i+0];
tmp2=w2[0]*tab[i+1];
tmp3=w3[0]*tab[i+2];
//radix-3
tab2[i+0] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+1] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+2] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*5*tmp6);
w2[0].imag()=-sin(b*5*tmp6);
w3[0].real()=cos(b*10*tmp6);
w3[0].imag()=-sin(b*10*tmp6);
tmp1=w1[0]*tab[i+3];
tmp2=w2[0]*tab[i+4];
tmp3=w3[0]*tab[i+5];
//radix-3
tab2[i+3] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+4] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+5] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
i=12;
b=1;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*0*tmp6);
w2[0].imag()=-sin(b*0*tmp6);
w3[0].real()=cos(b*0*tmp6);
w3[0].imag()=-sin(b*0*tmp6);
tmp1=w1[0]*tab[i+0];
tmp2=w2[0]*tab[i+1];
tmp3=w3[0]*tab[i+2];
//radix-3
tab2[i+0] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+1] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+2] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*5*tmp6);
w2[0].imag()=-sin(b*5*tmp6);
w3[0].real()=cos(b*10*tmp6);
w3[0].imag()=-sin(b*10*tmp6);
tmp1=w1[0]*tab[i+3];
tmp2=w2[0]*tab[i+4];
tmp3=w3[0]*tab[i+5];
//radix-3
tab2[i+3] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+4] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+5] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
i=18;
b=1;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*0*tmp6);
w2[0].imag()=-sin(b*0*tmp6);
w3[0].real()=cos(b*0*tmp6);
w3[0].imag()=-sin(b*0*tmp6);
tmp1=w1[0]*tab[i+0];
tmp2=w2[0]*tab[i+1];
tmp3=w3[0]*tab[i+2];
//radix-3
tab2[i+0] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+1] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+2] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*5*tmp6);
w2[0].imag()=-sin(b*5*tmp6);
w3[0].real()=cos(b*10*tmp6);
w3[0].imag()=-sin(b*10*tmp6);
tmp1=w1[0]*tab[i+3];
tmp2=w2[0]*tab[i+4];
tmp3=w3[0]*tab[i+5];
//radix-3
tab2[i+3] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+4] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+5] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
i=24;
b=1;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*0*tmp6);
w2[0].imag()=-sin(b*0*tmp6);
w3[0].real()=cos(b*0*tmp6);
w3[0].imag()=-sin(b*0*tmp6);
tmp1=w1[0]*tab[i+0];
tmp2=w2[0]*tab[i+1];
tmp3=w3[0]*tab[i+2];
//radix-3
tab2[i+0] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+1] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+2] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
w1[0].real()=cos(b*0*tmp6);
w1[0].imag()=-sin(b*0*tmp6);
w2[0].real()=cos(b*5*tmp6);
w2[0].imag()=-sin(b*5*tmp6);
w3[0].real()=cos(b*10*tmp6);
w3[0].imag()=-sin(b*10*tmp6);
tmp1=w1[0]*tab[i+3];
tmp2=w2[0]*tab[i+4];
tmp3=w3[0]*tab[i+5];
//radix-3
tab2[i+3] =w4[0]*tmp1+w4[0]*tmp2+w4[0]*tmp3;
tab2[i+4] =w4[0]*tmp1+w5[0]*tmp2+w6[0]*tmp3;
tab2[i+5] =w4[0]*tmp1+w6[0]*tmp2+w7[0]*tmp3;
for(int j=0;j<N;j++)
{
tab[j].real() =tab2[j].real()*2/N;
tab[j].imag() =tab2[j].imag()*2/N;
}
}
Brak komentarzy:
Prześlij komentarz