18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/******************************************************************** 28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * 48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * 58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * 68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * 78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * 98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * by the Xiph.Org Foundation http://www.xiph.org/ * 108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * * 118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ******************************************************************** 128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels function: *unnormalized* fft transform 148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels last mod: $Id: smallft.c 16227 2009-07-08 06:58:46Z xiphmont $ 158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ********************************************************************/ 178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* FFT implementation from OggSquish, minus cosine transforms, 198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * minus all but radix 2/4 case. In Vorbis we only need this 208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * cut-down version. 218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * 228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * To do more than just power-of-two sized vectors, see the full 238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * version I wrote for NetLib. 248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * 258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * Note that the packing is a little strange; rather than the FFT r/i 268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * packing following R_0, I_n, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, 278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * it follows R_0, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, I_n like the 288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels * FORTRAN version 298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels */ 308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <stdlib.h> 328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <string.h> 338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include <math.h> 348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "smallft.h" 358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "os.h" 368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels#include "misc.h" 378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void drfti1(int n, float *wa, int *ifac){ 398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels static int ntryh[4] = { 4,2,3,5 }; 408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels static float tpi = 6.28318530717958648f; 418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float arg,argh,argld,fi; 428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int ntry=0,i,j=-1; 438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int k1, l1, l2, ib; 448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int ld, ii, ip, is, nq, nr; 458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int ido, ipm, nfm1; 468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int nl=n; 478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int nf=0; 488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L101: 508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels j++; 518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (j < 4) 528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ntry=ntryh[j]; 538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ntry+=2; 558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L104: 578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nq=nl/ntry; 588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nr=nl-ntry*nq; 598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (nr!=0) goto L101; 608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nf++; 628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ifac[nf+1]=ntry; 638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nl=nq; 648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ntry!=2)goto L107; 658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(nf==1)goto L107; 668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for (i=1;i<nf;i++){ 688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ib=nf-i+1; 698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ifac[ib+1]=ifac[ib]; 708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ifac[2] = 2; 728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L107: 748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(nl!=1)goto L104; 758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ifac[0]=n; 768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ifac[1]=nf; 778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels argh=tpi/n; 788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels is=0; 798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nfm1=nf-1; 808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l1=1; 818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(nfm1==0)return; 838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for (k1=0;k1<nfm1;k1++){ 858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ip=ifac[k1+2]; 868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ld=0; 878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l2=l1*ip; 888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ido=n/l2; 898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ipm=ip-1; 908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for (j=0;j<ipm;j++){ 928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ld+=l1; 938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels i=is; 948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels argld=(float)ld*argh; 958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi=0.f; 968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for (ii=2;ii<ido;ii+=2){ 978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fi+=1.f; 988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels arg=fi*argld; 998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels wa[i++]=cos(arg); 1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels wa[i++]=sin(arg); 1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels is+=ido; 1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l1=l2; 1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void fdrffti(int n, float *wsave, int *ifac){ 1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (n == 1) return; 1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels drfti1(n, wsave+n, ifac); 1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void dradf2(int ido,int l1,float *cc,float *ch,float *wa1){ 1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int i,k; 1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ti2,tr2; 1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int t0,t1,t2,t3,t4,t5,t6; 1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t0=(t2=l1*ido); 1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=ido<<1; 1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1<<1]=cc[t1]+cc[t2]; 1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[(t1<<1)+t3-1]=cc[t1]-cc[t2]; 1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido<2)return; 1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==2)goto L105; 1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t0; 1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t2; 1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=(t1<<1)+(ido<<1); 1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t1; 1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t1+t1; 1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=2; 1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4-=2; 1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=2; 1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=2; 1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr2=wa1[i-2]*cc[t3-1]+wa1[i-1]*cc[t3]; 1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti2=wa1[i-2]*cc[t3]-wa1[i-1]*cc[t3-1]; 1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6]=cc[t5]+ti2; 1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4]=ti2-cc[t5]; 1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6-1]=cc[t5-1]+tr2; 1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4-1]=cc[t5-1]-tr2; 1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido%2==1)return; 1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L105: 1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=(t2=(t1=ido)-1); 1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=t0; 1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1]=-cc[t2]; 1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1-1]=cc[t3]; 1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido<<1; 1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void dradf4(int ido,int l1,float *cc,float *ch,float *wa1, 1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *wa2,float *wa3){ 1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels static float hsqt2 = .70710678118654752f; 1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int i,k,t0,t1,t2,t3,t4,t5,t6; 1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ci2,ci3,ci4,cr2,cr3,cr4,ti1,ti2,ti3,ti4,tr1,tr2,tr3,tr4; 1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t0=l1*ido; 1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=t0; 1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t1<<1; 1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t1+(t1<<1); 1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=0; 1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr1=cc[t1]+cc[t2]; 1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr2=cc[t3]+cc[t4]; 1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5=t3<<2]=tr1+tr2; 1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[(ido<<2)+t5-1]=tr2-tr1; 1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[(t5+=(ido<<1))-1]=cc[t3]-cc[t4]; 1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5]=cc[t2]-cc[t1]; 1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=ido; 1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido<2)return; 1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==2)goto L105; 1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t1; 2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t1<<2; 2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=(t6=ido<<1)+t4; 2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=(t2+=2); 2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=2; 2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5-=2; 2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=t0; 2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cr2=wa1[i-2]*cc[t3-1]+wa1[i-1]*cc[t3]; 2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ci2=wa1[i-2]*cc[t3]-wa1[i-1]*cc[t3-1]; 2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=t0; 2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cr3=wa2[i-2]*cc[t3-1]+wa2[i-1]*cc[t3]; 2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ci3=wa2[i-2]*cc[t3]-wa2[i-1]*cc[t3-1]; 2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=t0; 2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cr4=wa3[i-2]*cc[t3-1]+wa3[i-1]*cc[t3]; 2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ci4=wa3[i-2]*cc[t3]-wa3[i-1]*cc[t3-1]; 2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr1=cr2+cr4; 2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr4=cr4-cr2; 2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti1=ci2+ci4; 2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti4=ci2-ci4; 2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti2=cc[t2]+ci3; 2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti3=cc[t2]-ci3; 2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr2=cc[t2-1]+cr3; 2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr3=cc[t2-1]-cr3; 2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4-1]=tr1+tr2; 2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4]=ti1+ti2; 2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5-1]=tr3-ti4; 2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5]=tr4-ti3; 2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4+t6-1]=ti4+tr3; 2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4+t6]=tr4+ti3; 2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5+t6-1]=tr2-tr1; 2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5+t6]=ti1-ti2; 2418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 2438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido&1)return; 2458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L105: 2478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=(t1=t0+ido-1)+(t0<<1); 2498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=ido<<2; 2508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=ido; 2518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=ido<<1; 2528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=ido; 2538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 2558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti1=-hsqt2*(cc[t1]+cc[t2]); 2568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr1=hsqt2*(cc[t1]-cc[t2]); 2578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4-1]=tr1+cc[t6-1]; 2598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4+t5-1]=cc[t6-1]-tr1; 2608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4]=ti1-cc[t1+t0]; 2628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4+t5]=ti1+cc[t1+t0]; 2638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 2658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 2668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=t3; 2678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=ido; 2688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 2698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 2708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void dradfg(int ido,int ip,int l1,int idl1,float *cc,float *c1, 2728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *c2,float *ch,float *ch2,float *wa){ 2738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels static float tpi=6.283185307179586f; 2758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int idij,ipph,i,j,k,l,ic,ik,is; 2768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; 2778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float dc2,ai1,ai2,ar1,ar2,ds2; 2788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int nbd; 2798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float dcp,arg,dsp,ar1h,ar2h; 2808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int idp2,ipp2; 2818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels arg=tpi/(float)ip; 2838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dcp=cos(arg); 2848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dsp=sin(arg); 2858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ipph=(ip+1)>>1; 2868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ipp2=ip; 2878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idp2=ido; 2888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nbd=(ido-1)>>1; 2898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t0=l1*ido; 2908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t10=ip*ido; 2918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==1)goto L119; 2938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(ik=0;ik<idl1;ik++)ch2[ik]=c2[ik]; 2948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 2968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ip;j++){ 2978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 2988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t1; 2998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 3008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t2]=c1[t2]; 3018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 3028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels is=-ido; 3068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 3078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(nbd>l1){ 3088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ip;j++){ 3098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 3108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels is+=ido; 3118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2= -ido+t1; 3128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 3138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idij=is-1; 3148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 3158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t2; 3168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 3178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idij+=2; 3188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=2; 3198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t3-1]=wa[idij-1]*c1[t3-1]+wa[idij]*c1[t3]; 3208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t3]=wa[idij-1]*c1[t3]-wa[idij]*c1[t3-1]; 3218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else{ 3258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ip;j++){ 3278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels is+=ido; 3288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idij=is-1; 3298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 3308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t1; 3318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 3328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idij+=2; 3338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=2; 3348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t2; 3358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 3368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t3-1]=wa[idij-1]*c1[t3-1]+wa[idij]*c1[t3]; 3378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t3]=wa[idij-1]*c1[t3]-wa[idij]*c1[t3-1]; 3388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 3398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 3458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ipp2*t0; 3468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(nbd<l1){ 3478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 3488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 3498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=t0; 3508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 3518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 3528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 3538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=2; 3548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=2; 3558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t3-ido; 3568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t4-ido; 3578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 3588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=ido; 3598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=ido; 3608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t5-1]=ch[t5-1]+ch[t6-1]; 3618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t6-1]=ch[t5]-ch[t6]; 3628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t5]=ch[t5]+ch[t6]; 3638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t6]=ch[t6-1]-ch[t5-1]; 3648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels }else{ 3688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 3698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 3708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=t0; 3718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 3728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 3738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 3748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t3; 3758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t4; 3768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 3778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=2; 3788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=2; 3798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t5-1]=ch[t5-1]+ch[t6-1]; 3808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t6-1]=ch[t5]-ch[t6]; 3818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t5]=ch[t5]+ch[t6]; 3828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t6]=ch[t6-1]-ch[t5-1]; 3838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 3858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=ido; 3868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 3898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsL119: 3918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(ik=0;ik<idl1;ik++)c2[ik]=ch2[ik]; 3928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 3948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ipp2*idl1; 3958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 3968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 3978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=t0; 3988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1-ido; 3998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2-ido; 4008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 4018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 4028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=ido; 4038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t3]=ch[t3]+ch[t4]; 4048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t4]=ch[t4]-ch[t3]; 4058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar1=1.f; 4098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ai1=0.f; 4108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 4118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ipp2*idl1; 4128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=(ip-1)*idl1; 4138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(l=1;l<ipph;l++){ 4148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=idl1; 4158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=idl1; 4168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar1h=dcp*ar1-dsp*ai1; 4178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ai1=dcp*ai1+dsp*ar1; 4188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar1=ar1h; 4198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t1; 4208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t2; 4218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t3; 4228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=idl1; 4238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(ik=0;ik<idl1;ik++){ 4258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch2[t4++]=c2[ik]+ar1*c2[t7++]; 4268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch2[t5++]=ai1*c2[t6++]; 4278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dc2=ar1; 4308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ds2=ai1; 4318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar2=ar1; 4328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ai2=ai1; 4338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=idl1; 4358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=(ipp2-1)*idl1; 4368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=2;j<ipph;j++){ 4378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=idl1; 4388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5-=idl1; 4398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar2h=dc2*ar2-ds2*ai2; 4418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ai2=dc2*ai2+ds2*ar2; 4428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar2=ar2h; 4438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t1; 4458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=t2; 4468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8=t4; 4478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9=t5; 4488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(ik=0;ik<idl1;ik++){ 4498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch2[t6++]+=ar2*c2[t8++]; 4508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch2[t7++]+=ai2*c2[t9++]; 4518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 4568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 4578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=idl1; 4588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t1; 4598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(ik=0;ik<idl1;ik++)ch2[ik]+=c2[t2++]; 4608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido<l1)goto L132; 4638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 4658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=0; 4668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 4678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 4688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 4698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<ido;i++)cc[t4++]=ch[t3++]; 4708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 4718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=t10; 4728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L135; 4758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L132: 4778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<ido;i++){ 4788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=i; 4798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=i; 4808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 4818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[t2]=ch[t1]; 4828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 4838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=t10; 4848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 4868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L135: 4888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 4898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ido<<1; 4908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=0; 4918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=ipp2*t0; 4928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 4938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t2; 4958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=t0; 4968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4-=t0; 4978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 4988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t1; 4998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t3; 5008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=t4; 5018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 5038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[t5-1]=ch[t6]; 5048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[t5]=ch[t7]; 5058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=t10; 5068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=ido; 5078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7+=ido; 5088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==1)return; 5128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(nbd<l1)goto L141; 5138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=-ido; 5158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=0; 5168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=0; 5178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=ipp2*t0; 5188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 5198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t2; 5208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=t2; 5218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=t0; 5228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5-=t0; 5238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t1; 5248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=t3; 5258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8=t4; 5268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9=t5; 5278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 5288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 5298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ic=idp2-i; 5308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[i+t7-1]=ch[i+t8-1]+ch[i+t9-1]; 5318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[ic+t6-1]=ch[i+t8-1]-ch[i+t9-1]; 5328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[i+t7]=ch[i+t8]+ch[i+t9]; 5338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[ic+t6]=ch[i+t9]-ch[i+t8]; 5348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=t10; 5368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7+=t10; 5378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8+=ido; 5388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9+=ido; 5398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels return; 5428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L141: 5448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=-ido; 5468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=0; 5478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=0; 5488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=ipp2*t0; 5498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 5508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t2; 5518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=t2; 5528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=t0; 5538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5-=t0; 5548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 5558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=idp2+t1-i; 5568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=i+t3; 5578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8=i+t4; 5588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9=i+t5; 5598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 5608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[t7-1]=ch[t8-1]+ch[t9-1]; 5618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[t6-1]=ch[t8-1]-ch[t9-1]; 5628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[t7]=ch[t8]+ch[t9]; 5638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cc[t6]=ch[t9]-ch[t8]; 5648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=t10; 5658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7+=t10; 5668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8+=ido; 5678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9+=ido; 5688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 5718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 5728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void drftf1(int n,float *c,float *ch,float *wa,int *ifac){ 5748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int i,k1,l1,l2; 5758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int na,kh,nf; 5768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int ip,iw,ido,idl1,ix2,ix3; 5778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nf=ifac[1]; 5798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels na=1; 5808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l2=n; 5818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels iw=n; 5828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k1=0;k1<nf;k1++){ 5848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels kh=nf-k1; 5858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ip=ifac[kh+1]; 5868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l1=l2/ip; 5878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ido=n/l2; 5888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idl1=ido*l1; 5898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels iw-=(ip-1)*ido; 5908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels na=1-na; 5918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ip!=4)goto L102; 5938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 5948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ix2=iw+ido; 5958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ix3=ix2+ido; 5968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na!=0) 5978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradf4(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1); 5988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 5998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradf4(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1); 6008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L110; 6018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L102: 6038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ip!=2)goto L104; 6048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na!=0)goto L103; 6058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradf2(ido,l1,c,ch,wa+iw-1); 6078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L110; 6088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L103: 6108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradf2(ido,l1,ch,c,wa+iw-1); 6118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L110; 6128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L104: 6148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==1)na=1-na; 6158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na!=0)goto L109; 6168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradfg(ido,ip,l1,idl1,c,c,c,ch,ch,wa+iw-1); 6188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels na=1; 6198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L110; 6208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L109: 6228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradfg(ido,ip,l1,idl1,ch,ch,ch,c,c,wa+iw-1); 6238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels na=0; 6248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L110: 6268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l2=l1; 6278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 6288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na==1)return; 6308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<n;i++)c[i]=ch[i]; 6328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 6338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void dradb2(int ido,int l1,float *cc,float *ch,float *wa1){ 6358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int i,k,t0,t1,t2,t3,t4,t5,t6; 6368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ti2,tr2; 6378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t0=l1*ido; 6398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 6418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=0; 6428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=(ido<<1)-1; 6438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 6448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1]=cc[t2]+cc[t3+t2]; 6458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1+t0]=cc[t2]-cc[t3+t2]; 6468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=(t1+=ido)<<1; 6478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 6488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido<2)return; 6508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==2)goto L105; 6518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 6538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=0; 6548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 6558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 6568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=(t4=t2)+(ido<<1); 6578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t0+t1; 6588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 6598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=2; 6608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=2; 6618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5-=2; 6628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=2; 6638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t3-1]=cc[t4-1]+cc[t5-1]; 6648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr2=cc[t4-1]-cc[t5-1]; 6658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t3]=cc[t4]-cc[t5]; 6668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti2=cc[t4]+cc[t5]; 6678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6-1]=wa1[i-2]*tr2-wa1[i-1]*ti2; 6688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6]=wa1[i-2]*ti2+wa1[i-1]*tr2; 6698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 6708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=(t1+=ido)<<1; 6718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 6728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido%2==1)return; 6748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsL105: 6768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=ido-1; 6778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ido-1; 6788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 6798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1]=cc[t2]+cc[t2]; 6808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1+t0]=-(cc[t2+1]+cc[t2+1]); 6818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 6828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido<<1; 6838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 6848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 6858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void dradb3(int ido,int l1,float *cc,float *ch,float *wa1, 6878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *wa2){ 6888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels static float taur = -.5f; 6898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels static float taui = .8660254037844386f; 6908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int i,k,t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; 6918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ci2,ci3,di2,di3,cr2,cr3,dr2,dr3,ti2,tr2; 6928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t0=l1*ido; 6938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 6948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 6958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t0<<1; 6968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=ido<<1; 6978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=ido+(ido<<1); 6988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=0; 6998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 7008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr2=cc[t3-1]+cc[t3-1]; 7018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cr2=cc[t5]+(taur*tr2); 7028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1]=cc[t5]+tr2; 7038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ci3=taui*(cc[t3]+cc[t3]); 7048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1+t0]=cr2-ci3; 7058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t1+t2]=cr2+ci3; 7068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 7078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=t4; 7088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=t4; 7098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 7108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 7118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==1)return; 7128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 7138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 7148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=ido<<1; 7158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 7168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=t1+(t1<<1); 7178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=(t5=t7+t3); 7188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8=t1; 7198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t10=(t9=t1+t0)+t0; 7208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 7218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 7228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=2; 7238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6-=2; 7248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7+=2; 7258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8+=2; 7268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9+=2; 7278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t10+=2; 7288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr2=cc[t5-1]+cc[t6-1]; 7298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cr2=cc[t7-1]+(taur*tr2); 7308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t8-1]=cc[t7-1]+tr2; 7318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti2=cc[t5]-cc[t6]; 7328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ci2=cc[t7]+(taur*ti2); 7338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t8]=cc[t7]+ti2; 7348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cr3=taui*(cc[t5-1]-cc[t6-1]); 7358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ci3=taui*(cc[t5]+cc[t6]); 7368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dr2=cr2-ci3; 7378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dr3=cr2+ci3; 7388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels di2=ci2+cr3; 7398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels di3=ci2-cr3; 7408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t9-1]=wa1[i-2]*dr2-wa1[i-1]*di2; 7418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t9]=wa1[i-2]*di2+wa1[i-1]*dr2; 7428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t10-1]=wa2[i-2]*dr3-wa2[i-1]*di3; 7438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t10]=wa2[i-2]*di3+wa2[i-1]*dr3; 7448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 7458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 7468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 7478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 7488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 7498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void dradb4(int ido,int l1,float *cc,float *ch,float *wa1, 7508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *wa2,float *wa3){ 7518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels static float sqrt2=1.414213562373095f; 7528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int i,k,t0,t1,t2,t3,t4,t5,t6,t7,t8; 7538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float ci2,ci3,ci4,cr2,cr3,cr4,ti1,ti2,ti3,ti4,tr1,tr2,tr3,tr4; 7548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t0=l1*ido; 7558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 7568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 7578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ido<<2; 7588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=0; 7598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=ido<<1; 7608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 7618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t3+t6; 7628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t1; 7638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr3=cc[t4-1]+cc[t4-1]; 7648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr4=cc[t4]+cc[t4]; 7658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr1=cc[t3]-cc[(t4+=t6)-1]; 7668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr2=cc[t3]+cc[t4-1]; 7678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5]=tr2+tr3; 7688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5+=t0]=tr1-tr4; 7698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5+=t0]=tr2-tr3; 7708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5+=t0]=tr1+tr4; 7718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 7728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=t2; 7738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 7748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 7758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido<2)return; 7768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==2)goto L105; 7778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 7788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 7798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 7808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=(t4=(t3=(t2=t1<<2)+t6))+t6; 7818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=t1; 7828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 7838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=2; 7848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=2; 7858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4-=2; 7868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5-=2; 7878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7+=2; 7888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti1=cc[t2]+cc[t5]; 7898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti2=cc[t2]-cc[t5]; 7908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti3=cc[t3]-cc[t4]; 7918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr4=cc[t3]+cc[t4]; 7928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr1=cc[t2-1]-cc[t5-1]; 7938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr2=cc[t2-1]+cc[t5-1]; 7948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti4=cc[t3-1]-cc[t4-1]; 7958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr3=cc[t3-1]+cc[t4-1]; 7968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t7-1]=tr2+tr3; 7978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cr3=tr2-tr3; 7988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t7]=ti2+ti3; 7998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ci3=ti2-ti3; 8008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cr2=tr1-tr4; 8018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels cr4=tr1+tr4; 8028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ci2=ti1+ti4; 8038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ci4=ti1-ti4; 8048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[(t8=t7+t0)-1]=wa1[i-2]*cr2-wa1[i-1]*ci2; 8068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t8]=wa1[i-2]*ci2+wa1[i-1]*cr2; 8078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[(t8+=t0)-1]=wa2[i-2]*cr3-wa2[i-1]*ci3; 8088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t8]=wa2[i-2]*ci3+wa2[i-1]*cr3; 8098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[(t8+=t0)-1]=wa3[i-2]*cr4-wa3[i-1]*ci4; 8108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t8]=wa3[i-2]*ci4+wa3[i-1]*cr4; 8118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 8128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 8138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 8148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido%2 == 1)return; 8168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L105: 8188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=ido; 8208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ido<<2; 8218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=ido-1; 8228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=ido+(ido<<1); 8238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 8248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t3; 8258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti1=cc[t1]+cc[t4]; 8268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ti2=cc[t4]-cc[t1]; 8278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr1=cc[t1-1]-cc[t4-1]; 8288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels tr2=cc[t1-1]+cc[t4-1]; 8298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5]=tr2+tr2; 8308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5+=t0]=sqrt2*(tr1-ti1); 8318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5+=t0]=ti2+ti2; 8328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5+=t0]=-sqrt2*(tr1+ti1); 8338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 8358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t2; 8368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=t2; 8378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 8388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 8398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void dradbg(int ido,int ip,int l1,int idl1,float *cc,float *c1, 8418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float *c2,float *ch,float *ch2,float *wa){ 8428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels static float tpi=6.283185307179586f; 8438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int idij,ipph,i,j,k,l,ik,is,t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10, 8448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t11,t12; 8458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float dc2,ai1,ai2,ar1,ar2,ds2; 8468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int nbd; 8478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels float dcp,arg,dsp,ar1h,ar2h; 8488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int ipp2; 8498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t10=ip*ido; 8518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t0=l1*ido; 8528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels arg=tpi/(float)ip; 8538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dcp=cos(arg); 8548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dsp=sin(arg); 8558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nbd=(ido-1)>>1; 8568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ipp2=ip; 8578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ipph=(ip+1)>>1; 8588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido<l1)goto L103; 8598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 8618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=0; 8628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 8638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 8648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 8658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<ido;i++){ 8668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t3]=cc[t4]; 8678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3++; 8688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4++; 8698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 8708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=ido; 8718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=t10; 8728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 8738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L106; 8748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L103: 8768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 8778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<ido;i++){ 8788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t1; 8798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 8808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 8818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t2]=cc[t3]; 8828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 8838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=t10; 8848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 8858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1++; 8868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 8878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 8888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L106: 8898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 8908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ipp2*t0; 8918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=(t5=ido<<1); 8928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 8938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 8948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=t0; 8958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 8968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 8978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t5; 8988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 8998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t3]=cc[t6-1]+cc[t6-1]; 9008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4]=cc[t6]+cc[t6]; 9018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 9028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=ido; 9038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=t10; 9048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 9058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=t7; 9068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 9078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 9088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (ido == 1)goto L116; 9098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(nbd<l1)goto L112; 9108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 9118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 9128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ipp2*t0; 9138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=0; 9148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 9158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 9168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=t0; 9178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 9188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 9198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 9208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7+=(ido<<1); 9218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8=t7; 9228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 9238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t3; 9248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t4; 9258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9=t8; 9268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t11=t8; 9278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 9288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=2; 9298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=2; 9308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9+=2; 9318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t11-=2; 9328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5-1]=cc[t9-1]+cc[t11-1]; 9338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6-1]=cc[t9-1]-cc[t11-1]; 9348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5]=cc[t9]-cc[t11]; 9358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6]=cc[t9]+cc[t11]; 9368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 9378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 9388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=ido; 9398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8+=t10; 9408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 9418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 9428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L116; 9438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 9448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L112: 9458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 9468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ipp2*t0; 9478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=0; 9488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 9498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 9508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=t0; 9518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 9528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 9538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7+=(ido<<1); 9548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8=t7; 9558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9=t7; 9568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 9578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=2; 9588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=2; 9598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8+=2; 9608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9-=2; 9618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t3; 9628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t4; 9638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t11=t8; 9648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t12=t9; 9658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 9668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5-1]=cc[t11-1]+cc[t12-1]; 9678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6-1]=cc[t11-1]-cc[t12-1]; 9688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5]=cc[t11]-cc[t12]; 9698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6]=cc[t11]+cc[t12]; 9708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=ido; 9718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=ido; 9728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t11+=t10; 9738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t12+=t10; 9748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 9758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 9768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 9778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 9788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsL116: 9798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar1=1.f; 9808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ai1=0.f; 9818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 9828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t9=(t2=ipp2*idl1); 9838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=(ip-1)*idl1; 9848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(l=1;l<ipph;l++){ 9858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=idl1; 9868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=idl1; 9878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 9888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar1h=dcp*ar1-dsp*ai1; 9898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ai1=dcp*ai1+dsp*ar1; 9908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar1=ar1h; 9918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t1; 9928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t2; 9938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=0; 9948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=idl1; 9958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t8=t3; 9968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(ik=0;ik<idl1;ik++){ 9978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c2[t4++]=ch2[t6++]+ar1*ch2[t7++]; 9988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c2[t5++]=ai1*ch2[t8++]; 9998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dc2=ar1; 10018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ds2=ai1; 10028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar2=ar1; 10038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ai2=ai1; 10048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=idl1; 10068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7=t9-idl1; 10078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=2;j<ipph;j++){ 10088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=idl1; 10098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t7-=idl1; 10108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar2h=dc2*ar2-ds2*ai2; 10118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ai2=dc2*ai2+ds2*ar2; 10128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ar2=ar2h; 10138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t1; 10148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t2; 10158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t11=t6; 10168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t12=t7; 10178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(ik=0;ik<idl1;ik++){ 10188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c2[t4++]+=ar2*ch2[t11++]; 10198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c2[t5++]+=ai2*ch2[t12++]; 10208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 10258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 10268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=idl1; 10278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t1; 10288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(ik=0;ik<idl1;ik++)ch2[ik]+=ch2[t2++]; 10298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 10328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ipp2*t0; 10338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 10348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 10358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=t0; 10368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 10378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 10388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 10398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t3]=c1[t3]-c1[t4]; 10408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t4]=c1[t3]+c1[t4]; 10418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 10428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=ido; 10438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==1)goto L132; 10478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(nbd<l1)goto L128; 10488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 10508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ipp2*t0; 10518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 10528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 10538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=t0; 10548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 10558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 10568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 10578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t3; 10588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t4; 10598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 10608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=2; 10618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=2; 10628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5-1]=c1[t5-1]-c1[t6]; 10638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6-1]=c1[t5-1]+c1[t6]; 10648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5]=c1[t5]+c1[t6-1]; 10658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6]=c1[t5]-c1[t6-1]; 10668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 10688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=ido; 10698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L132; 10728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L128: 10748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 10758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=ipp2*t0; 10768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ipph;j++){ 10778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 10788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2-=t0; 10798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t1; 10808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4=t2; 10818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 10828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=2; 10838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t4+=2; 10848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5=t3; 10858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6=t4; 10868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 10878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5-1]=c1[t5-1]-c1[t6]; 10888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6-1]=c1[t5-1]+c1[t6]; 10898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t5]=c1[t5]+c1[t6-1]; 10908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ch[t6]=c1[t5]-c1[t6-1]; 10918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t5+=ido; 10928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t6+=ido; 10938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 10968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 10978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsL132: 10988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==1)return; 10998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(ik=0;ik<idl1;ik++)c2[ik]=ch2[ik]; 11018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 11038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ip;j++){ 11048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=(t1+=t0); 11058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 11068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t2]=ch[t2]; 11078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 11088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 11098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 11108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(nbd>l1)goto L139; 11128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels is= -ido-1; 11148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 11158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ip;j++){ 11168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels is+=ido; 11178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 11188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idij=is; 11198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t1; 11208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 11218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=2; 11228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idij+=2; 11238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t2; 11248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 11258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t3-1]=wa[idij-1]*ch[t3-1]-wa[idij]*ch[t3]; 11268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t3]=wa[idij-1]*ch[t3]+wa[idij]*ch[t3-1]; 11278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=ido; 11288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 11298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 11308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 11318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels return; 11328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L139: 11348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels is= -ido-1; 11358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1=0; 11368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(j=1;j<ip;j++){ 11378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels is+=ido; 11388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t1+=t0; 11398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2=t1; 11408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k=0;k<l1;k++){ 11418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idij=is; 11428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3=t2; 11438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=2;i<ido;i+=2){ 11448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idij+=2; 11458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t3+=2; 11468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t3-1]=wa[idij-1]*ch[t3-1]-wa[idij]*ch[t3]; 11478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels c1[t3]=wa[idij-1]*ch[t3]+wa[idij]*ch[t3-1]; 11488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 11498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels t2+=ido; 11508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 11518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 11528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 11538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstatic void drftb1(int n, float *c, float *ch, float *wa, int *ifac){ 11558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int i,k1,l1,l2; 11568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int na; 11578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels int nf,ip,iw,ix2,ix3,ido,idl1; 11588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels nf=ifac[1]; 11608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels na=0; 11618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l1=1; 11628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels iw=1; 11638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(k1=0;k1<nf;k1++){ 11658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ip=ifac[k1 + 2]; 11668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l2=ip*l1; 11678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ido=n/l2; 11688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels idl1=ido*l1; 11698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ip!=4)goto L103; 11708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ix2=iw+ido; 11718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ix3=ix2+ido; 11728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na!=0) 11748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradb4(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1); 11758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 11768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradb4(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1); 11778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels na=1-na; 11788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L115; 11798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L103: 11818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ip!=2)goto L106; 11828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na!=0) 11848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradb2(ido,l1,ch,c,wa+iw-1); 11858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 11868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradb2(ido,l1,c,ch,wa+iw-1); 11878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels na=1-na; 11888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L115; 11898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L106: 11918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ip!=3)goto L109; 11928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 11938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ix2=iw+ido; 11948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na!=0) 11958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradb3(ido,l1,ch,c,wa+iw-1,wa+ix2-1); 11968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 11978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradb3(ido,l1,c,ch,wa+iw-1,wa+ix2-1); 11988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels na=1-na; 11998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L115; 12008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L109: 12028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* The radix five case can be translated later..... */ 12038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels/* if(ip!=5)goto L112; 12048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ix2=iw+ido; 12068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ix3=ix2+ido; 12078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels ix4=ix3+ido; 12088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na!=0) 12098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradb5(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1,wa+ix4-1); 12108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 12118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradb5(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1,wa+ix4-1); 12128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels na=1-na; 12138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels goto L115; 12148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L112:*/ 12168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na!=0) 12178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradbg(ido,ip,l1,idl1,ch,ch,ch,c,c,wa+iw-1); 12188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels else 12198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels dradbg(ido,ip,l1,idl1,c,c,c,ch,ch,wa+iw-1); 12208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(ido==1)na=1-na; 12218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels L115: 12238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l1=l2; 12248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels iw+=(ip-1)*ido; 12258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 12268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(na==0)return; 12288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels for(i=0;i<n;i++)c[i]=ch[i]; 12308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 12318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid drft_forward(drft_lookup *l,float *data){ 12338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(l->n==1)return; 12348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); 12358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 12368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid drft_backward(drft_lookup *l,float *data){ 12388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if (l->n==1)return; 12398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); 12408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 12418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid drft_init(drft_lookup *l,int n){ 12438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l->n=n; 12448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l->trigcache=_ogg_calloc(3*n,sizeof(*l->trigcache)); 12458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels l->splitcache=_ogg_calloc(32,sizeof(*l->splitcache)); 12468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels fdrffti(n, l->trigcache, l->splitcache); 12478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 12488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 12498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvoid drft_clear(drft_lookup *l){ 12508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(l){ 12518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(l->trigcache)_ogg_free(l->trigcache); 12528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels if(l->splitcache)_ogg_free(l->splitcache); 12538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels memset(l,0,sizeof(*l)); 12548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels } 12558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels} 1256