annotate src/libvorbis-1.3.3/lib/smallft.c @ 36:55ece8862b6d

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