annotate src/libvorbis-1.3.3/lib/smallft.c @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 98c1576536ae
children
rev   line source
cannam@86 1 /********************************************************************
cannam@86 2 * *
cannam@86 3 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. *
cannam@86 4 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
cannam@86 5 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
cannam@86 6 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
cannam@86 7 * *
cannam@86 8 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 *
cannam@86 9 * by the Xiph.Org Foundation http://www.xiph.org/ *
cannam@86 10 * *
cannam@86 11 ********************************************************************
cannam@86 12
cannam@86 13 function: *unnormalized* fft transform
cannam@86 14 last mod: $Id: smallft.c 16227 2009-07-08 06:58:46Z xiphmont $
cannam@86 15
cannam@86 16 ********************************************************************/
cannam@86 17
cannam@86 18 /* FFT implementation from OggSquish, minus cosine transforms,
cannam@86 19 * minus all but radix 2/4 case. In Vorbis we only need this
cannam@86 20 * cut-down version.
cannam@86 21 *
cannam@86 22 * To do more than just power-of-two sized vectors, see the full
cannam@86 23 * version I wrote for NetLib.
cannam@86 24 *
cannam@86 25 * Note that the packing is a little strange; rather than the FFT r/i
cannam@86 26 * packing following R_0, I_n, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1,
cannam@86 27 * it follows R_0, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, I_n like the
cannam@86 28 * FORTRAN version
cannam@86 29 */
cannam@86 30
cannam@86 31 #include <stdlib.h>
cannam@86 32 #include <string.h>
cannam@86 33 #include <math.h>
cannam@86 34 #include "smallft.h"
cannam@86 35 #include "os.h"
cannam@86 36 #include "misc.h"
cannam@86 37
cannam@86 38 static void drfti1(int n, float *wa, int *ifac){
cannam@86 39 static int ntryh[4] = { 4,2,3,5 };
cannam@86 40 static float tpi = 6.28318530717958648f;
cannam@86 41 float arg,argh,argld,fi;
cannam@86 42 int ntry=0,i,j=-1;
cannam@86 43 int k1, l1, l2, ib;
cannam@86 44 int ld, ii, ip, is, nq, nr;
cannam@86 45 int ido, ipm, nfm1;
cannam@86 46 int nl=n;
cannam@86 47 int nf=0;
cannam@86 48
cannam@86 49 L101:
cannam@86 50 j++;
cannam@86 51 if (j < 4)
cannam@86 52 ntry=ntryh[j];
cannam@86 53 else
cannam@86 54 ntry+=2;
cannam@86 55
cannam@86 56 L104:
cannam@86 57 nq=nl/ntry;
cannam@86 58 nr=nl-ntry*nq;
cannam@86 59 if (nr!=0) goto L101;
cannam@86 60
cannam@86 61 nf++;
cannam@86 62 ifac[nf+1]=ntry;
cannam@86 63 nl=nq;
cannam@86 64 if(ntry!=2)goto L107;
cannam@86 65 if(nf==1)goto L107;
cannam@86 66
cannam@86 67 for (i=1;i<nf;i++){
cannam@86 68 ib=nf-i+1;
cannam@86 69 ifac[ib+1]=ifac[ib];
cannam@86 70 }
cannam@86 71 ifac[2] = 2;
cannam@86 72
cannam@86 73 L107:
cannam@86 74 if(nl!=1)goto L104;
cannam@86 75 ifac[0]=n;
cannam@86 76 ifac[1]=nf;
cannam@86 77 argh=tpi/n;
cannam@86 78 is=0;
cannam@86 79 nfm1=nf-1;
cannam@86 80 l1=1;
cannam@86 81
cannam@86 82 if(nfm1==0)return;
cannam@86 83
cannam@86 84 for (k1=0;k1<nfm1;k1++){
cannam@86 85 ip=ifac[k1+2];
cannam@86 86 ld=0;
cannam@86 87 l2=l1*ip;
cannam@86 88 ido=n/l2;
cannam@86 89 ipm=ip-1;
cannam@86 90
cannam@86 91 for (j=0;j<ipm;j++){
cannam@86 92 ld+=l1;
cannam@86 93 i=is;
cannam@86 94 argld=(float)ld*argh;
cannam@86 95 fi=0.f;
cannam@86 96 for (ii=2;ii<ido;ii+=2){
cannam@86 97 fi+=1.f;
cannam@86 98 arg=fi*argld;
cannam@86 99 wa[i++]=cos(arg);
cannam@86 100 wa[i++]=sin(arg);
cannam@86 101 }
cannam@86 102 is+=ido;
cannam@86 103 }
cannam@86 104 l1=l2;
cannam@86 105 }
cannam@86 106 }
cannam@86 107
cannam@86 108 static void fdrffti(int n, float *wsave, int *ifac){
cannam@86 109
cannam@86 110 if (n == 1) return;
cannam@86 111 drfti1(n, wsave+n, ifac);
cannam@86 112 }
cannam@86 113
cannam@86 114 static void dradf2(int ido,int l1,float *cc,float *ch,float *wa1){
cannam@86 115 int i,k;
cannam@86 116 float ti2,tr2;
cannam@86 117 int t0,t1,t2,t3,t4,t5,t6;
cannam@86 118
cannam@86 119 t1=0;
cannam@86 120 t0=(t2=l1*ido);
cannam@86 121 t3=ido<<1;
cannam@86 122 for(k=0;k<l1;k++){
cannam@86 123 ch[t1<<1]=cc[t1]+cc[t2];
cannam@86 124 ch[(t1<<1)+t3-1]=cc[t1]-cc[t2];
cannam@86 125 t1+=ido;
cannam@86 126 t2+=ido;
cannam@86 127 }
cannam@86 128
cannam@86 129 if(ido<2)return;
cannam@86 130 if(ido==2)goto L105;
cannam@86 131
cannam@86 132 t1=0;
cannam@86 133 t2=t0;
cannam@86 134 for(k=0;k<l1;k++){
cannam@86 135 t3=t2;
cannam@86 136 t4=(t1<<1)+(ido<<1);
cannam@86 137 t5=t1;
cannam@86 138 t6=t1+t1;
cannam@86 139 for(i=2;i<ido;i+=2){
cannam@86 140 t3+=2;
cannam@86 141 t4-=2;
cannam@86 142 t5+=2;
cannam@86 143 t6+=2;
cannam@86 144 tr2=wa1[i-2]*cc[t3-1]+wa1[i-1]*cc[t3];
cannam@86 145 ti2=wa1[i-2]*cc[t3]-wa1[i-1]*cc[t3-1];
cannam@86 146 ch[t6]=cc[t5]+ti2;
cannam@86 147 ch[t4]=ti2-cc[t5];
cannam@86 148 ch[t6-1]=cc[t5-1]+tr2;
cannam@86 149 ch[t4-1]=cc[t5-1]-tr2;
cannam@86 150 }
cannam@86 151 t1+=ido;
cannam@86 152 t2+=ido;
cannam@86 153 }
cannam@86 154
cannam@86 155 if(ido%2==1)return;
cannam@86 156
cannam@86 157 L105:
cannam@86 158 t3=(t2=(t1=ido)-1);
cannam@86 159 t2+=t0;
cannam@86 160 for(k=0;k<l1;k++){
cannam@86 161 ch[t1]=-cc[t2];
cannam@86 162 ch[t1-1]=cc[t3];
cannam@86 163 t1+=ido<<1;
cannam@86 164 t2+=ido;
cannam@86 165 t3+=ido;
cannam@86 166 }
cannam@86 167 }
cannam@86 168
cannam@86 169 static void dradf4(int ido,int l1,float *cc,float *ch,float *wa1,
cannam@86 170 float *wa2,float *wa3){
cannam@86 171 static float hsqt2 = .70710678118654752f;
cannam@86 172 int i,k,t0,t1,t2,t3,t4,t5,t6;
cannam@86 173 float ci2,ci3,ci4,cr2,cr3,cr4,ti1,ti2,ti3,ti4,tr1,tr2,tr3,tr4;
cannam@86 174 t0=l1*ido;
cannam@86 175
cannam@86 176 t1=t0;
cannam@86 177 t4=t1<<1;
cannam@86 178 t2=t1+(t1<<1);
cannam@86 179 t3=0;
cannam@86 180
cannam@86 181 for(k=0;k<l1;k++){
cannam@86 182 tr1=cc[t1]+cc[t2];
cannam@86 183 tr2=cc[t3]+cc[t4];
cannam@86 184
cannam@86 185 ch[t5=t3<<2]=tr1+tr2;
cannam@86 186 ch[(ido<<2)+t5-1]=tr2-tr1;
cannam@86 187 ch[(t5+=(ido<<1))-1]=cc[t3]-cc[t4];
cannam@86 188 ch[t5]=cc[t2]-cc[t1];
cannam@86 189
cannam@86 190 t1+=ido;
cannam@86 191 t2+=ido;
cannam@86 192 t3+=ido;
cannam@86 193 t4+=ido;
cannam@86 194 }
cannam@86 195
cannam@86 196 if(ido<2)return;
cannam@86 197 if(ido==2)goto L105;
cannam@86 198
cannam@86 199
cannam@86 200 t1=0;
cannam@86 201 for(k=0;k<l1;k++){
cannam@86 202 t2=t1;
cannam@86 203 t4=t1<<2;
cannam@86 204 t5=(t6=ido<<1)+t4;
cannam@86 205 for(i=2;i<ido;i+=2){
cannam@86 206 t3=(t2+=2);
cannam@86 207 t4+=2;
cannam@86 208 t5-=2;
cannam@86 209
cannam@86 210 t3+=t0;
cannam@86 211 cr2=wa1[i-2]*cc[t3-1]+wa1[i-1]*cc[t3];
cannam@86 212 ci2=wa1[i-2]*cc[t3]-wa1[i-1]*cc[t3-1];
cannam@86 213 t3+=t0;
cannam@86 214 cr3=wa2[i-2]*cc[t3-1]+wa2[i-1]*cc[t3];
cannam@86 215 ci3=wa2[i-2]*cc[t3]-wa2[i-1]*cc[t3-1];
cannam@86 216 t3+=t0;
cannam@86 217 cr4=wa3[i-2]*cc[t3-1]+wa3[i-1]*cc[t3];
cannam@86 218 ci4=wa3[i-2]*cc[t3]-wa3[i-1]*cc[t3-1];
cannam@86 219
cannam@86 220 tr1=cr2+cr4;
cannam@86 221 tr4=cr4-cr2;
cannam@86 222 ti1=ci2+ci4;
cannam@86 223 ti4=ci2-ci4;
cannam@86 224
cannam@86 225 ti2=cc[t2]+ci3;
cannam@86 226 ti3=cc[t2]-ci3;
cannam@86 227 tr2=cc[t2-1]+cr3;
cannam@86 228 tr3=cc[t2-1]-cr3;
cannam@86 229
cannam@86 230 ch[t4-1]=tr1+tr2;
cannam@86 231 ch[t4]=ti1+ti2;
cannam@86 232
cannam@86 233 ch[t5-1]=tr3-ti4;
cannam@86 234 ch[t5]=tr4-ti3;
cannam@86 235
cannam@86 236 ch[t4+t6-1]=ti4+tr3;
cannam@86 237 ch[t4+t6]=tr4+ti3;
cannam@86 238
cannam@86 239 ch[t5+t6-1]=tr2-tr1;
cannam@86 240 ch[t5+t6]=ti1-ti2;
cannam@86 241 }
cannam@86 242 t1+=ido;
cannam@86 243 }
cannam@86 244 if(ido&1)return;
cannam@86 245
cannam@86 246 L105:
cannam@86 247
cannam@86 248 t2=(t1=t0+ido-1)+(t0<<1);
cannam@86 249 t3=ido<<2;
cannam@86 250 t4=ido;
cannam@86 251 t5=ido<<1;
cannam@86 252 t6=ido;
cannam@86 253
cannam@86 254 for(k=0;k<l1;k++){
cannam@86 255 ti1=-hsqt2*(cc[t1]+cc[t2]);
cannam@86 256 tr1=hsqt2*(cc[t1]-cc[t2]);
cannam@86 257
cannam@86 258 ch[t4-1]=tr1+cc[t6-1];
cannam@86 259 ch[t4+t5-1]=cc[t6-1]-tr1;
cannam@86 260
cannam@86 261 ch[t4]=ti1-cc[t1+t0];
cannam@86 262 ch[t4+t5]=ti1+cc[t1+t0];
cannam@86 263
cannam@86 264 t1+=ido;
cannam@86 265 t2+=ido;
cannam@86 266 t4+=t3;
cannam@86 267 t6+=ido;
cannam@86 268 }
cannam@86 269 }
cannam@86 270
cannam@86 271 static void dradfg(int ido,int ip,int l1,int idl1,float *cc,float *c1,
cannam@86 272 float *c2,float *ch,float *ch2,float *wa){
cannam@86 273
cannam@86 274 static float tpi=6.283185307179586f;
cannam@86 275 int idij,ipph,i,j,k,l,ic,ik,is;
cannam@86 276 int t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
cannam@86 277 float dc2,ai1,ai2,ar1,ar2,ds2;
cannam@86 278 int nbd;
cannam@86 279 float dcp,arg,dsp,ar1h,ar2h;
cannam@86 280 int idp2,ipp2;
cannam@86 281
cannam@86 282 arg=tpi/(float)ip;
cannam@86 283 dcp=cos(arg);
cannam@86 284 dsp=sin(arg);
cannam@86 285 ipph=(ip+1)>>1;
cannam@86 286 ipp2=ip;
cannam@86 287 idp2=ido;
cannam@86 288 nbd=(ido-1)>>1;
cannam@86 289 t0=l1*ido;
cannam@86 290 t10=ip*ido;
cannam@86 291
cannam@86 292 if(ido==1)goto L119;
cannam@86 293 for(ik=0;ik<idl1;ik++)ch2[ik]=c2[ik];
cannam@86 294
cannam@86 295 t1=0;
cannam@86 296 for(j=1;j<ip;j++){
cannam@86 297 t1+=t0;
cannam@86 298 t2=t1;
cannam@86 299 for(k=0;k<l1;k++){
cannam@86 300 ch[t2]=c1[t2];
cannam@86 301 t2+=ido;
cannam@86 302 }
cannam@86 303 }
cannam@86 304
cannam@86 305 is=-ido;
cannam@86 306 t1=0;
cannam@86 307 if(nbd>l1){
cannam@86 308 for(j=1;j<ip;j++){
cannam@86 309 t1+=t0;
cannam@86 310 is+=ido;
cannam@86 311 t2= -ido+t1;
cannam@86 312 for(k=0;k<l1;k++){
cannam@86 313 idij=is-1;
cannam@86 314 t2+=ido;
cannam@86 315 t3=t2;
cannam@86 316 for(i=2;i<ido;i+=2){
cannam@86 317 idij+=2;
cannam@86 318 t3+=2;
cannam@86 319 ch[t3-1]=wa[idij-1]*c1[t3-1]+wa[idij]*c1[t3];
cannam@86 320 ch[t3]=wa[idij-1]*c1[t3]-wa[idij]*c1[t3-1];
cannam@86 321 }
cannam@86 322 }
cannam@86 323 }
cannam@86 324 }else{
cannam@86 325
cannam@86 326 for(j=1;j<ip;j++){
cannam@86 327 is+=ido;
cannam@86 328 idij=is-1;
cannam@86 329 t1+=t0;
cannam@86 330 t2=t1;
cannam@86 331 for(i=2;i<ido;i+=2){
cannam@86 332 idij+=2;
cannam@86 333 t2+=2;
cannam@86 334 t3=t2;
cannam@86 335 for(k=0;k<l1;k++){
cannam@86 336 ch[t3-1]=wa[idij-1]*c1[t3-1]+wa[idij]*c1[t3];
cannam@86 337 ch[t3]=wa[idij-1]*c1[t3]-wa[idij]*c1[t3-1];
cannam@86 338 t3+=ido;
cannam@86 339 }
cannam@86 340 }
cannam@86 341 }
cannam@86 342 }
cannam@86 343
cannam@86 344 t1=0;
cannam@86 345 t2=ipp2*t0;
cannam@86 346 if(nbd<l1){
cannam@86 347 for(j=1;j<ipph;j++){
cannam@86 348 t1+=t0;
cannam@86 349 t2-=t0;
cannam@86 350 t3=t1;
cannam@86 351 t4=t2;
cannam@86 352 for(i=2;i<ido;i+=2){
cannam@86 353 t3+=2;
cannam@86 354 t4+=2;
cannam@86 355 t5=t3-ido;
cannam@86 356 t6=t4-ido;
cannam@86 357 for(k=0;k<l1;k++){
cannam@86 358 t5+=ido;
cannam@86 359 t6+=ido;
cannam@86 360 c1[t5-1]=ch[t5-1]+ch[t6-1];
cannam@86 361 c1[t6-1]=ch[t5]-ch[t6];
cannam@86 362 c1[t5]=ch[t5]+ch[t6];
cannam@86 363 c1[t6]=ch[t6-1]-ch[t5-1];
cannam@86 364 }
cannam@86 365 }
cannam@86 366 }
cannam@86 367 }else{
cannam@86 368 for(j=1;j<ipph;j++){
cannam@86 369 t1+=t0;
cannam@86 370 t2-=t0;
cannam@86 371 t3=t1;
cannam@86 372 t4=t2;
cannam@86 373 for(k=0;k<l1;k++){
cannam@86 374 t5=t3;
cannam@86 375 t6=t4;
cannam@86 376 for(i=2;i<ido;i+=2){
cannam@86 377 t5+=2;
cannam@86 378 t6+=2;
cannam@86 379 c1[t5-1]=ch[t5-1]+ch[t6-1];
cannam@86 380 c1[t6-1]=ch[t5]-ch[t6];
cannam@86 381 c1[t5]=ch[t5]+ch[t6];
cannam@86 382 c1[t6]=ch[t6-1]-ch[t5-1];
cannam@86 383 }
cannam@86 384 t3+=ido;
cannam@86 385 t4+=ido;
cannam@86 386 }
cannam@86 387 }
cannam@86 388 }
cannam@86 389
cannam@86 390 L119:
cannam@86 391 for(ik=0;ik<idl1;ik++)c2[ik]=ch2[ik];
cannam@86 392
cannam@86 393 t1=0;
cannam@86 394 t2=ipp2*idl1;
cannam@86 395 for(j=1;j<ipph;j++){
cannam@86 396 t1+=t0;
cannam@86 397 t2-=t0;
cannam@86 398 t3=t1-ido;
cannam@86 399 t4=t2-ido;
cannam@86 400 for(k=0;k<l1;k++){
cannam@86 401 t3+=ido;
cannam@86 402 t4+=ido;
cannam@86 403 c1[t3]=ch[t3]+ch[t4];
cannam@86 404 c1[t4]=ch[t4]-ch[t3];
cannam@86 405 }
cannam@86 406 }
cannam@86 407
cannam@86 408 ar1=1.f;
cannam@86 409 ai1=0.f;
cannam@86 410 t1=0;
cannam@86 411 t2=ipp2*idl1;
cannam@86 412 t3=(ip-1)*idl1;
cannam@86 413 for(l=1;l<ipph;l++){
cannam@86 414 t1+=idl1;
cannam@86 415 t2-=idl1;
cannam@86 416 ar1h=dcp*ar1-dsp*ai1;
cannam@86 417 ai1=dcp*ai1+dsp*ar1;
cannam@86 418 ar1=ar1h;
cannam@86 419 t4=t1;
cannam@86 420 t5=t2;
cannam@86 421 t6=t3;
cannam@86 422 t7=idl1;
cannam@86 423
cannam@86 424 for(ik=0;ik<idl1;ik++){
cannam@86 425 ch2[t4++]=c2[ik]+ar1*c2[t7++];
cannam@86 426 ch2[t5++]=ai1*c2[t6++];
cannam@86 427 }
cannam@86 428
cannam@86 429 dc2=ar1;
cannam@86 430 ds2=ai1;
cannam@86 431 ar2=ar1;
cannam@86 432 ai2=ai1;
cannam@86 433
cannam@86 434 t4=idl1;
cannam@86 435 t5=(ipp2-1)*idl1;
cannam@86 436 for(j=2;j<ipph;j++){
cannam@86 437 t4+=idl1;
cannam@86 438 t5-=idl1;
cannam@86 439
cannam@86 440 ar2h=dc2*ar2-ds2*ai2;
cannam@86 441 ai2=dc2*ai2+ds2*ar2;
cannam@86 442 ar2=ar2h;
cannam@86 443
cannam@86 444 t6=t1;
cannam@86 445 t7=t2;
cannam@86 446 t8=t4;
cannam@86 447 t9=t5;
cannam@86 448 for(ik=0;ik<idl1;ik++){
cannam@86 449 ch2[t6++]+=ar2*c2[t8++];
cannam@86 450 ch2[t7++]+=ai2*c2[t9++];
cannam@86 451 }
cannam@86 452 }
cannam@86 453 }
cannam@86 454
cannam@86 455 t1=0;
cannam@86 456 for(j=1;j<ipph;j++){
cannam@86 457 t1+=idl1;
cannam@86 458 t2=t1;
cannam@86 459 for(ik=0;ik<idl1;ik++)ch2[ik]+=c2[t2++];
cannam@86 460 }
cannam@86 461
cannam@86 462 if(ido<l1)goto L132;
cannam@86 463
cannam@86 464 t1=0;
cannam@86 465 t2=0;
cannam@86 466 for(k=0;k<l1;k++){
cannam@86 467 t3=t1;
cannam@86 468 t4=t2;
cannam@86 469 for(i=0;i<ido;i++)cc[t4++]=ch[t3++];
cannam@86 470 t1+=ido;
cannam@86 471 t2+=t10;
cannam@86 472 }
cannam@86 473
cannam@86 474 goto L135;
cannam@86 475
cannam@86 476 L132:
cannam@86 477 for(i=0;i<ido;i++){
cannam@86 478 t1=i;
cannam@86 479 t2=i;
cannam@86 480 for(k=0;k<l1;k++){
cannam@86 481 cc[t2]=ch[t1];
cannam@86 482 t1+=ido;
cannam@86 483 t2+=t10;
cannam@86 484 }
cannam@86 485 }
cannam@86 486
cannam@86 487 L135:
cannam@86 488 t1=0;
cannam@86 489 t2=ido<<1;
cannam@86 490 t3=0;
cannam@86 491 t4=ipp2*t0;
cannam@86 492 for(j=1;j<ipph;j++){
cannam@86 493
cannam@86 494 t1+=t2;
cannam@86 495 t3+=t0;
cannam@86 496 t4-=t0;
cannam@86 497
cannam@86 498 t5=t1;
cannam@86 499 t6=t3;
cannam@86 500 t7=t4;
cannam@86 501
cannam@86 502 for(k=0;k<l1;k++){
cannam@86 503 cc[t5-1]=ch[t6];
cannam@86 504 cc[t5]=ch[t7];
cannam@86 505 t5+=t10;
cannam@86 506 t6+=ido;
cannam@86 507 t7+=ido;
cannam@86 508 }
cannam@86 509 }
cannam@86 510
cannam@86 511 if(ido==1)return;
cannam@86 512 if(nbd<l1)goto L141;
cannam@86 513
cannam@86 514 t1=-ido;
cannam@86 515 t3=0;
cannam@86 516 t4=0;
cannam@86 517 t5=ipp2*t0;
cannam@86 518 for(j=1;j<ipph;j++){
cannam@86 519 t1+=t2;
cannam@86 520 t3+=t2;
cannam@86 521 t4+=t0;
cannam@86 522 t5-=t0;
cannam@86 523 t6=t1;
cannam@86 524 t7=t3;
cannam@86 525 t8=t4;
cannam@86 526 t9=t5;
cannam@86 527 for(k=0;k<l1;k++){
cannam@86 528 for(i=2;i<ido;i+=2){
cannam@86 529 ic=idp2-i;
cannam@86 530 cc[i+t7-1]=ch[i+t8-1]+ch[i+t9-1];
cannam@86 531 cc[ic+t6-1]=ch[i+t8-1]-ch[i+t9-1];
cannam@86 532 cc[i+t7]=ch[i+t8]+ch[i+t9];
cannam@86 533 cc[ic+t6]=ch[i+t9]-ch[i+t8];
cannam@86 534 }
cannam@86 535 t6+=t10;
cannam@86 536 t7+=t10;
cannam@86 537 t8+=ido;
cannam@86 538 t9+=ido;
cannam@86 539 }
cannam@86 540 }
cannam@86 541 return;
cannam@86 542
cannam@86 543 L141:
cannam@86 544
cannam@86 545 t1=-ido;
cannam@86 546 t3=0;
cannam@86 547 t4=0;
cannam@86 548 t5=ipp2*t0;
cannam@86 549 for(j=1;j<ipph;j++){
cannam@86 550 t1+=t2;
cannam@86 551 t3+=t2;
cannam@86 552 t4+=t0;
cannam@86 553 t5-=t0;
cannam@86 554 for(i=2;i<ido;i+=2){
cannam@86 555 t6=idp2+t1-i;
cannam@86 556 t7=i+t3;
cannam@86 557 t8=i+t4;
cannam@86 558 t9=i+t5;
cannam@86 559 for(k=0;k<l1;k++){
cannam@86 560 cc[t7-1]=ch[t8-1]+ch[t9-1];
cannam@86 561 cc[t6-1]=ch[t8-1]-ch[t9-1];
cannam@86 562 cc[t7]=ch[t8]+ch[t9];
cannam@86 563 cc[t6]=ch[t9]-ch[t8];
cannam@86 564 t6+=t10;
cannam@86 565 t7+=t10;
cannam@86 566 t8+=ido;
cannam@86 567 t9+=ido;
cannam@86 568 }
cannam@86 569 }
cannam@86 570 }
cannam@86 571 }
cannam@86 572
cannam@86 573 static void drftf1(int n,float *c,float *ch,float *wa,int *ifac){
cannam@86 574 int i,k1,l1,l2;
cannam@86 575 int na,kh,nf;
cannam@86 576 int ip,iw,ido,idl1,ix2,ix3;
cannam@86 577
cannam@86 578 nf=ifac[1];
cannam@86 579 na=1;
cannam@86 580 l2=n;
cannam@86 581 iw=n;
cannam@86 582
cannam@86 583 for(k1=0;k1<nf;k1++){
cannam@86 584 kh=nf-k1;
cannam@86 585 ip=ifac[kh+1];
cannam@86 586 l1=l2/ip;
cannam@86 587 ido=n/l2;
cannam@86 588 idl1=ido*l1;
cannam@86 589 iw-=(ip-1)*ido;
cannam@86 590 na=1-na;
cannam@86 591
cannam@86 592 if(ip!=4)goto L102;
cannam@86 593
cannam@86 594 ix2=iw+ido;
cannam@86 595 ix3=ix2+ido;
cannam@86 596 if(na!=0)
cannam@86 597 dradf4(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1);
cannam@86 598 else
cannam@86 599 dradf4(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1);
cannam@86 600 goto L110;
cannam@86 601
cannam@86 602 L102:
cannam@86 603 if(ip!=2)goto L104;
cannam@86 604 if(na!=0)goto L103;
cannam@86 605
cannam@86 606 dradf2(ido,l1,c,ch,wa+iw-1);
cannam@86 607 goto L110;
cannam@86 608
cannam@86 609 L103:
cannam@86 610 dradf2(ido,l1,ch,c,wa+iw-1);
cannam@86 611 goto L110;
cannam@86 612
cannam@86 613 L104:
cannam@86 614 if(ido==1)na=1-na;
cannam@86 615 if(na!=0)goto L109;
cannam@86 616
cannam@86 617 dradfg(ido,ip,l1,idl1,c,c,c,ch,ch,wa+iw-1);
cannam@86 618 na=1;
cannam@86 619 goto L110;
cannam@86 620
cannam@86 621 L109:
cannam@86 622 dradfg(ido,ip,l1,idl1,ch,ch,ch,c,c,wa+iw-1);
cannam@86 623 na=0;
cannam@86 624
cannam@86 625 L110:
cannam@86 626 l2=l1;
cannam@86 627 }
cannam@86 628
cannam@86 629 if(na==1)return;
cannam@86 630
cannam@86 631 for(i=0;i<n;i++)c[i]=ch[i];
cannam@86 632 }
cannam@86 633
cannam@86 634 static void dradb2(int ido,int l1,float *cc,float *ch,float *wa1){
cannam@86 635 int i,k,t0,t1,t2,t3,t4,t5,t6;
cannam@86 636 float ti2,tr2;
cannam@86 637
cannam@86 638 t0=l1*ido;
cannam@86 639
cannam@86 640 t1=0;
cannam@86 641 t2=0;
cannam@86 642 t3=(ido<<1)-1;
cannam@86 643 for(k=0;k<l1;k++){
cannam@86 644 ch[t1]=cc[t2]+cc[t3+t2];
cannam@86 645 ch[t1+t0]=cc[t2]-cc[t3+t2];
cannam@86 646 t2=(t1+=ido)<<1;
cannam@86 647 }
cannam@86 648
cannam@86 649 if(ido<2)return;
cannam@86 650 if(ido==2)goto L105;
cannam@86 651
cannam@86 652 t1=0;
cannam@86 653 t2=0;
cannam@86 654 for(k=0;k<l1;k++){
cannam@86 655 t3=t1;
cannam@86 656 t5=(t4=t2)+(ido<<1);
cannam@86 657 t6=t0+t1;
cannam@86 658 for(i=2;i<ido;i+=2){
cannam@86 659 t3+=2;
cannam@86 660 t4+=2;
cannam@86 661 t5-=2;
cannam@86 662 t6+=2;
cannam@86 663 ch[t3-1]=cc[t4-1]+cc[t5-1];
cannam@86 664 tr2=cc[t4-1]-cc[t5-1];
cannam@86 665 ch[t3]=cc[t4]-cc[t5];
cannam@86 666 ti2=cc[t4]+cc[t5];
cannam@86 667 ch[t6-1]=wa1[i-2]*tr2-wa1[i-1]*ti2;
cannam@86 668 ch[t6]=wa1[i-2]*ti2+wa1[i-1]*tr2;
cannam@86 669 }
cannam@86 670 t2=(t1+=ido)<<1;
cannam@86 671 }
cannam@86 672
cannam@86 673 if(ido%2==1)return;
cannam@86 674
cannam@86 675 L105:
cannam@86 676 t1=ido-1;
cannam@86 677 t2=ido-1;
cannam@86 678 for(k=0;k<l1;k++){
cannam@86 679 ch[t1]=cc[t2]+cc[t2];
cannam@86 680 ch[t1+t0]=-(cc[t2+1]+cc[t2+1]);
cannam@86 681 t1+=ido;
cannam@86 682 t2+=ido<<1;
cannam@86 683 }
cannam@86 684 }
cannam@86 685
cannam@86 686 static void dradb3(int ido,int l1,float *cc,float *ch,float *wa1,
cannam@86 687 float *wa2){
cannam@86 688 static float taur = -.5f;
cannam@86 689 static float taui = .8660254037844386f;
cannam@86 690 int i,k,t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10;
cannam@86 691 float ci2,ci3,di2,di3,cr2,cr3,dr2,dr3,ti2,tr2;
cannam@86 692 t0=l1*ido;
cannam@86 693
cannam@86 694 t1=0;
cannam@86 695 t2=t0<<1;
cannam@86 696 t3=ido<<1;
cannam@86 697 t4=ido+(ido<<1);
cannam@86 698 t5=0;
cannam@86 699 for(k=0;k<l1;k++){
cannam@86 700 tr2=cc[t3-1]+cc[t3-1];
cannam@86 701 cr2=cc[t5]+(taur*tr2);
cannam@86 702 ch[t1]=cc[t5]+tr2;
cannam@86 703 ci3=taui*(cc[t3]+cc[t3]);
cannam@86 704 ch[t1+t0]=cr2-ci3;
cannam@86 705 ch[t1+t2]=cr2+ci3;
cannam@86 706 t1+=ido;
cannam@86 707 t3+=t4;
cannam@86 708 t5+=t4;
cannam@86 709 }
cannam@86 710
cannam@86 711 if(ido==1)return;
cannam@86 712
cannam@86 713 t1=0;
cannam@86 714 t3=ido<<1;
cannam@86 715 for(k=0;k<l1;k++){
cannam@86 716 t7=t1+(t1<<1);
cannam@86 717 t6=(t5=t7+t3);
cannam@86 718 t8=t1;
cannam@86 719 t10=(t9=t1+t0)+t0;
cannam@86 720
cannam@86 721 for(i=2;i<ido;i+=2){
cannam@86 722 t5+=2;
cannam@86 723 t6-=2;
cannam@86 724 t7+=2;
cannam@86 725 t8+=2;
cannam@86 726 t9+=2;
cannam@86 727 t10+=2;
cannam@86 728 tr2=cc[t5-1]+cc[t6-1];
cannam@86 729 cr2=cc[t7-1]+(taur*tr2);
cannam@86 730 ch[t8-1]=cc[t7-1]+tr2;
cannam@86 731 ti2=cc[t5]-cc[t6];
cannam@86 732 ci2=cc[t7]+(taur*ti2);
cannam@86 733 ch[t8]=cc[t7]+ti2;
cannam@86 734 cr3=taui*(cc[t5-1]-cc[t6-1]);
cannam@86 735 ci3=taui*(cc[t5]+cc[t6]);
cannam@86 736 dr2=cr2-ci3;
cannam@86 737 dr3=cr2+ci3;
cannam@86 738 di2=ci2+cr3;
cannam@86 739 di3=ci2-cr3;
cannam@86 740 ch[t9-1]=wa1[i-2]*dr2-wa1[i-1]*di2;
cannam@86 741 ch[t9]=wa1[i-2]*di2+wa1[i-1]*dr2;
cannam@86 742 ch[t10-1]=wa2[i-2]*dr3-wa2[i-1]*di3;
cannam@86 743 ch[t10]=wa2[i-2]*di3+wa2[i-1]*dr3;
cannam@86 744 }
cannam@86 745 t1+=ido;
cannam@86 746 }
cannam@86 747 }
cannam@86 748
cannam@86 749 static void dradb4(int ido,int l1,float *cc,float *ch,float *wa1,
cannam@86 750 float *wa2,float *wa3){
cannam@86 751 static float sqrt2=1.414213562373095f;
cannam@86 752 int i,k,t0,t1,t2,t3,t4,t5,t6,t7,t8;
cannam@86 753 float ci2,ci3,ci4,cr2,cr3,cr4,ti1,ti2,ti3,ti4,tr1,tr2,tr3,tr4;
cannam@86 754 t0=l1*ido;
cannam@86 755
cannam@86 756 t1=0;
cannam@86 757 t2=ido<<2;
cannam@86 758 t3=0;
cannam@86 759 t6=ido<<1;
cannam@86 760 for(k=0;k<l1;k++){
cannam@86 761 t4=t3+t6;
cannam@86 762 t5=t1;
cannam@86 763 tr3=cc[t4-1]+cc[t4-1];
cannam@86 764 tr4=cc[t4]+cc[t4];
cannam@86 765 tr1=cc[t3]-cc[(t4+=t6)-1];
cannam@86 766 tr2=cc[t3]+cc[t4-1];
cannam@86 767 ch[t5]=tr2+tr3;
cannam@86 768 ch[t5+=t0]=tr1-tr4;
cannam@86 769 ch[t5+=t0]=tr2-tr3;
cannam@86 770 ch[t5+=t0]=tr1+tr4;
cannam@86 771 t1+=ido;
cannam@86 772 t3+=t2;
cannam@86 773 }
cannam@86 774
cannam@86 775 if(ido<2)return;
cannam@86 776 if(ido==2)goto L105;
cannam@86 777
cannam@86 778 t1=0;
cannam@86 779 for(k=0;k<l1;k++){
cannam@86 780 t5=(t4=(t3=(t2=t1<<2)+t6))+t6;
cannam@86 781 t7=t1;
cannam@86 782 for(i=2;i<ido;i+=2){
cannam@86 783 t2+=2;
cannam@86 784 t3+=2;
cannam@86 785 t4-=2;
cannam@86 786 t5-=2;
cannam@86 787 t7+=2;
cannam@86 788 ti1=cc[t2]+cc[t5];
cannam@86 789 ti2=cc[t2]-cc[t5];
cannam@86 790 ti3=cc[t3]-cc[t4];
cannam@86 791 tr4=cc[t3]+cc[t4];
cannam@86 792 tr1=cc[t2-1]-cc[t5-1];
cannam@86 793 tr2=cc[t2-1]+cc[t5-1];
cannam@86 794 ti4=cc[t3-1]-cc[t4-1];
cannam@86 795 tr3=cc[t3-1]+cc[t4-1];
cannam@86 796 ch[t7-1]=tr2+tr3;
cannam@86 797 cr3=tr2-tr3;
cannam@86 798 ch[t7]=ti2+ti3;
cannam@86 799 ci3=ti2-ti3;
cannam@86 800 cr2=tr1-tr4;
cannam@86 801 cr4=tr1+tr4;
cannam@86 802 ci2=ti1+ti4;
cannam@86 803 ci4=ti1-ti4;
cannam@86 804
cannam@86 805 ch[(t8=t7+t0)-1]=wa1[i-2]*cr2-wa1[i-1]*ci2;
cannam@86 806 ch[t8]=wa1[i-2]*ci2+wa1[i-1]*cr2;
cannam@86 807 ch[(t8+=t0)-1]=wa2[i-2]*cr3-wa2[i-1]*ci3;
cannam@86 808 ch[t8]=wa2[i-2]*ci3+wa2[i-1]*cr3;
cannam@86 809 ch[(t8+=t0)-1]=wa3[i-2]*cr4-wa3[i-1]*ci4;
cannam@86 810 ch[t8]=wa3[i-2]*ci4+wa3[i-1]*cr4;
cannam@86 811 }
cannam@86 812 t1+=ido;
cannam@86 813 }
cannam@86 814
cannam@86 815 if(ido%2 == 1)return;
cannam@86 816
cannam@86 817 L105:
cannam@86 818
cannam@86 819 t1=ido;
cannam@86 820 t2=ido<<2;
cannam@86 821 t3=ido-1;
cannam@86 822 t4=ido+(ido<<1);
cannam@86 823 for(k=0;k<l1;k++){
cannam@86 824 t5=t3;
cannam@86 825 ti1=cc[t1]+cc[t4];
cannam@86 826 ti2=cc[t4]-cc[t1];
cannam@86 827 tr1=cc[t1-1]-cc[t4-1];
cannam@86 828 tr2=cc[t1-1]+cc[t4-1];
cannam@86 829 ch[t5]=tr2+tr2;
cannam@86 830 ch[t5+=t0]=sqrt2*(tr1-ti1);
cannam@86 831 ch[t5+=t0]=ti2+ti2;
cannam@86 832 ch[t5+=t0]=-sqrt2*(tr1+ti1);
cannam@86 833
cannam@86 834 t3+=ido;
cannam@86 835 t1+=t2;
cannam@86 836 t4+=t2;
cannam@86 837 }
cannam@86 838 }
cannam@86 839
cannam@86 840 static void dradbg(int ido,int ip,int l1,int idl1,float *cc,float *c1,
cannam@86 841 float *c2,float *ch,float *ch2,float *wa){
cannam@86 842 static float tpi=6.283185307179586f;
cannam@86 843 int idij,ipph,i,j,k,l,ik,is,t0,t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,
cannam@86 844 t11,t12;
cannam@86 845 float dc2,ai1,ai2,ar1,ar2,ds2;
cannam@86 846 int nbd;
cannam@86 847 float dcp,arg,dsp,ar1h,ar2h;
cannam@86 848 int ipp2;
cannam@86 849
cannam@86 850 t10=ip*ido;
cannam@86 851 t0=l1*ido;
cannam@86 852 arg=tpi/(float)ip;
cannam@86 853 dcp=cos(arg);
cannam@86 854 dsp=sin(arg);
cannam@86 855 nbd=(ido-1)>>1;
cannam@86 856 ipp2=ip;
cannam@86 857 ipph=(ip+1)>>1;
cannam@86 858 if(ido<l1)goto L103;
cannam@86 859
cannam@86 860 t1=0;
cannam@86 861 t2=0;
cannam@86 862 for(k=0;k<l1;k++){
cannam@86 863 t3=t1;
cannam@86 864 t4=t2;
cannam@86 865 for(i=0;i<ido;i++){
cannam@86 866 ch[t3]=cc[t4];
cannam@86 867 t3++;
cannam@86 868 t4++;
cannam@86 869 }
cannam@86 870 t1+=ido;
cannam@86 871 t2+=t10;
cannam@86 872 }
cannam@86 873 goto L106;
cannam@86 874
cannam@86 875 L103:
cannam@86 876 t1=0;
cannam@86 877 for(i=0;i<ido;i++){
cannam@86 878 t2=t1;
cannam@86 879 t3=t1;
cannam@86 880 for(k=0;k<l1;k++){
cannam@86 881 ch[t2]=cc[t3];
cannam@86 882 t2+=ido;
cannam@86 883 t3+=t10;
cannam@86 884 }
cannam@86 885 t1++;
cannam@86 886 }
cannam@86 887
cannam@86 888 L106:
cannam@86 889 t1=0;
cannam@86 890 t2=ipp2*t0;
cannam@86 891 t7=(t5=ido<<1);
cannam@86 892 for(j=1;j<ipph;j++){
cannam@86 893 t1+=t0;
cannam@86 894 t2-=t0;
cannam@86 895 t3=t1;
cannam@86 896 t4=t2;
cannam@86 897 t6=t5;
cannam@86 898 for(k=0;k<l1;k++){
cannam@86 899 ch[t3]=cc[t6-1]+cc[t6-1];
cannam@86 900 ch[t4]=cc[t6]+cc[t6];
cannam@86 901 t3+=ido;
cannam@86 902 t4+=ido;
cannam@86 903 t6+=t10;
cannam@86 904 }
cannam@86 905 t5+=t7;
cannam@86 906 }
cannam@86 907
cannam@86 908 if (ido == 1)goto L116;
cannam@86 909 if(nbd<l1)goto L112;
cannam@86 910
cannam@86 911 t1=0;
cannam@86 912 t2=ipp2*t0;
cannam@86 913 t7=0;
cannam@86 914 for(j=1;j<ipph;j++){
cannam@86 915 t1+=t0;
cannam@86 916 t2-=t0;
cannam@86 917 t3=t1;
cannam@86 918 t4=t2;
cannam@86 919
cannam@86 920 t7+=(ido<<1);
cannam@86 921 t8=t7;
cannam@86 922 for(k=0;k<l1;k++){
cannam@86 923 t5=t3;
cannam@86 924 t6=t4;
cannam@86 925 t9=t8;
cannam@86 926 t11=t8;
cannam@86 927 for(i=2;i<ido;i+=2){
cannam@86 928 t5+=2;
cannam@86 929 t6+=2;
cannam@86 930 t9+=2;
cannam@86 931 t11-=2;
cannam@86 932 ch[t5-1]=cc[t9-1]+cc[t11-1];
cannam@86 933 ch[t6-1]=cc[t9-1]-cc[t11-1];
cannam@86 934 ch[t5]=cc[t9]-cc[t11];
cannam@86 935 ch[t6]=cc[t9]+cc[t11];
cannam@86 936 }
cannam@86 937 t3+=ido;
cannam@86 938 t4+=ido;
cannam@86 939 t8+=t10;
cannam@86 940 }
cannam@86 941 }
cannam@86 942 goto L116;
cannam@86 943
cannam@86 944 L112:
cannam@86 945 t1=0;
cannam@86 946 t2=ipp2*t0;
cannam@86 947 t7=0;
cannam@86 948 for(j=1;j<ipph;j++){
cannam@86 949 t1+=t0;
cannam@86 950 t2-=t0;
cannam@86 951 t3=t1;
cannam@86 952 t4=t2;
cannam@86 953 t7+=(ido<<1);
cannam@86 954 t8=t7;
cannam@86 955 t9=t7;
cannam@86 956 for(i=2;i<ido;i+=2){
cannam@86 957 t3+=2;
cannam@86 958 t4+=2;
cannam@86 959 t8+=2;
cannam@86 960 t9-=2;
cannam@86 961 t5=t3;
cannam@86 962 t6=t4;
cannam@86 963 t11=t8;
cannam@86 964 t12=t9;
cannam@86 965 for(k=0;k<l1;k++){
cannam@86 966 ch[t5-1]=cc[t11-1]+cc[t12-1];
cannam@86 967 ch[t6-1]=cc[t11-1]-cc[t12-1];
cannam@86 968 ch[t5]=cc[t11]-cc[t12];
cannam@86 969 ch[t6]=cc[t11]+cc[t12];
cannam@86 970 t5+=ido;
cannam@86 971 t6+=ido;
cannam@86 972 t11+=t10;
cannam@86 973 t12+=t10;
cannam@86 974 }
cannam@86 975 }
cannam@86 976 }
cannam@86 977
cannam@86 978 L116:
cannam@86 979 ar1=1.f;
cannam@86 980 ai1=0.f;
cannam@86 981 t1=0;
cannam@86 982 t9=(t2=ipp2*idl1);
cannam@86 983 t3=(ip-1)*idl1;
cannam@86 984 for(l=1;l<ipph;l++){
cannam@86 985 t1+=idl1;
cannam@86 986 t2-=idl1;
cannam@86 987
cannam@86 988 ar1h=dcp*ar1-dsp*ai1;
cannam@86 989 ai1=dcp*ai1+dsp*ar1;
cannam@86 990 ar1=ar1h;
cannam@86 991 t4=t1;
cannam@86 992 t5=t2;
cannam@86 993 t6=0;
cannam@86 994 t7=idl1;
cannam@86 995 t8=t3;
cannam@86 996 for(ik=0;ik<idl1;ik++){
cannam@86 997 c2[t4++]=ch2[t6++]+ar1*ch2[t7++];
cannam@86 998 c2[t5++]=ai1*ch2[t8++];
cannam@86 999 }
cannam@86 1000 dc2=ar1;
cannam@86 1001 ds2=ai1;
cannam@86 1002 ar2=ar1;
cannam@86 1003 ai2=ai1;
cannam@86 1004
cannam@86 1005 t6=idl1;
cannam@86 1006 t7=t9-idl1;
cannam@86 1007 for(j=2;j<ipph;j++){
cannam@86 1008 t6+=idl1;
cannam@86 1009 t7-=idl1;
cannam@86 1010 ar2h=dc2*ar2-ds2*ai2;
cannam@86 1011 ai2=dc2*ai2+ds2*ar2;
cannam@86 1012 ar2=ar2h;
cannam@86 1013 t4=t1;
cannam@86 1014 t5=t2;
cannam@86 1015 t11=t6;
cannam@86 1016 t12=t7;
cannam@86 1017 for(ik=0;ik<idl1;ik++){
cannam@86 1018 c2[t4++]+=ar2*ch2[t11++];
cannam@86 1019 c2[t5++]+=ai2*ch2[t12++];
cannam@86 1020 }
cannam@86 1021 }
cannam@86 1022 }
cannam@86 1023
cannam@86 1024 t1=0;
cannam@86 1025 for(j=1;j<ipph;j++){
cannam@86 1026 t1+=idl1;
cannam@86 1027 t2=t1;
cannam@86 1028 for(ik=0;ik<idl1;ik++)ch2[ik]+=ch2[t2++];
cannam@86 1029 }
cannam@86 1030
cannam@86 1031 t1=0;
cannam@86 1032 t2=ipp2*t0;
cannam@86 1033 for(j=1;j<ipph;j++){
cannam@86 1034 t1+=t0;
cannam@86 1035 t2-=t0;
cannam@86 1036 t3=t1;
cannam@86 1037 t4=t2;
cannam@86 1038 for(k=0;k<l1;k++){
cannam@86 1039 ch[t3]=c1[t3]-c1[t4];
cannam@86 1040 ch[t4]=c1[t3]+c1[t4];
cannam@86 1041 t3+=ido;
cannam@86 1042 t4+=ido;
cannam@86 1043 }
cannam@86 1044 }
cannam@86 1045
cannam@86 1046 if(ido==1)goto L132;
cannam@86 1047 if(nbd<l1)goto L128;
cannam@86 1048
cannam@86 1049 t1=0;
cannam@86 1050 t2=ipp2*t0;
cannam@86 1051 for(j=1;j<ipph;j++){
cannam@86 1052 t1+=t0;
cannam@86 1053 t2-=t0;
cannam@86 1054 t3=t1;
cannam@86 1055 t4=t2;
cannam@86 1056 for(k=0;k<l1;k++){
cannam@86 1057 t5=t3;
cannam@86 1058 t6=t4;
cannam@86 1059 for(i=2;i<ido;i+=2){
cannam@86 1060 t5+=2;
cannam@86 1061 t6+=2;
cannam@86 1062 ch[t5-1]=c1[t5-1]-c1[t6];
cannam@86 1063 ch[t6-1]=c1[t5-1]+c1[t6];
cannam@86 1064 ch[t5]=c1[t5]+c1[t6-1];
cannam@86 1065 ch[t6]=c1[t5]-c1[t6-1];
cannam@86 1066 }
cannam@86 1067 t3+=ido;
cannam@86 1068 t4+=ido;
cannam@86 1069 }
cannam@86 1070 }
cannam@86 1071 goto L132;
cannam@86 1072
cannam@86 1073 L128:
cannam@86 1074 t1=0;
cannam@86 1075 t2=ipp2*t0;
cannam@86 1076 for(j=1;j<ipph;j++){
cannam@86 1077 t1+=t0;
cannam@86 1078 t2-=t0;
cannam@86 1079 t3=t1;
cannam@86 1080 t4=t2;
cannam@86 1081 for(i=2;i<ido;i+=2){
cannam@86 1082 t3+=2;
cannam@86 1083 t4+=2;
cannam@86 1084 t5=t3;
cannam@86 1085 t6=t4;
cannam@86 1086 for(k=0;k<l1;k++){
cannam@86 1087 ch[t5-1]=c1[t5-1]-c1[t6];
cannam@86 1088 ch[t6-1]=c1[t5-1]+c1[t6];
cannam@86 1089 ch[t5]=c1[t5]+c1[t6-1];
cannam@86 1090 ch[t6]=c1[t5]-c1[t6-1];
cannam@86 1091 t5+=ido;
cannam@86 1092 t6+=ido;
cannam@86 1093 }
cannam@86 1094 }
cannam@86 1095 }
cannam@86 1096
cannam@86 1097 L132:
cannam@86 1098 if(ido==1)return;
cannam@86 1099
cannam@86 1100 for(ik=0;ik<idl1;ik++)c2[ik]=ch2[ik];
cannam@86 1101
cannam@86 1102 t1=0;
cannam@86 1103 for(j=1;j<ip;j++){
cannam@86 1104 t2=(t1+=t0);
cannam@86 1105 for(k=0;k<l1;k++){
cannam@86 1106 c1[t2]=ch[t2];
cannam@86 1107 t2+=ido;
cannam@86 1108 }
cannam@86 1109 }
cannam@86 1110
cannam@86 1111 if(nbd>l1)goto L139;
cannam@86 1112
cannam@86 1113 is= -ido-1;
cannam@86 1114 t1=0;
cannam@86 1115 for(j=1;j<ip;j++){
cannam@86 1116 is+=ido;
cannam@86 1117 t1+=t0;
cannam@86 1118 idij=is;
cannam@86 1119 t2=t1;
cannam@86 1120 for(i=2;i<ido;i+=2){
cannam@86 1121 t2+=2;
cannam@86 1122 idij+=2;
cannam@86 1123 t3=t2;
cannam@86 1124 for(k=0;k<l1;k++){
cannam@86 1125 c1[t3-1]=wa[idij-1]*ch[t3-1]-wa[idij]*ch[t3];
cannam@86 1126 c1[t3]=wa[idij-1]*ch[t3]+wa[idij]*ch[t3-1];
cannam@86 1127 t3+=ido;
cannam@86 1128 }
cannam@86 1129 }
cannam@86 1130 }
cannam@86 1131 return;
cannam@86 1132
cannam@86 1133 L139:
cannam@86 1134 is= -ido-1;
cannam@86 1135 t1=0;
cannam@86 1136 for(j=1;j<ip;j++){
cannam@86 1137 is+=ido;
cannam@86 1138 t1+=t0;
cannam@86 1139 t2=t1;
cannam@86 1140 for(k=0;k<l1;k++){
cannam@86 1141 idij=is;
cannam@86 1142 t3=t2;
cannam@86 1143 for(i=2;i<ido;i+=2){
cannam@86 1144 idij+=2;
cannam@86 1145 t3+=2;
cannam@86 1146 c1[t3-1]=wa[idij-1]*ch[t3-1]-wa[idij]*ch[t3];
cannam@86 1147 c1[t3]=wa[idij-1]*ch[t3]+wa[idij]*ch[t3-1];
cannam@86 1148 }
cannam@86 1149 t2+=ido;
cannam@86 1150 }
cannam@86 1151 }
cannam@86 1152 }
cannam@86 1153
cannam@86 1154 static void drftb1(int n, float *c, float *ch, float *wa, int *ifac){
cannam@86 1155 int i,k1,l1,l2;
cannam@86 1156 int na;
cannam@86 1157 int nf,ip,iw,ix2,ix3,ido,idl1;
cannam@86 1158
cannam@86 1159 nf=ifac[1];
cannam@86 1160 na=0;
cannam@86 1161 l1=1;
cannam@86 1162 iw=1;
cannam@86 1163
cannam@86 1164 for(k1=0;k1<nf;k1++){
cannam@86 1165 ip=ifac[k1 + 2];
cannam@86 1166 l2=ip*l1;
cannam@86 1167 ido=n/l2;
cannam@86 1168 idl1=ido*l1;
cannam@86 1169 if(ip!=4)goto L103;
cannam@86 1170 ix2=iw+ido;
cannam@86 1171 ix3=ix2+ido;
cannam@86 1172
cannam@86 1173 if(na!=0)
cannam@86 1174 dradb4(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1);
cannam@86 1175 else
cannam@86 1176 dradb4(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1);
cannam@86 1177 na=1-na;
cannam@86 1178 goto L115;
cannam@86 1179
cannam@86 1180 L103:
cannam@86 1181 if(ip!=2)goto L106;
cannam@86 1182
cannam@86 1183 if(na!=0)
cannam@86 1184 dradb2(ido,l1,ch,c,wa+iw-1);
cannam@86 1185 else
cannam@86 1186 dradb2(ido,l1,c,ch,wa+iw-1);
cannam@86 1187 na=1-na;
cannam@86 1188 goto L115;
cannam@86 1189
cannam@86 1190 L106:
cannam@86 1191 if(ip!=3)goto L109;
cannam@86 1192
cannam@86 1193 ix2=iw+ido;
cannam@86 1194 if(na!=0)
cannam@86 1195 dradb3(ido,l1,ch,c,wa+iw-1,wa+ix2-1);
cannam@86 1196 else
cannam@86 1197 dradb3(ido,l1,c,ch,wa+iw-1,wa+ix2-1);
cannam@86 1198 na=1-na;
cannam@86 1199 goto L115;
cannam@86 1200
cannam@86 1201 L109:
cannam@86 1202 /* The radix five case can be translated later..... */
cannam@86 1203 /* if(ip!=5)goto L112;
cannam@86 1204
cannam@86 1205 ix2=iw+ido;
cannam@86 1206 ix3=ix2+ido;
cannam@86 1207 ix4=ix3+ido;
cannam@86 1208 if(na!=0)
cannam@86 1209 dradb5(ido,l1,ch,c,wa+iw-1,wa+ix2-1,wa+ix3-1,wa+ix4-1);
cannam@86 1210 else
cannam@86 1211 dradb5(ido,l1,c,ch,wa+iw-1,wa+ix2-1,wa+ix3-1,wa+ix4-1);
cannam@86 1212 na=1-na;
cannam@86 1213 goto L115;
cannam@86 1214
cannam@86 1215 L112:*/
cannam@86 1216 if(na!=0)
cannam@86 1217 dradbg(ido,ip,l1,idl1,ch,ch,ch,c,c,wa+iw-1);
cannam@86 1218 else
cannam@86 1219 dradbg(ido,ip,l1,idl1,c,c,c,ch,ch,wa+iw-1);
cannam@86 1220 if(ido==1)na=1-na;
cannam@86 1221
cannam@86 1222 L115:
cannam@86 1223 l1=l2;
cannam@86 1224 iw+=(ip-1)*ido;
cannam@86 1225 }
cannam@86 1226
cannam@86 1227 if(na==0)return;
cannam@86 1228
cannam@86 1229 for(i=0;i<n;i++)c[i]=ch[i];
cannam@86 1230 }
cannam@86 1231
cannam@86 1232 void drft_forward(drft_lookup *l,float *data){
cannam@86 1233 if(l->n==1)return;
cannam@86 1234 drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache);
cannam@86 1235 }
cannam@86 1236
cannam@86 1237 void drft_backward(drft_lookup *l,float *data){
cannam@86 1238 if (l->n==1)return;
cannam@86 1239 drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache);
cannam@86 1240 }
cannam@86 1241
cannam@86 1242 void drft_init(drft_lookup *l,int n){
cannam@86 1243 l->n=n;
cannam@86 1244 l->trigcache=_ogg_calloc(3*n,sizeof(*l->trigcache));
cannam@86 1245 l->splitcache=_ogg_calloc(32,sizeof(*l->splitcache));
cannam@86 1246 fdrffti(n, l->trigcache, l->splitcache);
cannam@86 1247 }
cannam@86 1248
cannam@86 1249 void drft_clear(drft_lookup *l){
cannam@86 1250 if(l){
cannam@86 1251 if(l->trigcache)_ogg_free(l->trigcache);
cannam@86 1252 if(l->splitcache)_ogg_free(l->splitcache);
cannam@86 1253 memset(l,0,sizeof(*l));
cannam@86 1254 }
cannam@86 1255 }