annotate src/libvorbis-1.3.3/lib/smallft.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +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 }