smallft.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260
  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-2001 *
  9. * by the XIPHOPHORUS Company http://www.xiph.org/ *
  10. * *
  11. ********************************************************************
  12. function: *unnormalized* fft transform
  13. last mod: $Id: smallft.c,v 1.19 2003/10/08 05:12:37 jm Exp $
  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. #ifdef HAVE_CONFIG_H
  28. #include "config.h"
  29. #endif
  30. #include <math.h>
  31. #include "smallft.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 spx_drft_forward(struct 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 spx_drft_backward(struct 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 spx_drft_init(struct drft_lookup *l,int n)
  1097. {
  1098. l->n=n;
  1099. l->trigcache=(float*)speex_alloc(3*n*sizeof(*l->trigcache));
  1100. l->splitcache=(int*)speex_alloc(32*sizeof(*l->splitcache));
  1101. fdrffti(n, l->trigcache, l->splitcache);
  1102. }
  1103. void spx_drft_clear(struct drft_lookup *l)
  1104. {
  1105. if(l)
  1106. {
  1107. if(l->trigcache)
  1108. speex_free(l->trigcache);
  1109. if(l->splitcache)
  1110. speex_free(l->splitcache);
  1111. }
  1112. }
粤ICP备19079148号