⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 newfft.cpp

📁 各种矩阵算法库。支持UpperTriangularMatrix,LowerTriangularMatrix, DiagonalMatrix, SymmetricMatrix, BandMatrix,U
💻 CPP
📖 第 1 页 / 共 3 页
字号:
   for (U=0; U<PP; U++)   {      ANGLE=TWOPI*Real(U+1)/Real(P);      JJ=P-U-2;      A[U]=cos(ANGLE); B[U]=sin(ANGLE);      A[JJ]=A[U]; B[JJ]= -B[U];   }   for (U=1; U<=PP; U++)   {      for (V=1; V<=PP; V++)         { JJ=U*V-U*V/P*P; AA[V-1][U-1]=A[JJ-1]; BB[V-1][U-1]=B[JJ-1]; }   }   for (J=0; J<M_OVER_2; J++)   {      NO_FOLD = (J==0 || 2*J==M);      K0=J;      ANGLE=TWOPI*Real(J)/Real(MP); ZERO=ANGLE==0.0;      C[0]=cos(ANGLE); S[0]=sin(ANGLE);      for (U=1; U<PM; U++)      {         C[U]=C[U-1]*C[0]-S[U-1]*S[0];         S[U]=S[U-1]*C[0]+C[U-1]*S[0];      }      goto L700;   L500:      if (NO_FOLD) goto L1500;      NO_FOLD=true; K0=M-J;      for (U=0; U<PM; U++)         { T=C[U]*A[U]+S[U]*B[U]; S[U]= -S[U]*A[U]+C[U]*B[U]; C[U]=T; }   L700:      for (K=K0; K<N; K+=MP)      {         XT=X[K]; YT=Y[K];         for (U=1; U<=PP; U++)         {            RA[U-1]=XT; IA[U-1]=YT;            RB[U-1]=0.0; IB[U-1]=0.0;         }         for (U=1; U<=PP; U++)         {            JJ=P-U;            RS=X[K+M*U]+X[K+M*JJ]; IS=Y[K+M*U]+Y[K+M*JJ];            RU=X[K+M*U]-X[K+M*JJ]; IU=Y[K+M*U]-Y[K+M*JJ];            XT=XT+RS; YT=YT+IS;            for (V=0; V<PP; V++)            {               RA[V]=RA[V]+RS*AA[V][U-1]; IA[V]=IA[V]+IS*AA[V][U-1];               RB[V]=RB[V]+RU*BB[V][U-1]; IB[V]=IB[V]+IU*BB[V][U-1];            }         }         X[K]=XT; Y[K]=YT;         for (U=1; U<=PP; U++)         {            if (!ZERO)            {               XT=RA[U-1]+IB[U-1]; YT=IA[U-1]-RB[U-1];               X[K+M*U]=XT*C[U-1]+YT*S[U-1]; Y[K+M*U]=YT*C[U-1]-XT*S[U-1];               JJ=P-U;               XT=RA[U-1]-IB[U-1]; YT=IA[U-1]+RB[U-1];               X[K+M*JJ]=XT*C[JJ-1]+YT*S[JJ-1];               Y[K+M*JJ]=YT*C[JJ-1]-XT*S[JJ-1];            }            else            {               X[K+M*U]=RA[U-1]+IB[U-1]; Y[K+M*U]=IA[U-1]-RB[U-1];               JJ=P-U;               X[K+M*JJ]=RA[U-1]-IB[U-1]; Y[K+M*JJ]=IA[U-1]+RB[U-1];            }         }      }      goto L500;L1500: ;   }   return;}static void R_2_FTK (int N, int M, Real* X0, Real* Y0, Real* X1, Real* Y1)//    RADIX TWO FOURIER TRANSFORM KERNEL;{   bool NO_FOLD,ZERO;   int  J,K,K0,M2,M_OVER_2;   Real ANGLE,C,IS,IU,RS,RU,S,TWOPI;   M2=M*2; M_OVER_2=M/2+1;   TWOPI=8.0*atan(1.0);   for (J=0; J<M_OVER_2; J++)   {      NO_FOLD = (J==0 || 2*J==M);      K0=J;      ANGLE=TWOPI*Real(J)/Real(M2); ZERO=ANGLE==0.0;      C=cos(ANGLE); S=sin(ANGLE);      goto L200;   L100:      if (NO_FOLD) goto L600;      NO_FOLD=true; K0=M-J; C= -C;   L200:      for (K=K0; K<N; K+=M2)      {         RS=X0[K]+X1[K]; IS=Y0[K]+Y1[K];         RU=X0[K]-X1[K]; IU=Y0[K]-Y1[K];         X0[K]=RS; Y0[K]=IS;         if (!ZERO) { X1[K]=RU*C+IU*S; Y1[K]=IU*C-RU*S; }         else { X1[K]=RU; Y1[K]=IU; }      }      goto L100;   L600: ;   }   return;}static void R_3_FTK (int N, int M, Real* X0, Real* Y0, Real* X1, Real* Y1,   Real* X2, Real* Y2)//    RADIX THREE FOURIER TRANSFORM KERNEL{   bool NO_FOLD,ZERO;   int  J,K,K0,M3,M_OVER_2;   Real ANGLE,A,B,C1,C2,S1,S2,T,TWOPI;   Real I0,I1,I2,IA,IB,IS,R0,R1,R2,RA,RB,RS;   M3=M*3; M_OVER_2=M/2+1; TWOPI=8.0*atan(1.0);   A=cos(TWOPI/3.0); B=sin(TWOPI/3.0);   for (J=0; J<M_OVER_2; J++)   {      NO_FOLD = (J==0 || 2*J==M);      K0=J;      ANGLE=TWOPI*Real(J)/Real(M3); ZERO=ANGLE==0.0;      C1=cos(ANGLE); S1=sin(ANGLE);      C2=C1*C1-S1*S1; S2=S1*C1+C1*S1;      goto L200;   L100:      if (NO_FOLD) goto L600;      NO_FOLD=true; K0=M-J;      T=C1*A+S1*B; S1=C1*B-S1*A; C1=T;      T=C2*A-S2*B; S2= -C2*B-S2*A; C2=T;   L200:      for (K=K0; K<N; K+=M3)      {         R0 = X0[K]; I0 = Y0[K];         RS=X1[K]+X2[K]; IS=Y1[K]+Y2[K];         X0[K]=R0+RS; Y0[K]=I0+IS;         RA=R0+RS*A; IA=I0+IS*A;         RB=(X1[K]-X2[K])*B; IB=(Y1[K]-Y2[K])*B;         if (!ZERO)         {            R1=RA+IB; I1=IA-RB; R2=RA-IB; I2=IA+RB;            X1[K]=R1*C1+I1*S1; Y1[K]=I1*C1-R1*S1;            X2[K]=R2*C2+I2*S2; Y2[K]=I2*C2-R2*S2;         }         else { X1[K]=RA+IB; Y1[K]=IA-RB; X2[K]=RA-IB; Y2[K]=IA+RB; }      }      goto L100;   L600: ;   }   return;}static void R_4_FTK (int N, int M,   Real* X0, Real* Y0, Real* X1, Real* Y1,   Real* X2, Real* Y2, Real* X3, Real* Y3)//    RADIX FOUR FOURIER TRANSFORM KERNEL{   bool NO_FOLD,ZERO;   int  J,K,K0,M4,M_OVER_2;   Real ANGLE,C1,C2,C3,S1,S2,S3,T,TWOPI;   Real I1,I2,I3,IS0,IS1,IU0,IU1,R1,R2,R3,RS0,RS1,RU0,RU1;   M4=M*4; M_OVER_2=M/2+1;   TWOPI=8.0*atan(1.0);   for (J=0; J<M_OVER_2; J++)   {      NO_FOLD = (J==0 || 2*J==M);      K0=J;      ANGLE=TWOPI*Real(J)/Real(M4); ZERO=ANGLE==0.0;      C1=cos(ANGLE); S1=sin(ANGLE);      C2=C1*C1-S1*S1; S2=S1*C1+C1*S1;      C3=C2*C1-S2*S1; S3=S2*C1+C2*S1;      goto L200;   L100:      if (NO_FOLD) goto L600;      NO_FOLD=true; K0=M-J;      T=C1; C1=S1; S1=T;      C2= -C2;      T=C3; C3= -S3; S3= -T;   L200:      for (K=K0; K<N; K+=M4)      {         RS0=X0[K]+X2[K]; IS0=Y0[K]+Y2[K];         RU0=X0[K]-X2[K]; IU0=Y0[K]-Y2[K];         RS1=X1[K]+X3[K]; IS1=Y1[K]+Y3[K];         RU1=X1[K]-X3[K]; IU1=Y1[K]-Y3[K];         X0[K]=RS0+RS1; Y0[K]=IS0+IS1;         if (!ZERO)         {            R1=RU0+IU1; I1=IU0-RU1;            R2=RS0-RS1; I2=IS0-IS1;            R3=RU0-IU1; I3=IU0+RU1;            X2[K]=R1*C1+I1*S1; Y2[K]=I1*C1-R1*S1;            X1[K]=R2*C2+I2*S2; Y1[K]=I2*C2-R2*S2;            X3[K]=R3*C3+I3*S3; Y3[K]=I3*C3-R3*S3;         }         else         {            X2[K]=RU0+IU1; Y2[K]=IU0-RU1;            X1[K]=RS0-RS1; Y1[K]=IS0-IS1;            X3[K]=RU0-IU1; Y3[K]=IU0+RU1;         }      }      goto L100;   L600: ;   }   return;}static void R_5_FTK (int N, int M,   Real* X0, Real* Y0, Real* X1, Real* Y1, Real* X2, Real* Y2,   Real* X3, Real* Y3, Real* X4, Real* Y4)//    RADIX FIVE FOURIER TRANSFORM KERNEL{   bool NO_FOLD,ZERO;   int  J,K,K0,M5,M_OVER_2;   Real ANGLE,A1,A2,B1,B2,C1,C2,C3,C4,S1,S2,S3,S4,T,TWOPI;   Real R0,R1,R2,R3,R4,RA1,RA2,RB1,RB2,RS1,RS2,RU1,RU2;   Real I0,I1,I2,I3,I4,IA1,IA2,IB1,IB2,IS1,IS2,IU1,IU2;   M5=M*5; M_OVER_2=M/2+1;   TWOPI=8.0*atan(1.0);   A1=cos(TWOPI/5.0); B1=sin(TWOPI/5.0);   A2=cos(2.0*TWOPI/5.0); B2=sin(2.0*TWOPI/5.0);   for (J=0; J<M_OVER_2; J++)   {      NO_FOLD = (J==0 || 2*J==M);      K0=J;      ANGLE=TWOPI*Real(J)/Real(M5); ZERO=ANGLE==0.0;      C1=cos(ANGLE); S1=sin(ANGLE);      C2=C1*C1-S1*S1; S2=S1*C1+C1*S1;      C3=C2*C1-S2*S1; S3=S2*C1+C2*S1;      C4=C2*C2-S2*S2; S4=S2*C2+C2*S2;      goto L200;   L100:      if (NO_FOLD) goto L600;      NO_FOLD=true; K0=M-J;      T=C1*A1+S1*B1; S1=C1*B1-S1*A1; C1=T;      T=C2*A2+S2*B2; S2=C2*B2-S2*A2; C2=T;      T=C3*A2-S3*B2; S3= -C3*B2-S3*A2; C3=T;      T=C4*A1-S4*B1; S4= -C4*B1-S4*A1; C4=T;   L200:      for (K=K0; K<N; K+=M5)      {         R0=X0[K]; I0=Y0[K];         RS1=X1[K]+X4[K]; IS1=Y1[K]+Y4[K];         RU1=X1[K]-X4[K]; IU1=Y1[K]-Y4[K];         RS2=X2[K]+X3[K]; IS2=Y2[K]+Y3[K];         RU2=X2[K]-X3[K]; IU2=Y2[K]-Y3[K];         X0[K]=R0+RS1+RS2; Y0[K]=I0+IS1+IS2;         RA1=R0+RS1*A1+RS2*A2; IA1=I0+IS1*A1+IS2*A2;         RA2=R0+RS1*A2+RS2*A1; IA2=I0+IS1*A2+IS2*A1;         RB1=RU1*B1+RU2*B2; IB1=IU1*B1+IU2*B2;         RB2=RU1*B2-RU2*B1; IB2=IU1*B2-IU2*B1;         if (!ZERO)         {            R1=RA1+IB1; I1=IA1-RB1;            R2=RA2+IB2; I2=IA2-RB2;            R3=RA2-IB2; I3=IA2+RB2;            R4=RA1-IB1; I4=IA1+RB1;            X1[K]=R1*C1+I1*S1; Y1[K]=I1*C1-R1*S1;            X2[K]=R2*C2+I2*S2; Y2[K]=I2*C2-R2*S2;            X3[K]=R3*C3+I3*S3; Y3[K]=I3*C3-R3*S3;            X4[K]=R4*C4+I4*S4; Y4[K]=I4*C4-R4*S4;         }         else         {            X1[K]=RA1+IB1; Y1[K]=IA1-RB1;            X2[K]=RA2+IB2; Y2[K]=IA2-RB2;            X3[K]=RA2-IB2; Y3[K]=IA2+RB2;            X4[K]=RA1-IB1; Y4[K]=IA1+RB1;         }      }      goto L100;   L600: ;   }   return;}static void R_8_FTK (int N, int M,   Real* X0, Real* Y0, Real* X1, Real* Y1,   Real* X2, Real* Y2, Real* X3, Real* Y3,   Real* X4, Real* Y4, Real* X5, Real* Y5,   Real* X6, Real* Y6, Real* X7, Real* Y7)//    RADIX EIGHT FOURIER TRANSFORM KERNEL{   bool NO_FOLD,ZERO;   int  J,K,K0,M8,M_OVER_2;   Real ANGLE,C1,C2,C3,C4,C5,C6,C7,E,S1,S2,S3,S4,S5,S6,S7,T,TWOPI;   Real R1,R2,R3,R4,R5,R6,R7,RS0,RS1,RS2,RS3,RU0,RU1,RU2,RU3;   Real I1,I2,I3,I4,I5,I6,I7,IS0,IS1,IS2,IS3,IU0,IU1,IU2,IU3;   Real RSS0,RSS1,RSU0,RSU1,RUS0,RUS1,RUU0,RUU1;   Real ISS0,ISS1,ISU0,ISU1,IUS0,IUS1,IUU0,IUU1;   M8=M*8; M_OVER_2=M/2+1;   TWOPI=8.0*atan(1.0); E=cos(TWOPI/8.0);   for (J=0;J<M_OVER_2;J++)   {      NO_FOLD= (J==0 || 2*J==M);      K0=J;      ANGLE=TWOPI*Real(J)/Real(M8); ZERO=ANGLE==0.0;      C1=cos(ANGLE); S1=sin(ANGLE);      C2=C1*C1-S1*S1; S2=C1*S1+S1*C1;      C3=C2*C1-S2*S1; S3=S2*C1+C2*S1;      C4=C2*C2-S2*S2; S4=S2*C2+C2*S2;      C5=C4*C1-S4*S1; S5=S4*C1+C4*S1;      C6=C4*C2-S4*S2; S6=S4*C2+C4*S2;      C7=C4*C3-S4*S3; S7=S4*C3+C4*S3;      goto L200;   L100:      if (NO_FOLD) goto L600;      NO_FOLD=true; K0=M-J;      T=(C1+S1)*E; S1=(C1-S1)*E; C1=T;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -