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