smallft.c 22 KB

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