fft.cpp 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653
  1. //-----------------------------------------------------------------------------
  2. // Copyright 2012 Masanori Morise
  3. // Author: mmorise [at] yamanashi.ac.jp (Masanori Morise)
  4. // Last update: 2018/01/21
  5. //
  6. // This file represents the functions about FFT (Fast Fourier Transform)
  7. // implemented by Mr. Ooura, and wrapper functions implemented by M. Morise.
  8. // We can use these wrapper functions as well as the FFTW functions.
  9. // Please see the FFTW web-page to show the usage of the wrapper functions.
  10. // Ooura FFT:
  11. // (Japanese) http://www.kurims.kyoto-u.ac.jp/~ooura/index-j.html
  12. // (English) http://www.kurims.kyoto-u.ac.jp/~ooura/index.html
  13. // FFTW:
  14. // (English) http://www.fftw.org/
  15. // 2012/08/24 by M. Morise
  16. //-----------------------------------------------------------------------------
  17. #include "world/fft.h"
  18. #include <math.h>
  19. #include <stdlib.h>
  20. void cdft(int n, int isgn, double *a, int *ip, double *w);
  21. void rdft(int n, int isgn, double *a, int *ip, double *w);
  22. namespace {
  23. static void BackwardFFT(fft_plan p) {
  24. if (p.c_out == NULL) { // c2r
  25. p.input[0] = p.c_in[0][0];
  26. p.input[1] = p.c_in[p.n / 2][0];
  27. for (int i = 1; i < p.n / 2; ++i) {
  28. p.input[i * 2] = p.c_in[i][0];
  29. p.input[i * 2 + 1] = -p.c_in[i][1];
  30. }
  31. rdft(p.n, -1, p.input, p.ip, p.w);
  32. for (int i = 0; i < p.n; ++i) p.out[i] = p.input[i] * 2.0;
  33. } else { // c2c
  34. for (int i = 0; i < p.n; ++i) {
  35. p.input[i * 2] = p.c_in[i][0];
  36. p.input[i * 2 + 1] = p.c_in[i][1];
  37. }
  38. cdft(p.n * 2, -1, p.input, p.ip, p.w);
  39. for (int i = 0; i < p.n; ++i) {
  40. p.c_out[i][0] = p.input[i * 2];
  41. p.c_out[i][1] = -p.input[i * 2 + 1];
  42. }
  43. }
  44. }
  45. static void ForwardFFT(fft_plan p) {
  46. if (p.c_in == NULL) { // r2c
  47. for (int i = 0; i < p.n; ++i) p.input[i] = p.in[i];
  48. rdft(p.n, 1, p.input, p.ip, p.w);
  49. p.c_out[0][0] = p.input[0];
  50. p.c_out[0][1] = 0.0;
  51. for (int i = 1; i < p.n / 2; ++i) {
  52. p.c_out[i][0] = p.input[i * 2];
  53. p.c_out[i][1] = -p.input[i * 2 + 1];
  54. }
  55. p.c_out[p.n / 2][0] = p.input[1];
  56. p.c_out[p.n / 2][1] = 0.0;
  57. } else { // c2c
  58. for (int i = 0; i < p.n; ++i) {
  59. p.input[i * 2] = p.c_in[i][0];
  60. p.input[i * 2 + 1] = p.c_in[i][1];
  61. }
  62. cdft(p.n * 2, 1, p.input, p.ip, p.w);
  63. for (int i = 0; i < p.n; ++i) {
  64. p.c_out[i][0] = p.input[i * 2];
  65. p.c_out[i][1] = -p.input[i * 2 + 1];
  66. }
  67. }
  68. }
  69. } // namespace
  70. fft_plan fft_plan_dft_1d(int n, fft_complex *in, fft_complex *out, int sign,
  71. unsigned int flags) {
  72. void makewt(int nw, int *ip, double *w);
  73. fft_plan output = {0};
  74. output.n = n;
  75. output.in = NULL;
  76. output.c_in = in;
  77. output.out = NULL;
  78. output.c_out = out;
  79. output.sign = sign;
  80. output.flags = flags;
  81. output.input = new double[n * 2];
  82. output.ip = new int[n];
  83. output.w = new double[n * 5 / 4];
  84. output.ip[0] = 0;
  85. makewt(output.n >> 1, output.ip, output.w);
  86. return output;
  87. }
  88. fft_plan fft_plan_dft_c2r_1d(int n, fft_complex *in, double *out,
  89. unsigned int flags) {
  90. void makewt(int nw, int *ip, double *w);
  91. void makect(int nc, int *ip, double *c);
  92. fft_plan output = {0};
  93. output.n = n;
  94. output.in = NULL;
  95. output.c_in = in;
  96. output.out = out;
  97. output.c_out = NULL;
  98. output.sign = FFT_BACKWARD;
  99. output.flags = flags;
  100. output.input = new double[n];
  101. output.ip = new int[n];
  102. output.w = new double[n * 5 / 4];
  103. output.ip[0] = 0;
  104. makewt(output.n >> 2, output.ip, output.w);
  105. makect(output.n >> 2, output.ip, output.w + (output.n >> 2));
  106. return output;
  107. }
  108. fft_plan fft_plan_dft_r2c_1d(int n, double *in, fft_complex *out,
  109. unsigned int flags) {
  110. void makewt(int nw, int *ip, double *w);
  111. void makect(int nc, int *ip, double *c);
  112. fft_plan output = {0};
  113. output.n = n;
  114. output.in = in;
  115. output.c_in = NULL;
  116. output.out = NULL;
  117. output.c_out = out;
  118. output.sign = FFT_FORWARD;
  119. output.flags = flags;
  120. output.input = new double[n];
  121. output.ip = new int[n];
  122. output.w = new double[n * 5 / 4];
  123. output.ip[0] = 0;
  124. makewt(output.n >> 2, output.ip, output.w);
  125. makect(output.n >> 2, output.ip, output.w + (output.n >> 2));
  126. return output;
  127. }
  128. void fft_execute(fft_plan p) {
  129. if (p.sign == FFT_FORWARD) {
  130. ForwardFFT(p);
  131. } else { // ifft
  132. BackwardFFT(p);
  133. }
  134. }
  135. void fft_destroy_plan(fft_plan p) {
  136. p.n = 0;
  137. p.in = NULL;
  138. p.c_in = NULL;
  139. p.out = NULL;
  140. p.c_out = NULL;
  141. p.sign = 0;
  142. p.flags = 0;
  143. delete[] p.input;
  144. delete[] p.ip;
  145. delete[] p.w;
  146. }
  147. //-----------------------------------------------------------------------
  148. // The following functions are reffered by
  149. // http://www.kurims.kyoto-u.ac.jp/~ooura/index.html
  150. void cdft(int n, int isgn, double *a, int *ip, double *w) {
  151. void cftfsub(int n, double *a, int *ip, int nw, double *w);
  152. void cftbsub(int n, double *a, int *ip, int nw, double *w);
  153. int nw;
  154. nw = ip[0];
  155. if (isgn >= 0) {
  156. cftfsub(n, a, ip, nw, w);
  157. } else {
  158. cftbsub(n, a, ip, nw, w);
  159. }
  160. }
  161. void rdft(int n, int isgn, double *a, int *ip, double *w) {
  162. void cftfsub(int n, double *a, int *ip, int nw, double *w);
  163. void cftbsub(int n, double *a, int *ip, int nw, double *w);
  164. void rftfsub(int n, double *a, int nc, double *c);
  165. void rftbsub(int n, double *a, int nc, double *c);
  166. double xi;
  167. int nw = ip[0];
  168. int nc = ip[1];
  169. if (isgn >= 0) {
  170. if (n > 4) {
  171. cftfsub(n, a, ip, nw, w);
  172. rftfsub(n, a, nc, w + nw);
  173. } else if (n == 4) {
  174. cftfsub(n, a, ip, nw, w);
  175. }
  176. xi = a[0] - a[1];
  177. a[0] += a[1];
  178. a[1] = xi;
  179. } else {
  180. a[1] = 0.5 * (a[0] - a[1]);
  181. a[0] -= a[1];
  182. if (n > 4) {
  183. rftbsub(n, a, nc, w + nw);
  184. cftbsub(n, a, ip, nw, w);
  185. } else if (n == 4) {
  186. cftbsub(n, a, ip, nw, w);
  187. }
  188. }
  189. }
  190. void makewt(int nw, int *ip, double *w) {
  191. void makeipt(int nw, int *ip);
  192. int j, nwh, nw0, nw1;
  193. double delta, wn4r, wk1r, wk1i, wk3r, wk3i;
  194. ip[0] = nw;
  195. ip[1] = 1;
  196. if (nw > 2) {
  197. nwh = nw >> 1;
  198. delta = atan(1.0) / nwh;
  199. wn4r = cos(delta * nwh);
  200. w[0] = 1;
  201. w[1] = wn4r;
  202. if (nwh == 4) {
  203. w[2] = cos(delta * 2);
  204. w[3] = sin(delta * 2);
  205. } else if (nwh > 4) {
  206. makeipt(nw, ip);
  207. w[2] = 0.5 / cos(delta * 2);
  208. w[3] = 0.5 / cos(delta * 6);
  209. for (j = 4; j < nwh; j += 4) {
  210. w[j] = cos(delta * j);
  211. w[j + 1] = sin(delta * j);
  212. w[j + 2] = cos(3 * delta * j);
  213. w[j + 3] = -sin(3 * delta * j);
  214. }
  215. }
  216. nw0 = 0;
  217. while (nwh > 2) {
  218. nw1 = nw0 + nwh;
  219. nwh >>= 1;
  220. w[nw1] = 1;
  221. w[nw1 + 1] = wn4r;
  222. if (nwh == 4) {
  223. wk1r = w[nw0 + 4];
  224. wk1i = w[nw0 + 5];
  225. w[nw1 + 2] = wk1r;
  226. w[nw1 + 3] = wk1i;
  227. } else if (nwh > 4) {
  228. wk1r = w[nw0 + 4];
  229. wk3r = w[nw0 + 6];
  230. w[nw1 + 2] = 0.5 / wk1r;
  231. w[nw1 + 3] = 0.5 / wk3r;
  232. for (j = 4; j < nwh; j += 4) {
  233. wk1r = w[nw0 + 2 * j];
  234. wk1i = w[nw0 + 2 * j + 1];
  235. wk3r = w[nw0 + 2 * j + 2];
  236. wk3i = w[nw0 + 2 * j + 3];
  237. w[nw1 + j] = wk1r;
  238. w[nw1 + j + 1] = wk1i;
  239. w[nw1 + j + 2] = wk3r;
  240. w[nw1 + j + 3] = wk3i;
  241. }
  242. }
  243. nw0 = nw1;
  244. }
  245. }
  246. }
  247. void makeipt(int nw, int *ip) {
  248. int j, l, m, m2, p, q;
  249. ip[2] = 0;
  250. ip[3] = 16;
  251. m = 2;
  252. for (l = nw; l > 32; l >>= 2) {
  253. m2 = m << 1;
  254. q = m2 << 3;
  255. for (j = m; j < m2; j++) {
  256. p = ip[j] << 2;
  257. ip[m + j] = p;
  258. ip[m2 + j] = p + q;
  259. }
  260. m = m2;
  261. }
  262. }
  263. void makect(int nc, int *ip, double *c) {
  264. int j, nch;
  265. double delta;
  266. ip[1] = nc;
  267. if (nc > 1) {
  268. nch = nc >> 1;
  269. delta = atan(1.0) / nch;
  270. c[0] = cos(delta * nch);
  271. c[nch] = 0.5 * c[0];
  272. for (j = 1; j < nch; j++) {
  273. c[j] = 0.5 * cos(delta * j);
  274. c[nc - j] = 0.5 * sin(delta * j);
  275. }
  276. }
  277. }
  278. // -------- child routines --------
  279. void cftfsub(int n, double *a, int *ip, int nw, double *w) {
  280. void bitrv2(int n, int *ip, double *a);
  281. void bitrv216(double *a);
  282. void bitrv208(double *a);
  283. void cftf1st(int n, double *a, double *w);
  284. void cftrec4(int n, double *a, int nw, double *w);
  285. void cftleaf(int n, int isplt, double *a, int nw, double *w);
  286. void cftfx41(int n, double *a, int nw, double *w);
  287. void cftf161(double *a, double *w);
  288. void cftf081(double *a, double *w);
  289. void cftf040(double *a);
  290. void cftx020(double *a);
  291. if (n > 8) {
  292. if (n > 32) {
  293. cftf1st(n, a, &w[nw - (n >> 2)]);
  294. if (n > 512) {
  295. cftrec4(n, a, nw, w);
  296. } else if (n > 128) {
  297. cftleaf(n, 1, a, nw, w);
  298. } else {
  299. cftfx41(n, a, nw, w);
  300. }
  301. bitrv2(n, ip, a);
  302. } else if (n == 32) {
  303. cftf161(a, &w[nw - 8]);
  304. bitrv216(a);
  305. } else {
  306. cftf081(a, w);
  307. bitrv208(a);
  308. }
  309. } else if (n == 8) {
  310. cftf040(a);
  311. } else if (n == 4) {
  312. cftx020(a);
  313. }
  314. }
  315. void cftbsub(int n, double *a, int *ip, int nw, double *w) {
  316. void bitrv2conj(int n, int *ip, double *a);
  317. void bitrv216neg(double *a);
  318. void bitrv208neg(double *a);
  319. void cftb1st(int n, double *a, double *w);
  320. void cftrec4(int n, double *a, int nw, double *w);
  321. void cftleaf(int n, int isplt, double *a, int nw, double *w);
  322. void cftfx41(int n, double *a, int nw, double *w);
  323. void cftf161(double *a, double *w);
  324. void cftf081(double *a, double *w);
  325. void cftb040(double *a);
  326. void cftx020(double *a);
  327. if (n > 8) {
  328. if (n > 32) {
  329. cftb1st(n, a, &w[nw - (n >> 2)]);
  330. if (n > 512) {
  331. cftrec4(n, a, nw, w);
  332. } else if (n > 128) {
  333. cftleaf(n, 1, a, nw, w);
  334. } else {
  335. cftfx41(n, a, nw, w);
  336. }
  337. bitrv2conj(n, ip, a);
  338. } else if (n == 32) {
  339. cftf161(a, &w[nw - 8]);
  340. bitrv216neg(a);
  341. } else {
  342. cftf081(a, w);
  343. bitrv208neg(a);
  344. }
  345. } else if (n == 8) {
  346. cftb040(a);
  347. } else if (n == 4) {
  348. cftx020(a);
  349. }
  350. }
  351. void bitrv2(int n, int *ip, double *a) {
  352. int j, j1, k, k1, l, m, nh, nm;
  353. double xr, xi, yr, yi;
  354. m = 1;
  355. for (l = n >> 2; l > 8; l >>= 2) {
  356. m <<= 1;
  357. }
  358. nh = n >> 1;
  359. nm = 4 * m;
  360. if (l == 8) {
  361. for (k = 0; k < m; k++) {
  362. for (j = 0; j < k; j++) {
  363. j1 = 4 * j + 2 * ip[m + k];
  364. k1 = 4 * k + 2 * ip[m + j];
  365. xr = a[j1];
  366. xi = a[j1 + 1];
  367. yr = a[k1];
  368. yi = a[k1 + 1];
  369. a[j1] = yr;
  370. a[j1 + 1] = yi;
  371. a[k1] = xr;
  372. a[k1 + 1] = xi;
  373. j1 += nm;
  374. k1 += 2 * nm;
  375. xr = a[j1];
  376. xi = a[j1 + 1];
  377. yr = a[k1];
  378. yi = a[k1 + 1];
  379. a[j1] = yr;
  380. a[j1 + 1] = yi;
  381. a[k1] = xr;
  382. a[k1 + 1] = xi;
  383. j1 += nm;
  384. k1 -= nm;
  385. xr = a[j1];
  386. xi = a[j1 + 1];
  387. yr = a[k1];
  388. yi = a[k1 + 1];
  389. a[j1] = yr;
  390. a[j1 + 1] = yi;
  391. a[k1] = xr;
  392. a[k1 + 1] = xi;
  393. j1 += nm;
  394. k1 += 2 * nm;
  395. xr = a[j1];
  396. xi = a[j1 + 1];
  397. yr = a[k1];
  398. yi = a[k1 + 1];
  399. a[j1] = yr;
  400. a[j1 + 1] = yi;
  401. a[k1] = xr;
  402. a[k1 + 1] = xi;
  403. j1 += nh;
  404. k1 += 2;
  405. xr = a[j1];
  406. xi = a[j1 + 1];
  407. yr = a[k1];
  408. yi = a[k1 + 1];
  409. a[j1] = yr;
  410. a[j1 + 1] = yi;
  411. a[k1] = xr;
  412. a[k1 + 1] = xi;
  413. j1 -= nm;
  414. k1 -= 2 * nm;
  415. xr = a[j1];
  416. xi = a[j1 + 1];
  417. yr = a[k1];
  418. yi = a[k1 + 1];
  419. a[j1] = yr;
  420. a[j1 + 1] = yi;
  421. a[k1] = xr;
  422. a[k1 + 1] = xi;
  423. j1 -= nm;
  424. k1 += nm;
  425. xr = a[j1];
  426. xi = a[j1 + 1];
  427. yr = a[k1];
  428. yi = a[k1 + 1];
  429. a[j1] = yr;
  430. a[j1 + 1] = yi;
  431. a[k1] = xr;
  432. a[k1 + 1] = xi;
  433. j1 -= nm;
  434. k1 -= 2 * nm;
  435. xr = a[j1];
  436. xi = a[j1 + 1];
  437. yr = a[k1];
  438. yi = a[k1 + 1];
  439. a[j1] = yr;
  440. a[j1 + 1] = yi;
  441. a[k1] = xr;
  442. a[k1 + 1] = xi;
  443. j1 += 2;
  444. k1 += nh;
  445. xr = a[j1];
  446. xi = a[j1 + 1];
  447. yr = a[k1];
  448. yi = a[k1 + 1];
  449. a[j1] = yr;
  450. a[j1 + 1] = yi;
  451. a[k1] = xr;
  452. a[k1 + 1] = xi;
  453. j1 += nm;
  454. k1 += 2 * nm;
  455. xr = a[j1];
  456. xi = a[j1 + 1];
  457. yr = a[k1];
  458. yi = a[k1 + 1];
  459. a[j1] = yr;
  460. a[j1 + 1] = yi;
  461. a[k1] = xr;
  462. a[k1 + 1] = xi;
  463. j1 += nm;
  464. k1 -= nm;
  465. xr = a[j1];
  466. xi = a[j1 + 1];
  467. yr = a[k1];
  468. yi = a[k1 + 1];
  469. a[j1] = yr;
  470. a[j1 + 1] = yi;
  471. a[k1] = xr;
  472. a[k1 + 1] = xi;
  473. j1 += nm;
  474. k1 += 2 * nm;
  475. xr = a[j1];
  476. xi = a[j1 + 1];
  477. yr = a[k1];
  478. yi = a[k1 + 1];
  479. a[j1] = yr;
  480. a[j1 + 1] = yi;
  481. a[k1] = xr;
  482. a[k1 + 1] = xi;
  483. j1 -= nh;
  484. k1 -= 2;
  485. xr = a[j1];
  486. xi = a[j1 + 1];
  487. yr = a[k1];
  488. yi = a[k1 + 1];
  489. a[j1] = yr;
  490. a[j1 + 1] = yi;
  491. a[k1] = xr;
  492. a[k1 + 1] = xi;
  493. j1 -= nm;
  494. k1 -= 2 * nm;
  495. xr = a[j1];
  496. xi = a[j1 + 1];
  497. yr = a[k1];
  498. yi = a[k1 + 1];
  499. a[j1] = yr;
  500. a[j1 + 1] = yi;
  501. a[k1] = xr;
  502. a[k1 + 1] = xi;
  503. j1 -= nm;
  504. k1 += nm;
  505. xr = a[j1];
  506. xi = a[j1 + 1];
  507. yr = a[k1];
  508. yi = a[k1 + 1];
  509. a[j1] = yr;
  510. a[j1 + 1] = yi;
  511. a[k1] = xr;
  512. a[k1 + 1] = xi;
  513. j1 -= nm;
  514. k1 -= 2 * nm;
  515. xr = a[j1];
  516. xi = a[j1 + 1];
  517. yr = a[k1];
  518. yi = a[k1 + 1];
  519. a[j1] = yr;
  520. a[j1 + 1] = yi;
  521. a[k1] = xr;
  522. a[k1 + 1] = xi;
  523. }
  524. k1 = 4 * k + 2 * ip[m + k];
  525. j1 = k1 + 2;
  526. k1 += nh;
  527. xr = a[j1];
  528. xi = a[j1 + 1];
  529. yr = a[k1];
  530. yi = a[k1 + 1];
  531. a[j1] = yr;
  532. a[j1 + 1] = yi;
  533. a[k1] = xr;
  534. a[k1 + 1] = xi;
  535. j1 += nm;
  536. k1 += 2 * nm;
  537. xr = a[j1];
  538. xi = a[j1 + 1];
  539. yr = a[k1];
  540. yi = a[k1 + 1];
  541. a[j1] = yr;
  542. a[j1 + 1] = yi;
  543. a[k1] = xr;
  544. a[k1 + 1] = xi;
  545. j1 += nm;
  546. k1 -= nm;
  547. xr = a[j1];
  548. xi = a[j1 + 1];
  549. yr = a[k1];
  550. yi = a[k1 + 1];
  551. a[j1] = yr;
  552. a[j1 + 1] = yi;
  553. a[k1] = xr;
  554. a[k1 + 1] = xi;
  555. j1 -= 2;
  556. k1 -= nh;
  557. xr = a[j1];
  558. xi = a[j1 + 1];
  559. yr = a[k1];
  560. yi = a[k1 + 1];
  561. a[j1] = yr;
  562. a[j1 + 1] = yi;
  563. a[k1] = xr;
  564. a[k1 + 1] = xi;
  565. j1 += nh + 2;
  566. k1 += nh + 2;
  567. xr = a[j1];
  568. xi = a[j1 + 1];
  569. yr = a[k1];
  570. yi = a[k1 + 1];
  571. a[j1] = yr;
  572. a[j1 + 1] = yi;
  573. a[k1] = xr;
  574. a[k1 + 1] = xi;
  575. j1 -= nh - nm;
  576. k1 += 2 * nm - 2;
  577. xr = a[j1];
  578. xi = a[j1 + 1];
  579. yr = a[k1];
  580. yi = a[k1 + 1];
  581. a[j1] = yr;
  582. a[j1 + 1] = yi;
  583. a[k1] = xr;
  584. a[k1 + 1] = xi;
  585. }
  586. } else {
  587. for (k = 0; k < m; k++) {
  588. for (j = 0; j < k; j++) {
  589. j1 = 4 * j + ip[m + k];
  590. k1 = 4 * k + ip[m + j];
  591. xr = a[j1];
  592. xi = a[j1 + 1];
  593. yr = a[k1];
  594. yi = a[k1 + 1];
  595. a[j1] = yr;
  596. a[j1 + 1] = yi;
  597. a[k1] = xr;
  598. a[k1 + 1] = xi;
  599. j1 += nm;
  600. k1 += nm;
  601. xr = a[j1];
  602. xi = a[j1 + 1];
  603. yr = a[k1];
  604. yi = a[k1 + 1];
  605. a[j1] = yr;
  606. a[j1 + 1] = yi;
  607. a[k1] = xr;
  608. a[k1 + 1] = xi;
  609. j1 += nh;
  610. k1 += 2;
  611. xr = a[j1];
  612. xi = a[j1 + 1];
  613. yr = a[k1];
  614. yi = a[k1 + 1];
  615. a[j1] = yr;
  616. a[j1 + 1] = yi;
  617. a[k1] = xr;
  618. a[k1 + 1] = xi;
  619. j1 -= nm;
  620. k1 -= nm;
  621. xr = a[j1];
  622. xi = a[j1 + 1];
  623. yr = a[k1];
  624. yi = a[k1 + 1];
  625. a[j1] = yr;
  626. a[j1 + 1] = yi;
  627. a[k1] = xr;
  628. a[k1 + 1] = xi;
  629. j1 += 2;
  630. k1 += nh;
  631. xr = a[j1];
  632. xi = a[j1 + 1];
  633. yr = a[k1];
  634. yi = a[k1 + 1];
  635. a[j1] = yr;
  636. a[j1 + 1] = yi;
  637. a[k1] = xr;
  638. a[k1 + 1] = xi;
  639. j1 += nm;
  640. k1 += nm;
  641. xr = a[j1];
  642. xi = a[j1 + 1];
  643. yr = a[k1];
  644. yi = a[k1 + 1];
  645. a[j1] = yr;
  646. a[j1 + 1] = yi;
  647. a[k1] = xr;
  648. a[k1 + 1] = xi;
  649. j1 -= nh;
  650. k1 -= 2;
  651. xr = a[j1];
  652. xi = a[j1 + 1];
  653. yr = a[k1];
  654. yi = a[k1 + 1];
  655. a[j1] = yr;
  656. a[j1 + 1] = yi;
  657. a[k1] = xr;
  658. a[k1 + 1] = xi;
  659. j1 -= nm;
  660. k1 -= nm;
  661. xr = a[j1];
  662. xi = a[j1 + 1];
  663. yr = a[k1];
  664. yi = a[k1 + 1];
  665. a[j1] = yr;
  666. a[j1 + 1] = yi;
  667. a[k1] = xr;
  668. a[k1 + 1] = xi;
  669. }
  670. k1 = 4 * k + ip[m + k];
  671. j1 = k1 + 2;
  672. k1 += nh;
  673. xr = a[j1];
  674. xi = a[j1 + 1];
  675. yr = a[k1];
  676. yi = a[k1 + 1];
  677. a[j1] = yr;
  678. a[j1 + 1] = yi;
  679. a[k1] = xr;
  680. a[k1 + 1] = xi;
  681. j1 += nm;
  682. k1 += nm;
  683. xr = a[j1];
  684. xi = a[j1 + 1];
  685. yr = a[k1];
  686. yi = a[k1 + 1];
  687. a[j1] = yr;
  688. a[j1 + 1] = yi;
  689. a[k1] = xr;
  690. a[k1 + 1] = xi;
  691. }
  692. }
  693. }
  694. void bitrv2conj(int n, int *ip, double *a) {
  695. int j, j1, k, k1, l, m, nh, nm;
  696. double xr, xi, yr, yi;
  697. m = 1;
  698. for (l = n >> 2; l > 8; l >>= 2) {
  699. m <<= 1;
  700. }
  701. nh = n >> 1;
  702. nm = 4 * m;
  703. if (l == 8) {
  704. for (k = 0; k < m; k++) {
  705. for (j = 0; j < k; j++) {
  706. j1 = 4 * j + 2 * ip[m + k];
  707. k1 = 4 * k + 2 * ip[m + j];
  708. xr = a[j1];
  709. xi = -a[j1 + 1];
  710. yr = a[k1];
  711. yi = -a[k1 + 1];
  712. a[j1] = yr;
  713. a[j1 + 1] = yi;
  714. a[k1] = xr;
  715. a[k1 + 1] = xi;
  716. j1 += nm;
  717. k1 += 2 * nm;
  718. xr = a[j1];
  719. xi = -a[j1 + 1];
  720. yr = a[k1];
  721. yi = -a[k1 + 1];
  722. a[j1] = yr;
  723. a[j1 + 1] = yi;
  724. a[k1] = xr;
  725. a[k1 + 1] = xi;
  726. j1 += nm;
  727. k1 -= nm;
  728. xr = a[j1];
  729. xi = -a[j1 + 1];
  730. yr = a[k1];
  731. yi = -a[k1 + 1];
  732. a[j1] = yr;
  733. a[j1 + 1] = yi;
  734. a[k1] = xr;
  735. a[k1 + 1] = xi;
  736. j1 += nm;
  737. k1 += 2 * nm;
  738. xr = a[j1];
  739. xi = -a[j1 + 1];
  740. yr = a[k1];
  741. yi = -a[k1 + 1];
  742. a[j1] = yr;
  743. a[j1 + 1] = yi;
  744. a[k1] = xr;
  745. a[k1 + 1] = xi;
  746. j1 += nh;
  747. k1 += 2;
  748. xr = a[j1];
  749. xi = -a[j1 + 1];
  750. yr = a[k1];
  751. yi = -a[k1 + 1];
  752. a[j1] = yr;
  753. a[j1 + 1] = yi;
  754. a[k1] = xr;
  755. a[k1 + 1] = xi;
  756. j1 -= nm;
  757. k1 -= 2 * nm;
  758. xr = a[j1];
  759. xi = -a[j1 + 1];
  760. yr = a[k1];
  761. yi = -a[k1 + 1];
  762. a[j1] = yr;
  763. a[j1 + 1] = yi;
  764. a[k1] = xr;
  765. a[k1 + 1] = xi;
  766. j1 -= nm;
  767. k1 += nm;
  768. xr = a[j1];
  769. xi = -a[j1 + 1];
  770. yr = a[k1];
  771. yi = -a[k1 + 1];
  772. a[j1] = yr;
  773. a[j1 + 1] = yi;
  774. a[k1] = xr;
  775. a[k1 + 1] = xi;
  776. j1 -= nm;
  777. k1 -= 2 * nm;
  778. xr = a[j1];
  779. xi = -a[j1 + 1];
  780. yr = a[k1];
  781. yi = -a[k1 + 1];
  782. a[j1] = yr;
  783. a[j1 + 1] = yi;
  784. a[k1] = xr;
  785. a[k1 + 1] = xi;
  786. j1 += 2;
  787. k1 += nh;
  788. xr = a[j1];
  789. xi = -a[j1 + 1];
  790. yr = a[k1];
  791. yi = -a[k1 + 1];
  792. a[j1] = yr;
  793. a[j1 + 1] = yi;
  794. a[k1] = xr;
  795. a[k1 + 1] = xi;
  796. j1 += nm;
  797. k1 += 2 * nm;
  798. xr = a[j1];
  799. xi = -a[j1 + 1];
  800. yr = a[k1];
  801. yi = -a[k1 + 1];
  802. a[j1] = yr;
  803. a[j1 + 1] = yi;
  804. a[k1] = xr;
  805. a[k1 + 1] = xi;
  806. j1 += nm;
  807. k1 -= nm;
  808. xr = a[j1];
  809. xi = -a[j1 + 1];
  810. yr = a[k1];
  811. yi = -a[k1 + 1];
  812. a[j1] = yr;
  813. a[j1 + 1] = yi;
  814. a[k1] = xr;
  815. a[k1 + 1] = xi;
  816. j1 += nm;
  817. k1 += 2 * nm;
  818. xr = a[j1];
  819. xi = -a[j1 + 1];
  820. yr = a[k1];
  821. yi = -a[k1 + 1];
  822. a[j1] = yr;
  823. a[j1 + 1] = yi;
  824. a[k1] = xr;
  825. a[k1 + 1] = xi;
  826. j1 -= nh;
  827. k1 -= 2;
  828. xr = a[j1];
  829. xi = -a[j1 + 1];
  830. yr = a[k1];
  831. yi = -a[k1 + 1];
  832. a[j1] = yr;
  833. a[j1 + 1] = yi;
  834. a[k1] = xr;
  835. a[k1 + 1] = xi;
  836. j1 -= nm;
  837. k1 -= 2 * nm;
  838. xr = a[j1];
  839. xi = -a[j1 + 1];
  840. yr = a[k1];
  841. yi = -a[k1 + 1];
  842. a[j1] = yr;
  843. a[j1 + 1] = yi;
  844. a[k1] = xr;
  845. a[k1 + 1] = xi;
  846. j1 -= nm;
  847. k1 += nm;
  848. xr = a[j1];
  849. xi = -a[j1 + 1];
  850. yr = a[k1];
  851. yi = -a[k1 + 1];
  852. a[j1] = yr;
  853. a[j1 + 1] = yi;
  854. a[k1] = xr;
  855. a[k1 + 1] = xi;
  856. j1 -= nm;
  857. k1 -= 2 * nm;
  858. xr = a[j1];
  859. xi = -a[j1 + 1];
  860. yr = a[k1];
  861. yi = -a[k1 + 1];
  862. a[j1] = yr;
  863. a[j1 + 1] = yi;
  864. a[k1] = xr;
  865. a[k1 + 1] = xi;
  866. }
  867. k1 = 4 * k + 2 * ip[m + k];
  868. j1 = k1 + 2;
  869. k1 += nh;
  870. a[j1 - 1] = -a[j1 - 1];
  871. xr = a[j1];
  872. xi = -a[j1 + 1];
  873. yr = a[k1];
  874. yi = -a[k1 + 1];
  875. a[j1] = yr;
  876. a[j1 + 1] = yi;
  877. a[k1] = xr;
  878. a[k1 + 1] = xi;
  879. a[k1 + 3] = -a[k1 + 3];
  880. j1 += nm;
  881. k1 += 2 * nm;
  882. xr = a[j1];
  883. xi = -a[j1 + 1];
  884. yr = a[k1];
  885. yi = -a[k1 + 1];
  886. a[j1] = yr;
  887. a[j1 + 1] = yi;
  888. a[k1] = xr;
  889. a[k1 + 1] = xi;
  890. j1 += nm;
  891. k1 -= nm;
  892. xr = a[j1];
  893. xi = -a[j1 + 1];
  894. yr = a[k1];
  895. yi = -a[k1 + 1];
  896. a[j1] = yr;
  897. a[j1 + 1] = yi;
  898. a[k1] = xr;
  899. a[k1 + 1] = xi;
  900. j1 -= 2;
  901. k1 -= nh;
  902. xr = a[j1];
  903. xi = -a[j1 + 1];
  904. yr = a[k1];
  905. yi = -a[k1 + 1];
  906. a[j1] = yr;
  907. a[j1 + 1] = yi;
  908. a[k1] = xr;
  909. a[k1 + 1] = xi;
  910. j1 += nh + 2;
  911. k1 += nh + 2;
  912. xr = a[j1];
  913. xi = -a[j1 + 1];
  914. yr = a[k1];
  915. yi = -a[k1 + 1];
  916. a[j1] = yr;
  917. a[j1 + 1] = yi;
  918. a[k1] = xr;
  919. a[k1 + 1] = xi;
  920. j1 -= nh - nm;
  921. k1 += 2 * nm - 2;
  922. a[j1 - 1] = -a[j1 - 1];
  923. xr = a[j1];
  924. xi = -a[j1 + 1];
  925. yr = a[k1];
  926. yi = -a[k1 + 1];
  927. a[j1] = yr;
  928. a[j1 + 1] = yi;
  929. a[k1] = xr;
  930. a[k1 + 1] = xi;
  931. a[k1 + 3] = -a[k1 + 3];
  932. }
  933. } else {
  934. for (k = 0; k < m; k++) {
  935. for (j = 0; j < k; j++) {
  936. j1 = 4 * j + ip[m + k];
  937. k1 = 4 * k + ip[m + j];
  938. xr = a[j1];
  939. xi = -a[j1 + 1];
  940. yr = a[k1];
  941. yi = -a[k1 + 1];
  942. a[j1] = yr;
  943. a[j1 + 1] = yi;
  944. a[k1] = xr;
  945. a[k1 + 1] = xi;
  946. j1 += nm;
  947. k1 += nm;
  948. xr = a[j1];
  949. xi = -a[j1 + 1];
  950. yr = a[k1];
  951. yi = -a[k1 + 1];
  952. a[j1] = yr;
  953. a[j1 + 1] = yi;
  954. a[k1] = xr;
  955. a[k1 + 1] = xi;
  956. j1 += nh;
  957. k1 += 2;
  958. xr = a[j1];
  959. xi = -a[j1 + 1];
  960. yr = a[k1];
  961. yi = -a[k1 + 1];
  962. a[j1] = yr;
  963. a[j1 + 1] = yi;
  964. a[k1] = xr;
  965. a[k1 + 1] = xi;
  966. j1 -= nm;
  967. k1 -= nm;
  968. xr = a[j1];
  969. xi = -a[j1 + 1];
  970. yr = a[k1];
  971. yi = -a[k1 + 1];
  972. a[j1] = yr;
  973. a[j1 + 1] = yi;
  974. a[k1] = xr;
  975. a[k1 + 1] = xi;
  976. j1 += 2;
  977. k1 += nh;
  978. xr = a[j1];
  979. xi = -a[j1 + 1];
  980. yr = a[k1];
  981. yi = -a[k1 + 1];
  982. a[j1] = yr;
  983. a[j1 + 1] = yi;
  984. a[k1] = xr;
  985. a[k1 + 1] = xi;
  986. j1 += nm;
  987. k1 += nm;
  988. xr = a[j1];
  989. xi = -a[j1 + 1];
  990. yr = a[k1];
  991. yi = -a[k1 + 1];
  992. a[j1] = yr;
  993. a[j1 + 1] = yi;
  994. a[k1] = xr;
  995. a[k1 + 1] = xi;
  996. j1 -= nh;
  997. k1 -= 2;
  998. xr = a[j1];
  999. xi = -a[j1 + 1];
  1000. yr = a[k1];
  1001. yi = -a[k1 + 1];
  1002. a[j1] = yr;
  1003. a[j1 + 1] = yi;
  1004. a[k1] = xr;
  1005. a[k1 + 1] = xi;
  1006. j1 -= nm;
  1007. k1 -= nm;
  1008. xr = a[j1];
  1009. xi = -a[j1 + 1];
  1010. yr = a[k1];
  1011. yi = -a[k1 + 1];
  1012. a[j1] = yr;
  1013. a[j1 + 1] = yi;
  1014. a[k1] = xr;
  1015. a[k1 + 1] = xi;
  1016. }
  1017. k1 = 4 * k + ip[m + k];
  1018. j1 = k1 + 2;
  1019. k1 += nh;
  1020. a[j1 - 1] = -a[j1 - 1];
  1021. xr = a[j1];
  1022. xi = -a[j1 + 1];
  1023. yr = a[k1];
  1024. yi = -a[k1 + 1];
  1025. a[j1] = yr;
  1026. a[j1 + 1] = yi;
  1027. a[k1] = xr;
  1028. a[k1 + 1] = xi;
  1029. a[k1 + 3] = -a[k1 + 3];
  1030. j1 += nm;
  1031. k1 += nm;
  1032. a[j1 - 1] = -a[j1 - 1];
  1033. xr = a[j1];
  1034. xi = -a[j1 + 1];
  1035. yr = a[k1];
  1036. yi = -a[k1 + 1];
  1037. a[j1] = yr;
  1038. a[j1 + 1] = yi;
  1039. a[k1] = xr;
  1040. a[k1 + 1] = xi;
  1041. a[k1 + 3] = -a[k1 + 3];
  1042. }
  1043. }
  1044. }
  1045. void bitrv216(double *a) {
  1046. double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i,
  1047. x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i,
  1048. x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i;
  1049. x1r = a[2];
  1050. x1i = a[3];
  1051. x2r = a[4];
  1052. x2i = a[5];
  1053. x3r = a[6];
  1054. x3i = a[7];
  1055. x4r = a[8];
  1056. x4i = a[9];
  1057. x5r = a[10];
  1058. x5i = a[11];
  1059. x7r = a[14];
  1060. x7i = a[15];
  1061. x8r = a[16];
  1062. x8i = a[17];
  1063. x10r = a[20];
  1064. x10i = a[21];
  1065. x11r = a[22];
  1066. x11i = a[23];
  1067. x12r = a[24];
  1068. x12i = a[25];
  1069. x13r = a[26];
  1070. x13i = a[27];
  1071. x14r = a[28];
  1072. x14i = a[29];
  1073. a[2] = x8r;
  1074. a[3] = x8i;
  1075. a[4] = x4r;
  1076. a[5] = x4i;
  1077. a[6] = x12r;
  1078. a[7] = x12i;
  1079. a[8] = x2r;
  1080. a[9] = x2i;
  1081. a[10] = x10r;
  1082. a[11] = x10i;
  1083. a[14] = x14r;
  1084. a[15] = x14i;
  1085. a[16] = x1r;
  1086. a[17] = x1i;
  1087. a[20] = x5r;
  1088. a[21] = x5i;
  1089. a[22] = x13r;
  1090. a[23] = x13i;
  1091. a[24] = x3r;
  1092. a[25] = x3i;
  1093. a[26] = x11r;
  1094. a[27] = x11i;
  1095. a[28] = x7r;
  1096. a[29] = x7i;
  1097. }
  1098. void bitrv216neg(double *a) {
  1099. double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i,
  1100. x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i,
  1101. x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i,
  1102. x13r, x13i, x14r, x14i, x15r, x15i;
  1103. x1r = a[2];
  1104. x1i = a[3];
  1105. x2r = a[4];
  1106. x2i = a[5];
  1107. x3r = a[6];
  1108. x3i = a[7];
  1109. x4r = a[8];
  1110. x4i = a[9];
  1111. x5r = a[10];
  1112. x5i = a[11];
  1113. x6r = a[12];
  1114. x6i = a[13];
  1115. x7r = a[14];
  1116. x7i = a[15];
  1117. x8r = a[16];
  1118. x8i = a[17];
  1119. x9r = a[18];
  1120. x9i = a[19];
  1121. x10r = a[20];
  1122. x10i = a[21];
  1123. x11r = a[22];
  1124. x11i = a[23];
  1125. x12r = a[24];
  1126. x12i = a[25];
  1127. x13r = a[26];
  1128. x13i = a[27];
  1129. x14r = a[28];
  1130. x14i = a[29];
  1131. x15r = a[30];
  1132. x15i = a[31];
  1133. a[2] = x15r;
  1134. a[3] = x15i;
  1135. a[4] = x7r;
  1136. a[5] = x7i;
  1137. a[6] = x11r;
  1138. a[7] = x11i;
  1139. a[8] = x3r;
  1140. a[9] = x3i;
  1141. a[10] = x13r;
  1142. a[11] = x13i;
  1143. a[12] = x5r;
  1144. a[13] = x5i;
  1145. a[14] = x9r;
  1146. a[15] = x9i;
  1147. a[16] = x1r;
  1148. a[17] = x1i;
  1149. a[18] = x14r;
  1150. a[19] = x14i;
  1151. a[20] = x6r;
  1152. a[21] = x6i;
  1153. a[22] = x10r;
  1154. a[23] = x10i;
  1155. a[24] = x2r;
  1156. a[25] = x2i;
  1157. a[26] = x12r;
  1158. a[27] = x12i;
  1159. a[28] = x4r;
  1160. a[29] = x4i;
  1161. a[30] = x8r;
  1162. a[31] = x8i;
  1163. }
  1164. void bitrv208(double *a) {
  1165. double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i;
  1166. x1r = a[2];
  1167. x1i = a[3];
  1168. x3r = a[6];
  1169. x3i = a[7];
  1170. x4r = a[8];
  1171. x4i = a[9];
  1172. x6r = a[12];
  1173. x6i = a[13];
  1174. a[2] = x4r;
  1175. a[3] = x4i;
  1176. a[6] = x6r;
  1177. a[7] = x6i;
  1178. a[8] = x1r;
  1179. a[9] = x1i;
  1180. a[12] = x3r;
  1181. a[13] = x3i;
  1182. }
  1183. void bitrv208neg(double *a) {
  1184. double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i,
  1185. x5r, x5i, x6r, x6i, x7r, x7i;
  1186. x1r = a[2];
  1187. x1i = a[3];
  1188. x2r = a[4];
  1189. x2i = a[5];
  1190. x3r = a[6];
  1191. x3i = a[7];
  1192. x4r = a[8];
  1193. x4i = a[9];
  1194. x5r = a[10];
  1195. x5i = a[11];
  1196. x6r = a[12];
  1197. x6i = a[13];
  1198. x7r = a[14];
  1199. x7i = a[15];
  1200. a[2] = x7r;
  1201. a[3] = x7i;
  1202. a[4] = x3r;
  1203. a[5] = x3i;
  1204. a[6] = x5r;
  1205. a[7] = x5i;
  1206. a[8] = x1r;
  1207. a[9] = x1i;
  1208. a[10] = x6r;
  1209. a[11] = x6i;
  1210. a[12] = x2r;
  1211. a[13] = x2i;
  1212. a[14] = x4r;
  1213. a[15] = x4i;
  1214. }
  1215. void cftf1st(int n, double *a, double *w) {
  1216. int j, j0, j1, j2, j3, k, m, mh;
  1217. double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i,
  1218. wd1r, wd1i, wd3r, wd3i;
  1219. double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i,
  1220. y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
  1221. mh = n >> 3;
  1222. m = 2 * mh;
  1223. j1 = m;
  1224. j2 = j1 + m;
  1225. j3 = j2 + m;
  1226. x0r = a[0] + a[j2];
  1227. x0i = a[1] + a[j2 + 1];
  1228. x1r = a[0] - a[j2];
  1229. x1i = a[1] - a[j2 + 1];
  1230. x2r = a[j1] + a[j3];
  1231. x2i = a[j1 + 1] + a[j3 + 1];
  1232. x3r = a[j1] - a[j3];
  1233. x3i = a[j1 + 1] - a[j3 + 1];
  1234. a[0] = x0r + x2r;
  1235. a[1] = x0i + x2i;
  1236. a[j1] = x0r - x2r;
  1237. a[j1 + 1] = x0i - x2i;
  1238. a[j2] = x1r - x3i;
  1239. a[j2 + 1] = x1i + x3r;
  1240. a[j3] = x1r + x3i;
  1241. a[j3 + 1] = x1i - x3r;
  1242. wn4r = w[1];
  1243. csc1 = w[2];
  1244. csc3 = w[3];
  1245. wd1r = 1;
  1246. wd1i = 0;
  1247. wd3r = 1;
  1248. wd3i = 0;
  1249. k = 0;
  1250. for (j = 2; j < mh - 2; j += 4) {
  1251. k += 4;
  1252. wk1r = csc1 * (wd1r + w[k]);
  1253. wk1i = csc1 * (wd1i + w[k + 1]);
  1254. wk3r = csc3 * (wd3r + w[k + 2]);
  1255. wk3i = csc3 * (wd3i + w[k + 3]);
  1256. wd1r = w[k];
  1257. wd1i = w[k + 1];
  1258. wd3r = w[k + 2];
  1259. wd3i = w[k + 3];
  1260. j1 = j + m;
  1261. j2 = j1 + m;
  1262. j3 = j2 + m;
  1263. x0r = a[j] + a[j2];
  1264. x0i = a[j + 1] + a[j2 + 1];
  1265. x1r = a[j] - a[j2];
  1266. x1i = a[j + 1] - a[j2 + 1];
  1267. y0r = a[j + 2] + a[j2 + 2];
  1268. y0i = a[j + 3] + a[j2 + 3];
  1269. y1r = a[j + 2] - a[j2 + 2];
  1270. y1i = a[j + 3] - a[j2 + 3];
  1271. x2r = a[j1] + a[j3];
  1272. x2i = a[j1 + 1] + a[j3 + 1];
  1273. x3r = a[j1] - a[j3];
  1274. x3i = a[j1 + 1] - a[j3 + 1];
  1275. y2r = a[j1 + 2] + a[j3 + 2];
  1276. y2i = a[j1 + 3] + a[j3 + 3];
  1277. y3r = a[j1 + 2] - a[j3 + 2];
  1278. y3i = a[j1 + 3] - a[j3 + 3];
  1279. a[j] = x0r + x2r;
  1280. a[j + 1] = x0i + x2i;
  1281. a[j + 2] = y0r + y2r;
  1282. a[j + 3] = y0i + y2i;
  1283. a[j1] = x0r - x2r;
  1284. a[j1 + 1] = x0i - x2i;
  1285. a[j1 + 2] = y0r - y2r;
  1286. a[j1 + 3] = y0i - y2i;
  1287. x0r = x1r - x3i;
  1288. x0i = x1i + x3r;
  1289. a[j2] = wk1r * x0r - wk1i * x0i;
  1290. a[j2 + 1] = wk1r * x0i + wk1i * x0r;
  1291. x0r = y1r - y3i;
  1292. x0i = y1i + y3r;
  1293. a[j2 + 2] = wd1r * x0r - wd1i * x0i;
  1294. a[j2 + 3] = wd1r * x0i + wd1i * x0r;
  1295. x0r = x1r + x3i;
  1296. x0i = x1i - x3r;
  1297. a[j3] = wk3r * x0r + wk3i * x0i;
  1298. a[j3 + 1] = wk3r * x0i - wk3i * x0r;
  1299. x0r = y1r + y3i;
  1300. x0i = y1i - y3r;
  1301. a[j3 + 2] = wd3r * x0r + wd3i * x0i;
  1302. a[j3 + 3] = wd3r * x0i - wd3i * x0r;
  1303. j0 = m - j;
  1304. j1 = j0 + m;
  1305. j2 = j1 + m;
  1306. j3 = j2 + m;
  1307. x0r = a[j0] + a[j2];
  1308. x0i = a[j0 + 1] + a[j2 + 1];
  1309. x1r = a[j0] - a[j2];
  1310. x1i = a[j0 + 1] - a[j2 + 1];
  1311. y0r = a[j0 - 2] + a[j2 - 2];
  1312. y0i = a[j0 - 1] + a[j2 - 1];
  1313. y1r = a[j0 - 2] - a[j2 - 2];
  1314. y1i = a[j0 - 1] - a[j2 - 1];
  1315. x2r = a[j1] + a[j3];
  1316. x2i = a[j1 + 1] + a[j3 + 1];
  1317. x3r = a[j1] - a[j3];
  1318. x3i = a[j1 + 1] - a[j3 + 1];
  1319. y2r = a[j1 - 2] + a[j3 - 2];
  1320. y2i = a[j1 - 1] + a[j3 - 1];
  1321. y3r = a[j1 - 2] - a[j3 - 2];
  1322. y3i = a[j1 - 1] - a[j3 - 1];
  1323. a[j0] = x0r + x2r;
  1324. a[j0 + 1] = x0i + x2i;
  1325. a[j0 - 2] = y0r + y2r;
  1326. a[j0 - 1] = y0i + y2i;
  1327. a[j1] = x0r - x2r;
  1328. a[j1 + 1] = x0i - x2i;
  1329. a[j1 - 2] = y0r - y2r;
  1330. a[j1 - 1] = y0i - y2i;
  1331. x0r = x1r - x3i;
  1332. x0i = x1i + x3r;
  1333. a[j2] = wk1i * x0r - wk1r * x0i;
  1334. a[j2 + 1] = wk1i * x0i + wk1r * x0r;
  1335. x0r = y1r - y3i;
  1336. x0i = y1i + y3r;
  1337. a[j2 - 2] = wd1i * x0r - wd1r * x0i;
  1338. a[j2 - 1] = wd1i * x0i + wd1r * x0r;
  1339. x0r = x1r + x3i;
  1340. x0i = x1i - x3r;
  1341. a[j3] = wk3i * x0r + wk3r * x0i;
  1342. a[j3 + 1] = wk3i * x0i - wk3r * x0r;
  1343. x0r = y1r + y3i;
  1344. x0i = y1i - y3r;
  1345. a[j3 - 2] = wd3i * x0r + wd3r * x0i;
  1346. a[j3 - 1] = wd3i * x0i - wd3r * x0r;
  1347. }
  1348. wk1r = csc1 * (wd1r + wn4r);
  1349. wk1i = csc1 * (wd1i + wn4r);
  1350. wk3r = csc3 * (wd3r - wn4r);
  1351. wk3i = csc3 * (wd3i - wn4r);
  1352. j0 = mh;
  1353. j1 = j0 + m;
  1354. j2 = j1 + m;
  1355. j3 = j2 + m;
  1356. x0r = a[j0 - 2] + a[j2 - 2];
  1357. x0i = a[j0 - 1] + a[j2 - 1];
  1358. x1r = a[j0 - 2] - a[j2 - 2];
  1359. x1i = a[j0 - 1] - a[j2 - 1];
  1360. x2r = a[j1 - 2] + a[j3 - 2];
  1361. x2i = a[j1 - 1] + a[j3 - 1];
  1362. x3r = a[j1 - 2] - a[j3 - 2];
  1363. x3i = a[j1 - 1] - a[j3 - 1];
  1364. a[j0 - 2] = x0r + x2r;
  1365. a[j0 - 1] = x0i + x2i;
  1366. a[j1 - 2] = x0r - x2r;
  1367. a[j1 - 1] = x0i - x2i;
  1368. x0r = x1r - x3i;
  1369. x0i = x1i + x3r;
  1370. a[j2 - 2] = wk1r * x0r - wk1i * x0i;
  1371. a[j2 - 1] = wk1r * x0i + wk1i * x0r;
  1372. x0r = x1r + x3i;
  1373. x0i = x1i - x3r;
  1374. a[j3 - 2] = wk3r * x0r + wk3i * x0i;
  1375. a[j3 - 1] = wk3r * x0i - wk3i * x0r;
  1376. x0r = a[j0] + a[j2];
  1377. x0i = a[j0 + 1] + a[j2 + 1];
  1378. x1r = a[j0] - a[j2];
  1379. x1i = a[j0 + 1] - a[j2 + 1];
  1380. x2r = a[j1] + a[j3];
  1381. x2i = a[j1 + 1] + a[j3 + 1];
  1382. x3r = a[j1] - a[j3];
  1383. x3i = a[j1 + 1] - a[j3 + 1];
  1384. a[j0] = x0r + x2r;
  1385. a[j0 + 1] = x0i + x2i;
  1386. a[j1] = x0r - x2r;
  1387. a[j1 + 1] = x0i - x2i;
  1388. x0r = x1r - x3i;
  1389. x0i = x1i + x3r;
  1390. a[j2] = wn4r * (x0r - x0i);
  1391. a[j2 + 1] = wn4r * (x0i + x0r);
  1392. x0r = x1r + x3i;
  1393. x0i = x1i - x3r;
  1394. a[j3] = -wn4r * (x0r + x0i);
  1395. a[j3 + 1] = -wn4r * (x0i - x0r);
  1396. x0r = a[j0 + 2] + a[j2 + 2];
  1397. x0i = a[j0 + 3] + a[j2 + 3];
  1398. x1r = a[j0 + 2] - a[j2 + 2];
  1399. x1i = a[j0 + 3] - a[j2 + 3];
  1400. x2r = a[j1 + 2] + a[j3 + 2];
  1401. x2i = a[j1 + 3] + a[j3 + 3];
  1402. x3r = a[j1 + 2] - a[j3 + 2];
  1403. x3i = a[j1 + 3] - a[j3 + 3];
  1404. a[j0 + 2] = x0r + x2r;
  1405. a[j0 + 3] = x0i + x2i;
  1406. a[j1 + 2] = x0r - x2r;
  1407. a[j1 + 3] = x0i - x2i;
  1408. x0r = x1r - x3i;
  1409. x0i = x1i + x3r;
  1410. a[j2 + 2] = wk1i * x0r - wk1r * x0i;
  1411. a[j2 + 3] = wk1i * x0i + wk1r * x0r;
  1412. x0r = x1r + x3i;
  1413. x0i = x1i - x3r;
  1414. a[j3 + 2] = wk3i * x0r + wk3r * x0i;
  1415. a[j3 + 3] = wk3i * x0i - wk3r * x0r;
  1416. }
  1417. void cftb1st(int n, double *a, double *w) {
  1418. int j, j0, j1, j2, j3, k, m, mh;
  1419. double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i,
  1420. wd1r, wd1i, wd3r, wd3i;
  1421. double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i,
  1422. y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;
  1423. mh = n >> 3;
  1424. m = 2 * mh;
  1425. j1 = m;
  1426. j2 = j1 + m;
  1427. j3 = j2 + m;
  1428. x0r = a[0] + a[j2];
  1429. x0i = -a[1] - a[j2 + 1];
  1430. x1r = a[0] - a[j2];
  1431. x1i = -a[1] + a[j2 + 1];
  1432. x2r = a[j1] + a[j3];
  1433. x2i = a[j1 + 1] + a[j3 + 1];
  1434. x3r = a[j1] - a[j3];
  1435. x3i = a[j1 + 1] - a[j3 + 1];
  1436. a[0] = x0r + x2r;
  1437. a[1] = x0i - x2i;
  1438. a[j1] = x0r - x2r;
  1439. a[j1 + 1] = x0i + x2i;
  1440. a[j2] = x1r + x3i;
  1441. a[j2 + 1] = x1i + x3r;
  1442. a[j3] = x1r - x3i;
  1443. a[j3 + 1] = x1i - x3r;
  1444. wn4r = w[1];
  1445. csc1 = w[2];
  1446. csc3 = w[3];
  1447. wd1r = 1;
  1448. wd1i = 0;
  1449. wd3r = 1;
  1450. wd3i = 0;
  1451. k = 0;
  1452. for (j = 2; j < mh - 2; j += 4) {
  1453. k += 4;
  1454. wk1r = csc1 * (wd1r + w[k]);
  1455. wk1i = csc1 * (wd1i + w[k + 1]);
  1456. wk3r = csc3 * (wd3r + w[k + 2]);
  1457. wk3i = csc3 * (wd3i + w[k + 3]);
  1458. wd1r = w[k];
  1459. wd1i = w[k + 1];
  1460. wd3r = w[k + 2];
  1461. wd3i = w[k + 3];
  1462. j1 = j + m;
  1463. j2 = j1 + m;
  1464. j3 = j2 + m;
  1465. x0r = a[j] + a[j2];
  1466. x0i = -a[j + 1] - a[j2 + 1];
  1467. x1r = a[j] - a[j2];
  1468. x1i = -a[j + 1] + a[j2 + 1];
  1469. y0r = a[j + 2] + a[j2 + 2];
  1470. y0i = -a[j + 3] - a[j2 + 3];
  1471. y1r = a[j + 2] - a[j2 + 2];
  1472. y1i = -a[j + 3] + a[j2 + 3];
  1473. x2r = a[j1] + a[j3];
  1474. x2i = a[j1 + 1] + a[j3 + 1];
  1475. x3r = a[j1] - a[j3];
  1476. x3i = a[j1 + 1] - a[j3 + 1];
  1477. y2r = a[j1 + 2] + a[j3 + 2];
  1478. y2i = a[j1 + 3] + a[j3 + 3];
  1479. y3r = a[j1 + 2] - a[j3 + 2];
  1480. y3i = a[j1 + 3] - a[j3 + 3];
  1481. a[j] = x0r + x2r;
  1482. a[j + 1] = x0i - x2i;
  1483. a[j + 2] = y0r + y2r;
  1484. a[j + 3] = y0i - y2i;
  1485. a[j1] = x0r - x2r;
  1486. a[j1 + 1] = x0i + x2i;
  1487. a[j1 + 2] = y0r - y2r;
  1488. a[j1 + 3] = y0i + y2i;
  1489. x0r = x1r + x3i;
  1490. x0i = x1i + x3r;
  1491. a[j2] = wk1r * x0r - wk1i * x0i;
  1492. a[j2 + 1] = wk1r * x0i + wk1i * x0r;
  1493. x0r = y1r + y3i;
  1494. x0i = y1i + y3r;
  1495. a[j2 + 2] = wd1r * x0r - wd1i * x0i;
  1496. a[j2 + 3] = wd1r * x0i + wd1i * x0r;
  1497. x0r = x1r - x3i;
  1498. x0i = x1i - x3r;
  1499. a[j3] = wk3r * x0r + wk3i * x0i;
  1500. a[j3 + 1] = wk3r * x0i - wk3i * x0r;
  1501. x0r = y1r - y3i;
  1502. x0i = y1i - y3r;
  1503. a[j3 + 2] = wd3r * x0r + wd3i * x0i;
  1504. a[j3 + 3] = wd3r * x0i - wd3i * x0r;
  1505. j0 = m - j;
  1506. j1 = j0 + m;
  1507. j2 = j1 + m;
  1508. j3 = j2 + m;
  1509. x0r = a[j0] + a[j2];
  1510. x0i = -a[j0 + 1] - a[j2 + 1];
  1511. x1r = a[j0] - a[j2];
  1512. x1i = -a[j0 + 1] + a[j2 + 1];
  1513. y0r = a[j0 - 2] + a[j2 - 2];
  1514. y0i = -a[j0 - 1] - a[j2 - 1];
  1515. y1r = a[j0 - 2] - a[j2 - 2];
  1516. y1i = -a[j0 - 1] + a[j2 - 1];
  1517. x2r = a[j1] + a[j3];
  1518. x2i = a[j1 + 1] + a[j3 + 1];
  1519. x3r = a[j1] - a[j3];
  1520. x3i = a[j1 + 1] - a[j3 + 1];
  1521. y2r = a[j1 - 2] + a[j3 - 2];
  1522. y2i = a[j1 - 1] + a[j3 - 1];
  1523. y3r = a[j1 - 2] - a[j3 - 2];
  1524. y3i = a[j1 - 1] - a[j3 - 1];
  1525. a[j0] = x0r + x2r;
  1526. a[j0 + 1] = x0i - x2i;
  1527. a[j0 - 2] = y0r + y2r;
  1528. a[j0 - 1] = y0i - y2i;
  1529. a[j1] = x0r - x2r;
  1530. a[j1 + 1] = x0i + x2i;
  1531. a[j1 - 2] = y0r - y2r;
  1532. a[j1 - 1] = y0i + y2i;
  1533. x0r = x1r + x3i;
  1534. x0i = x1i + x3r;
  1535. a[j2] = wk1i * x0r - wk1r * x0i;
  1536. a[j2 + 1] = wk1i * x0i + wk1r * x0r;
  1537. x0r = y1r + y3i;
  1538. x0i = y1i + y3r;
  1539. a[j2 - 2] = wd1i * x0r - wd1r * x0i;
  1540. a[j2 - 1] = wd1i * x0i + wd1r * x0r;
  1541. x0r = x1r - x3i;
  1542. x0i = x1i - x3r;
  1543. a[j3] = wk3i * x0r + wk3r * x0i;
  1544. a[j3 + 1] = wk3i * x0i - wk3r * x0r;
  1545. x0r = y1r - y3i;
  1546. x0i = y1i - y3r;
  1547. a[j3 - 2] = wd3i * x0r + wd3r * x0i;
  1548. a[j3 - 1] = wd3i * x0i - wd3r * x0r;
  1549. }
  1550. wk1r = csc1 * (wd1r + wn4r);
  1551. wk1i = csc1 * (wd1i + wn4r);
  1552. wk3r = csc3 * (wd3r - wn4r);
  1553. wk3i = csc3 * (wd3i - wn4r);
  1554. j0 = mh;
  1555. j1 = j0 + m;
  1556. j2 = j1 + m;
  1557. j3 = j2 + m;
  1558. x0r = a[j0 - 2] + a[j2 - 2];
  1559. x0i = -a[j0 - 1] - a[j2 - 1];
  1560. x1r = a[j0 - 2] - a[j2 - 2];
  1561. x1i = -a[j0 - 1] + a[j2 - 1];
  1562. x2r = a[j1 - 2] + a[j3 - 2];
  1563. x2i = a[j1 - 1] + a[j3 - 1];
  1564. x3r = a[j1 - 2] - a[j3 - 2];
  1565. x3i = a[j1 - 1] - a[j3 - 1];
  1566. a[j0 - 2] = x0r + x2r;
  1567. a[j0 - 1] = x0i - x2i;
  1568. a[j1 - 2] = x0r - x2r;
  1569. a[j1 - 1] = x0i + x2i;
  1570. x0r = x1r + x3i;
  1571. x0i = x1i + x3r;
  1572. a[j2 - 2] = wk1r * x0r - wk1i * x0i;
  1573. a[j2 - 1] = wk1r * x0i + wk1i * x0r;
  1574. x0r = x1r - x3i;
  1575. x0i = x1i - x3r;
  1576. a[j3 - 2] = wk3r * x0r + wk3i * x0i;
  1577. a[j3 - 1] = wk3r * x0i - wk3i * x0r;
  1578. x0r = a[j0] + a[j2];
  1579. x0i = -a[j0 + 1] - a[j2 + 1];
  1580. x1r = a[j0] - a[j2];
  1581. x1i = -a[j0 + 1] + a[j2 + 1];
  1582. x2r = a[j1] + a[j3];
  1583. x2i = a[j1 + 1] + a[j3 + 1];
  1584. x3r = a[j1] - a[j3];
  1585. x3i = a[j1 + 1] - a[j3 + 1];
  1586. a[j0] = x0r + x2r;
  1587. a[j0 + 1] = x0i - x2i;
  1588. a[j1] = x0r - x2r;
  1589. a[j1 + 1] = x0i + x2i;
  1590. x0r = x1r + x3i;
  1591. x0i = x1i + x3r;
  1592. a[j2] = wn4r * (x0r - x0i);
  1593. a[j2 + 1] = wn4r * (x0i + x0r);
  1594. x0r = x1r - x3i;
  1595. x0i = x1i - x3r;
  1596. a[j3] = -wn4r * (x0r + x0i);
  1597. a[j3 + 1] = -wn4r * (x0i - x0r);
  1598. x0r = a[j0 + 2] + a[j2 + 2];
  1599. x0i = -a[j0 + 3] - a[j2 + 3];
  1600. x1r = a[j0 + 2] - a[j2 + 2];
  1601. x1i = -a[j0 + 3] + a[j2 + 3];
  1602. x2r = a[j1 + 2] + a[j3 + 2];
  1603. x2i = a[j1 + 3] + a[j3 + 3];
  1604. x3r = a[j1 + 2] - a[j3 + 2];
  1605. x3i = a[j1 + 3] - a[j3 + 3];
  1606. a[j0 + 2] = x0r + x2r;
  1607. a[j0 + 3] = x0i - x2i;
  1608. a[j1 + 2] = x0r - x2r;
  1609. a[j1 + 3] = x0i + x2i;
  1610. x0r = x1r + x3i;
  1611. x0i = x1i + x3r;
  1612. a[j2 + 2] = wk1i * x0r - wk1r * x0i;
  1613. a[j2 + 3] = wk1i * x0i + wk1r * x0r;
  1614. x0r = x1r - x3i;
  1615. x0i = x1i - x3r;
  1616. a[j3 + 2] = wk3i * x0r + wk3r * x0i;
  1617. a[j3 + 3] = wk3i * x0i - wk3r * x0r;
  1618. }
  1619. void cftrec4(int n, double *a, int nw, double *w) {
  1620. int cfttree(int n, int j, int k, double *a, int nw, double *w);
  1621. void cftleaf(int n, int isplt, double *a, int nw, double *w);
  1622. void cftmdl1(int n, double *a, double *w);
  1623. int isplt, j, k, m;
  1624. m = n;
  1625. while (m > 512) {
  1626. m >>= 2;
  1627. cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);
  1628. }
  1629. cftleaf(m, 1, &a[n - m], nw, w);
  1630. k = 0;
  1631. for (j = n - m; j > 0; j -= m) {
  1632. k++;
  1633. isplt = cfttree(m, j, k, a, nw, w);
  1634. cftleaf(m, isplt, &a[j - m], nw, w);
  1635. }
  1636. }
  1637. int cfttree(int n, int j, int k, double *a, int nw, double *w) {
  1638. void cftmdl1(int n, double *a, double *w);
  1639. void cftmdl2(int n, double *a, double *w);
  1640. int i, isplt, m;
  1641. if ((k & 3) != 0) {
  1642. isplt = k & 1;
  1643. if (isplt != 0) {
  1644. cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]);
  1645. } else {
  1646. cftmdl2(n, &a[j - n], &w[nw - n]);
  1647. }
  1648. } else {
  1649. m = n;
  1650. for (i = k; (i & 3) == 0; i >>= 2) {
  1651. m <<= 2;
  1652. }
  1653. isplt = i & 1;
  1654. if (isplt != 0) {
  1655. while (m > 128) {
  1656. cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]);
  1657. m >>= 2;
  1658. }
  1659. } else {
  1660. while (m > 128) {
  1661. cftmdl2(m, &a[j - m], &w[nw - m]);
  1662. m >>= 2;
  1663. }
  1664. }
  1665. }
  1666. return isplt;
  1667. }
  1668. void cftleaf(int n, int isplt, double *a, int nw, double *w) {
  1669. void cftmdl1(int n, double *a, double *w);
  1670. void cftmdl2(int n, double *a, double *w);
  1671. void cftf161(double *a, double *w);
  1672. void cftf162(double *a, double *w);
  1673. void cftf081(double *a, double *w);
  1674. void cftf082(double *a, double *w);
  1675. if (n == 512) {
  1676. cftmdl1(128, a, &w[nw - 64]);
  1677. cftf161(a, &w[nw - 8]);
  1678. cftf162(&a[32], &w[nw - 32]);
  1679. cftf161(&a[64], &w[nw - 8]);
  1680. cftf161(&a[96], &w[nw - 8]);
  1681. cftmdl2(128, &a[128], &w[nw - 128]);
  1682. cftf161(&a[128], &w[nw - 8]);
  1683. cftf162(&a[160], &w[nw - 32]);
  1684. cftf161(&a[192], &w[nw - 8]);
  1685. cftf162(&a[224], &w[nw - 32]);
  1686. cftmdl1(128, &a[256], &w[nw - 64]);
  1687. cftf161(&a[256], &w[nw - 8]);
  1688. cftf162(&a[288], &w[nw - 32]);
  1689. cftf161(&a[320], &w[nw - 8]);
  1690. cftf161(&a[352], &w[nw - 8]);
  1691. if (isplt != 0) {
  1692. cftmdl1(128, &a[384], &w[nw - 64]);
  1693. cftf161(&a[480], &w[nw - 8]);
  1694. } else {
  1695. cftmdl2(128, &a[384], &w[nw - 128]);
  1696. cftf162(&a[480], &w[nw - 32]);
  1697. }
  1698. cftf161(&a[384], &w[nw - 8]);
  1699. cftf162(&a[416], &w[nw - 32]);
  1700. cftf161(&a[448], &w[nw - 8]);
  1701. } else {
  1702. cftmdl1(64, a, &w[nw - 32]);
  1703. cftf081(a, &w[nw - 8]);
  1704. cftf082(&a[16], &w[nw - 8]);
  1705. cftf081(&a[32], &w[nw - 8]);
  1706. cftf081(&a[48], &w[nw - 8]);
  1707. cftmdl2(64, &a[64], &w[nw - 64]);
  1708. cftf081(&a[64], &w[nw - 8]);
  1709. cftf082(&a[80], &w[nw - 8]);
  1710. cftf081(&a[96], &w[nw - 8]);
  1711. cftf082(&a[112], &w[nw - 8]);
  1712. cftmdl1(64, &a[128], &w[nw - 32]);
  1713. cftf081(&a[128], &w[nw - 8]);
  1714. cftf082(&a[144], &w[nw - 8]);
  1715. cftf081(&a[160], &w[nw - 8]);
  1716. cftf081(&a[176], &w[nw - 8]);
  1717. if (isplt != 0) {
  1718. cftmdl1(64, &a[192], &w[nw - 32]);
  1719. cftf081(&a[240], &w[nw - 8]);
  1720. } else {
  1721. cftmdl2(64, &a[192], &w[nw - 64]);
  1722. cftf082(&a[240], &w[nw - 8]);
  1723. }
  1724. cftf081(&a[192], &w[nw - 8]);
  1725. cftf082(&a[208], &w[nw - 8]);
  1726. cftf081(&a[224], &w[nw - 8]);
  1727. }
  1728. }
  1729. void cftmdl1(int n, double *a, double *w) {
  1730. int j, j0, j1, j2, j3, k, m, mh;
  1731. double wn4r, wk1r, wk1i, wk3r, wk3i;
  1732. double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
  1733. mh = n >> 3;
  1734. m = 2 * mh;
  1735. j1 = m;
  1736. j2 = j1 + m;
  1737. j3 = j2 + m;
  1738. x0r = a[0] + a[j2];
  1739. x0i = a[1] + a[j2 + 1];
  1740. x1r = a[0] - a[j2];
  1741. x1i = a[1] - a[j2 + 1];
  1742. x2r = a[j1] + a[j3];
  1743. x2i = a[j1 + 1] + a[j3 + 1];
  1744. x3r = a[j1] - a[j3];
  1745. x3i = a[j1 + 1] - a[j3 + 1];
  1746. a[0] = x0r + x2r;
  1747. a[1] = x0i + x2i;
  1748. a[j1] = x0r - x2r;
  1749. a[j1 + 1] = x0i - x2i;
  1750. a[j2] = x1r - x3i;
  1751. a[j2 + 1] = x1i + x3r;
  1752. a[j3] = x1r + x3i;
  1753. a[j3 + 1] = x1i - x3r;
  1754. wn4r = w[1];
  1755. k = 0;
  1756. for (j = 2; j < mh; j += 2) {
  1757. k += 4;
  1758. wk1r = w[k];
  1759. wk1i = w[k + 1];
  1760. wk3r = w[k + 2];
  1761. wk3i = w[k + 3];
  1762. j1 = j + m;
  1763. j2 = j1 + m;
  1764. j3 = j2 + m;
  1765. x0r = a[j] + a[j2];
  1766. x0i = a[j + 1] + a[j2 + 1];
  1767. x1r = a[j] - a[j2];
  1768. x1i = a[j + 1] - a[j2 + 1];
  1769. x2r = a[j1] + a[j3];
  1770. x2i = a[j1 + 1] + a[j3 + 1];
  1771. x3r = a[j1] - a[j3];
  1772. x3i = a[j1 + 1] - a[j3 + 1];
  1773. a[j] = x0r + x2r;
  1774. a[j + 1] = x0i + x2i;
  1775. a[j1] = x0r - x2r;
  1776. a[j1 + 1] = x0i - x2i;
  1777. x0r = x1r - x3i;
  1778. x0i = x1i + x3r;
  1779. a[j2] = wk1r * x0r - wk1i * x0i;
  1780. a[j2 + 1] = wk1r * x0i + wk1i * x0r;
  1781. x0r = x1r + x3i;
  1782. x0i = x1i - x3r;
  1783. a[j3] = wk3r * x0r + wk3i * x0i;
  1784. a[j3 + 1] = wk3r * x0i - wk3i * x0r;
  1785. j0 = m - j;
  1786. j1 = j0 + m;
  1787. j2 = j1 + m;
  1788. j3 = j2 + m;
  1789. x0r = a[j0] + a[j2];
  1790. x0i = a[j0 + 1] + a[j2 + 1];
  1791. x1r = a[j0] - a[j2];
  1792. x1i = a[j0 + 1] - a[j2 + 1];
  1793. x2r = a[j1] + a[j3];
  1794. x2i = a[j1 + 1] + a[j3 + 1];
  1795. x3r = a[j1] - a[j3];
  1796. x3i = a[j1 + 1] - a[j3 + 1];
  1797. a[j0] = x0r + x2r;
  1798. a[j0 + 1] = x0i + x2i;
  1799. a[j1] = x0r - x2r;
  1800. a[j1 + 1] = x0i - x2i;
  1801. x0r = x1r - x3i;
  1802. x0i = x1i + x3r;
  1803. a[j2] = wk1i * x0r - wk1r * x0i;
  1804. a[j2 + 1] = wk1i * x0i + wk1r * x0r;
  1805. x0r = x1r + x3i;
  1806. x0i = x1i - x3r;
  1807. a[j3] = wk3i * x0r + wk3r * x0i;
  1808. a[j3 + 1] = wk3i * x0i - wk3r * x0r;
  1809. }
  1810. j0 = mh;
  1811. j1 = j0 + m;
  1812. j2 = j1 + m;
  1813. j3 = j2 + m;
  1814. x0r = a[j0] + a[j2];
  1815. x0i = a[j0 + 1] + a[j2 + 1];
  1816. x1r = a[j0] - a[j2];
  1817. x1i = a[j0 + 1] - a[j2 + 1];
  1818. x2r = a[j1] + a[j3];
  1819. x2i = a[j1 + 1] + a[j3 + 1];
  1820. x3r = a[j1] - a[j3];
  1821. x3i = a[j1 + 1] - a[j3 + 1];
  1822. a[j0] = x0r + x2r;
  1823. a[j0 + 1] = x0i + x2i;
  1824. a[j1] = x0r - x2r;
  1825. a[j1 + 1] = x0i - x2i;
  1826. x0r = x1r - x3i;
  1827. x0i = x1i + x3r;
  1828. a[j2] = wn4r * (x0r - x0i);
  1829. a[j2 + 1] = wn4r * (x0i + x0r);
  1830. x0r = x1r + x3i;
  1831. x0i = x1i - x3r;
  1832. a[j3] = -wn4r * (x0r + x0i);
  1833. a[j3 + 1] = -wn4r * (x0i - x0r);
  1834. }
  1835. void cftmdl2(int n, double *a, double *w) {
  1836. int j, j0, j1, j2, j3, k, kr, m, mh;
  1837. double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i;
  1838. double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i;
  1839. mh = n >> 3;
  1840. m = 2 * mh;
  1841. wn4r = w[1];
  1842. j1 = m;
  1843. j2 = j1 + m;
  1844. j3 = j2 + m;
  1845. x0r = a[0] - a[j2 + 1];
  1846. x0i = a[1] + a[j2];
  1847. x1r = a[0] + a[j2 + 1];
  1848. x1i = a[1] - a[j2];
  1849. x2r = a[j1] - a[j3 + 1];
  1850. x2i = a[j1 + 1] + a[j3];
  1851. x3r = a[j1] + a[j3 + 1];
  1852. x3i = a[j1 + 1] - a[j3];
  1853. y0r = wn4r * (x2r - x2i);
  1854. y0i = wn4r * (x2i + x2r);
  1855. a[0] = x0r + y0r;
  1856. a[1] = x0i + y0i;
  1857. a[j1] = x0r - y0r;
  1858. a[j1 + 1] = x0i - y0i;
  1859. y0r = wn4r * (x3r - x3i);
  1860. y0i = wn4r * (x3i + x3r);
  1861. a[j2] = x1r - y0i;
  1862. a[j2 + 1] = x1i + y0r;
  1863. a[j3] = x1r + y0i;
  1864. a[j3 + 1] = x1i - y0r;
  1865. k = 0;
  1866. kr = 2 * m;
  1867. for (j = 2; j < mh; j += 2) {
  1868. k += 4;
  1869. wk1r = w[k];
  1870. wk1i = w[k + 1];
  1871. wk3r = w[k + 2];
  1872. wk3i = w[k + 3];
  1873. kr -= 4;
  1874. wd1i = w[kr];
  1875. wd1r = w[kr + 1];
  1876. wd3i = w[kr + 2];
  1877. wd3r = w[kr + 3];
  1878. j1 = j + m;
  1879. j2 = j1 + m;
  1880. j3 = j2 + m;
  1881. x0r = a[j] - a[j2 + 1];
  1882. x0i = a[j + 1] + a[j2];
  1883. x1r = a[j] + a[j2 + 1];
  1884. x1i = a[j + 1] - a[j2];
  1885. x2r = a[j1] - a[j3 + 1];
  1886. x2i = a[j1 + 1] + a[j3];
  1887. x3r = a[j1] + a[j3 + 1];
  1888. x3i = a[j1 + 1] - a[j3];
  1889. y0r = wk1r * x0r - wk1i * x0i;
  1890. y0i = wk1r * x0i + wk1i * x0r;
  1891. y2r = wd1r * x2r - wd1i * x2i;
  1892. y2i = wd1r * x2i + wd1i * x2r;
  1893. a[j] = y0r + y2r;
  1894. a[j + 1] = y0i + y2i;
  1895. a[j1] = y0r - y2r;
  1896. a[j1 + 1] = y0i - y2i;
  1897. y0r = wk3r * x1r + wk3i * x1i;
  1898. y0i = wk3r * x1i - wk3i * x1r;
  1899. y2r = wd3r * x3r + wd3i * x3i;
  1900. y2i = wd3r * x3i - wd3i * x3r;
  1901. a[j2] = y0r + y2r;
  1902. a[j2 + 1] = y0i + y2i;
  1903. a[j3] = y0r - y2r;
  1904. a[j3 + 1] = y0i - y2i;
  1905. j0 = m - j;
  1906. j1 = j0 + m;
  1907. j2 = j1 + m;
  1908. j3 = j2 + m;
  1909. x0r = a[j0] - a[j2 + 1];
  1910. x0i = a[j0 + 1] + a[j2];
  1911. x1r = a[j0] + a[j2 + 1];
  1912. x1i = a[j0 + 1] - a[j2];
  1913. x2r = a[j1] - a[j3 + 1];
  1914. x2i = a[j1 + 1] + a[j3];
  1915. x3r = a[j1] + a[j3 + 1];
  1916. x3i = a[j1 + 1] - a[j3];
  1917. y0r = wd1i * x0r - wd1r * x0i;
  1918. y0i = wd1i * x0i + wd1r * x0r;
  1919. y2r = wk1i * x2r - wk1r * x2i;
  1920. y2i = wk1i * x2i + wk1r * x2r;
  1921. a[j0] = y0r + y2r;
  1922. a[j0 + 1] = y0i + y2i;
  1923. a[j1] = y0r - y2r;
  1924. a[j1 + 1] = y0i - y2i;
  1925. y0r = wd3i * x1r + wd3r * x1i;
  1926. y0i = wd3i * x1i - wd3r * x1r;
  1927. y2r = wk3i * x3r + wk3r * x3i;
  1928. y2i = wk3i * x3i - wk3r * x3r;
  1929. a[j2] = y0r + y2r;
  1930. a[j2 + 1] = y0i + y2i;
  1931. a[j3] = y0r - y2r;
  1932. a[j3 + 1] = y0i - y2i;
  1933. }
  1934. wk1r = w[m];
  1935. wk1i = w[m + 1];
  1936. j0 = mh;
  1937. j1 = j0 + m;
  1938. j2 = j1 + m;
  1939. j3 = j2 + m;
  1940. x0r = a[j0] - a[j2 + 1];
  1941. x0i = a[j0 + 1] + a[j2];
  1942. x1r = a[j0] + a[j2 + 1];
  1943. x1i = a[j0 + 1] - a[j2];
  1944. x2r = a[j1] - a[j3 + 1];
  1945. x2i = a[j1 + 1] + a[j3];
  1946. x3r = a[j1] + a[j3 + 1];
  1947. x3i = a[j1 + 1] - a[j3];
  1948. y0r = wk1r * x0r - wk1i * x0i;
  1949. y0i = wk1r * x0i + wk1i * x0r;
  1950. y2r = wk1i * x2r - wk1r * x2i;
  1951. y2i = wk1i * x2i + wk1r * x2r;
  1952. a[j0] = y0r + y2r;
  1953. a[j0 + 1] = y0i + y2i;
  1954. a[j1] = y0r - y2r;
  1955. a[j1 + 1] = y0i - y2i;
  1956. y0r = wk1i * x1r - wk1r * x1i;
  1957. y0i = wk1i * x1i + wk1r * x1r;
  1958. y2r = wk1r * x3r - wk1i * x3i;
  1959. y2i = wk1r * x3i + wk1i * x3r;
  1960. a[j2] = y0r - y2r;
  1961. a[j2 + 1] = y0i - y2i;
  1962. a[j3] = y0r + y2r;
  1963. a[j3 + 1] = y0i + y2i;
  1964. }
  1965. void cftfx41(int n, double *a, int nw, double *w) {
  1966. void cftf161(double *a, double *w);
  1967. void cftf162(double *a, double *w);
  1968. void cftf081(double *a, double *w);
  1969. void cftf082(double *a, double *w);
  1970. if (n == 128) {
  1971. cftf161(a, &w[nw - 8]);
  1972. cftf162(&a[32], &w[nw - 32]);
  1973. cftf161(&a[64], &w[nw - 8]);
  1974. cftf161(&a[96], &w[nw - 8]);
  1975. } else {
  1976. cftf081(a, &w[nw - 8]);
  1977. cftf082(&a[16], &w[nw - 8]);
  1978. cftf081(&a[32], &w[nw - 8]);
  1979. cftf081(&a[48], &w[nw - 8]);
  1980. }
  1981. }
  1982. void cftf161(double *a, double *w) {
  1983. double wn4r, wk1r, wk1i,
  1984. x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i,
  1985. y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i,
  1986. y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i,
  1987. y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i,
  1988. y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
  1989. wn4r = w[1];
  1990. wk1r = w[2];
  1991. wk1i = w[3];
  1992. x0r = a[0] + a[16];
  1993. x0i = a[1] + a[17];
  1994. x1r = a[0] - a[16];
  1995. x1i = a[1] - a[17];
  1996. x2r = a[8] + a[24];
  1997. x2i = a[9] + a[25];
  1998. x3r = a[8] - a[24];
  1999. x3i = a[9] - a[25];
  2000. y0r = x0r + x2r;
  2001. y0i = x0i + x2i;
  2002. y4r = x0r - x2r;
  2003. y4i = x0i - x2i;
  2004. y8r = x1r - x3i;
  2005. y8i = x1i + x3r;
  2006. y12r = x1r + x3i;
  2007. y12i = x1i - x3r;
  2008. x0r = a[2] + a[18];
  2009. x0i = a[3] + a[19];
  2010. x1r = a[2] - a[18];
  2011. x1i = a[3] - a[19];
  2012. x2r = a[10] + a[26];
  2013. x2i = a[11] + a[27];
  2014. x3r = a[10] - a[26];
  2015. x3i = a[11] - a[27];
  2016. y1r = x0r + x2r;
  2017. y1i = x0i + x2i;
  2018. y5r = x0r - x2r;
  2019. y5i = x0i - x2i;
  2020. x0r = x1r - x3i;
  2021. x0i = x1i + x3r;
  2022. y9r = wk1r * x0r - wk1i * x0i;
  2023. y9i = wk1r * x0i + wk1i * x0r;
  2024. x0r = x1r + x3i;
  2025. x0i = x1i - x3r;
  2026. y13r = wk1i * x0r - wk1r * x0i;
  2027. y13i = wk1i * x0i + wk1r * x0r;
  2028. x0r = a[4] + a[20];
  2029. x0i = a[5] + a[21];
  2030. x1r = a[4] - a[20];
  2031. x1i = a[5] - a[21];
  2032. x2r = a[12] + a[28];
  2033. x2i = a[13] + a[29];
  2034. x3r = a[12] - a[28];
  2035. x3i = a[13] - a[29];
  2036. y2r = x0r + x2r;
  2037. y2i = x0i + x2i;
  2038. y6r = x0r - x2r;
  2039. y6i = x0i - x2i;
  2040. x0r = x1r - x3i;
  2041. x0i = x1i + x3r;
  2042. y10r = wn4r * (x0r - x0i);
  2043. y10i = wn4r * (x0i + x0r);
  2044. x0r = x1r + x3i;
  2045. x0i = x1i - x3r;
  2046. y14r = wn4r * (x0r + x0i);
  2047. y14i = wn4r * (x0i - x0r);
  2048. x0r = a[6] + a[22];
  2049. x0i = a[7] + a[23];
  2050. x1r = a[6] - a[22];
  2051. x1i = a[7] - a[23];
  2052. x2r = a[14] + a[30];
  2053. x2i = a[15] + a[31];
  2054. x3r = a[14] - a[30];
  2055. x3i = a[15] - a[31];
  2056. y3r = x0r + x2r;
  2057. y3i = x0i + x2i;
  2058. y7r = x0r - x2r;
  2059. y7i = x0i - x2i;
  2060. x0r = x1r - x3i;
  2061. x0i = x1i + x3r;
  2062. y11r = wk1i * x0r - wk1r * x0i;
  2063. y11i = wk1i * x0i + wk1r * x0r;
  2064. x0r = x1r + x3i;
  2065. x0i = x1i - x3r;
  2066. y15r = wk1r * x0r - wk1i * x0i;
  2067. y15i = wk1r * x0i + wk1i * x0r;
  2068. x0r = y12r - y14r;
  2069. x0i = y12i - y14i;
  2070. x1r = y12r + y14r;
  2071. x1i = y12i + y14i;
  2072. x2r = y13r - y15r;
  2073. x2i = y13i - y15i;
  2074. x3r = y13r + y15r;
  2075. x3i = y13i + y15i;
  2076. a[24] = x0r + x2r;
  2077. a[25] = x0i + x2i;
  2078. a[26] = x0r - x2r;
  2079. a[27] = x0i - x2i;
  2080. a[28] = x1r - x3i;
  2081. a[29] = x1i + x3r;
  2082. a[30] = x1r + x3i;
  2083. a[31] = x1i - x3r;
  2084. x0r = y8r + y10r;
  2085. x0i = y8i + y10i;
  2086. x1r = y8r - y10r;
  2087. x1i = y8i - y10i;
  2088. x2r = y9r + y11r;
  2089. x2i = y9i + y11i;
  2090. x3r = y9r - y11r;
  2091. x3i = y9i - y11i;
  2092. a[16] = x0r + x2r;
  2093. a[17] = x0i + x2i;
  2094. a[18] = x0r - x2r;
  2095. a[19] = x0i - x2i;
  2096. a[20] = x1r - x3i;
  2097. a[21] = x1i + x3r;
  2098. a[22] = x1r + x3i;
  2099. a[23] = x1i - x3r;
  2100. x0r = y5r - y7i;
  2101. x0i = y5i + y7r;
  2102. x2r = wn4r * (x0r - x0i);
  2103. x2i = wn4r * (x0i + x0r);
  2104. x0r = y5r + y7i;
  2105. x0i = y5i - y7r;
  2106. x3r = wn4r * (x0r - x0i);
  2107. x3i = wn4r * (x0i + x0r);
  2108. x0r = y4r - y6i;
  2109. x0i = y4i + y6r;
  2110. x1r = y4r + y6i;
  2111. x1i = y4i - y6r;
  2112. a[8] = x0r + x2r;
  2113. a[9] = x0i + x2i;
  2114. a[10] = x0r - x2r;
  2115. a[11] = x0i - x2i;
  2116. a[12] = x1r - x3i;
  2117. a[13] = x1i + x3r;
  2118. a[14] = x1r + x3i;
  2119. a[15] = x1i - x3r;
  2120. x0r = y0r + y2r;
  2121. x0i = y0i + y2i;
  2122. x1r = y0r - y2r;
  2123. x1i = y0i - y2i;
  2124. x2r = y1r + y3r;
  2125. x2i = y1i + y3i;
  2126. x3r = y1r - y3r;
  2127. x3i = y1i - y3i;
  2128. a[0] = x0r + x2r;
  2129. a[1] = x0i + x2i;
  2130. a[2] = x0r - x2r;
  2131. a[3] = x0i - x2i;
  2132. a[4] = x1r - x3i;
  2133. a[5] = x1i + x3r;
  2134. a[6] = x1r + x3i;
  2135. a[7] = x1i - x3r;
  2136. }
  2137. void cftf162(double *a, double *w) {
  2138. double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i,
  2139. x0r, x0i, x1r, x1i, x2r, x2i,
  2140. y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i,
  2141. y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i,
  2142. y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i,
  2143. y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;
  2144. wn4r = w[1];
  2145. wk1r = w[4];
  2146. wk1i = w[5];
  2147. wk3r = w[6];
  2148. wk3i = -w[7];
  2149. wk2r = w[8];
  2150. wk2i = w[9];
  2151. x1r = a[0] - a[17];
  2152. x1i = a[1] + a[16];
  2153. x0r = a[8] - a[25];
  2154. x0i = a[9] + a[24];
  2155. x2r = wn4r * (x0r - x0i);
  2156. x2i = wn4r * (x0i + x0r);
  2157. y0r = x1r + x2r;
  2158. y0i = x1i + x2i;
  2159. y4r = x1r - x2r;
  2160. y4i = x1i - x2i;
  2161. x1r = a[0] + a[17];
  2162. x1i = a[1] - a[16];
  2163. x0r = a[8] + a[25];
  2164. x0i = a[9] - a[24];
  2165. x2r = wn4r * (x0r - x0i);
  2166. x2i = wn4r * (x0i + x0r);
  2167. y8r = x1r - x2i;
  2168. y8i = x1i + x2r;
  2169. y12r = x1r + x2i;
  2170. y12i = x1i - x2r;
  2171. x0r = a[2] - a[19];
  2172. x0i = a[3] + a[18];
  2173. x1r = wk1r * x0r - wk1i * x0i;
  2174. x1i = wk1r * x0i + wk1i * x0r;
  2175. x0r = a[10] - a[27];
  2176. x0i = a[11] + a[26];
  2177. x2r = wk3i * x0r - wk3r * x0i;
  2178. x2i = wk3i * x0i + wk3r * x0r;
  2179. y1r = x1r + x2r;
  2180. y1i = x1i + x2i;
  2181. y5r = x1r - x2r;
  2182. y5i = x1i - x2i;
  2183. x0r = a[2] + a[19];
  2184. x0i = a[3] - a[18];
  2185. x1r = wk3r * x0r - wk3i * x0i;
  2186. x1i = wk3r * x0i + wk3i * x0r;
  2187. x0r = a[10] + a[27];
  2188. x0i = a[11] - a[26];
  2189. x2r = wk1r * x0r + wk1i * x0i;
  2190. x2i = wk1r * x0i - wk1i * x0r;
  2191. y9r = x1r - x2r;
  2192. y9i = x1i - x2i;
  2193. y13r = x1r + x2r;
  2194. y13i = x1i + x2i;
  2195. x0r = a[4] - a[21];
  2196. x0i = a[5] + a[20];
  2197. x1r = wk2r * x0r - wk2i * x0i;
  2198. x1i = wk2r * x0i + wk2i * x0r;
  2199. x0r = a[12] - a[29];
  2200. x0i = a[13] + a[28];
  2201. x2r = wk2i * x0r - wk2r * x0i;
  2202. x2i = wk2i * x0i + wk2r * x0r;
  2203. y2r = x1r + x2r;
  2204. y2i = x1i + x2i;
  2205. y6r = x1r - x2r;
  2206. y6i = x1i - x2i;
  2207. x0r = a[4] + a[21];
  2208. x0i = a[5] - a[20];
  2209. x1r = wk2i * x0r - wk2r * x0i;
  2210. x1i = wk2i * x0i + wk2r * x0r;
  2211. x0r = a[12] + a[29];
  2212. x0i = a[13] - a[28];
  2213. x2r = wk2r * x0r - wk2i * x0i;
  2214. x2i = wk2r * x0i + wk2i * x0r;
  2215. y10r = x1r - x2r;
  2216. y10i = x1i - x2i;
  2217. y14r = x1r + x2r;
  2218. y14i = x1i + x2i;
  2219. x0r = a[6] - a[23];
  2220. x0i = a[7] + a[22];
  2221. x1r = wk3r * x0r - wk3i * x0i;
  2222. x1i = wk3r * x0i + wk3i * x0r;
  2223. x0r = a[14] - a[31];
  2224. x0i = a[15] + a[30];
  2225. x2r = wk1i * x0r - wk1r * x0i;
  2226. x2i = wk1i * x0i + wk1r * x0r;
  2227. y3r = x1r + x2r;
  2228. y3i = x1i + x2i;
  2229. y7r = x1r - x2r;
  2230. y7i = x1i - x2i;
  2231. x0r = a[6] + a[23];
  2232. x0i = a[7] - a[22];
  2233. x1r = wk1i * x0r + wk1r * x0i;
  2234. x1i = wk1i * x0i - wk1r * x0r;
  2235. x0r = a[14] + a[31];
  2236. x0i = a[15] - a[30];
  2237. x2r = wk3i * x0r - wk3r * x0i;
  2238. x2i = wk3i * x0i + wk3r * x0r;
  2239. y11r = x1r + x2r;
  2240. y11i = x1i + x2i;
  2241. y15r = x1r - x2r;
  2242. y15i = x1i - x2i;
  2243. x1r = y0r + y2r;
  2244. x1i = y0i + y2i;
  2245. x2r = y1r + y3r;
  2246. x2i = y1i + y3i;
  2247. a[0] = x1r + x2r;
  2248. a[1] = x1i + x2i;
  2249. a[2] = x1r - x2r;
  2250. a[3] = x1i - x2i;
  2251. x1r = y0r - y2r;
  2252. x1i = y0i - y2i;
  2253. x2r = y1r - y3r;
  2254. x2i = y1i - y3i;
  2255. a[4] = x1r - x2i;
  2256. a[5] = x1i + x2r;
  2257. a[6] = x1r + x2i;
  2258. a[7] = x1i - x2r;
  2259. x1r = y4r - y6i;
  2260. x1i = y4i + y6r;
  2261. x0r = y5r - y7i;
  2262. x0i = y5i + y7r;
  2263. x2r = wn4r * (x0r - x0i);
  2264. x2i = wn4r * (x0i + x0r);
  2265. a[8] = x1r + x2r;
  2266. a[9] = x1i + x2i;
  2267. a[10] = x1r - x2r;
  2268. a[11] = x1i - x2i;
  2269. x1r = y4r + y6i;
  2270. x1i = y4i - y6r;
  2271. x0r = y5r + y7i;
  2272. x0i = y5i - y7r;
  2273. x2r = wn4r * (x0r - x0i);
  2274. x2i = wn4r * (x0i + x0r);
  2275. a[12] = x1r - x2i;
  2276. a[13] = x1i + x2r;
  2277. a[14] = x1r + x2i;
  2278. a[15] = x1i - x2r;
  2279. x1r = y8r + y10r;
  2280. x1i = y8i + y10i;
  2281. x2r = y9r - y11r;
  2282. x2i = y9i - y11i;
  2283. a[16] = x1r + x2r;
  2284. a[17] = x1i + x2i;
  2285. a[18] = x1r - x2r;
  2286. a[19] = x1i - x2i;
  2287. x1r = y8r - y10r;
  2288. x1i = y8i - y10i;
  2289. x2r = y9r + y11r;
  2290. x2i = y9i + y11i;
  2291. a[20] = x1r - x2i;
  2292. a[21] = x1i + x2r;
  2293. a[22] = x1r + x2i;
  2294. a[23] = x1i - x2r;
  2295. x1r = y12r - y14i;
  2296. x1i = y12i + y14r;
  2297. x0r = y13r + y15i;
  2298. x0i = y13i - y15r;
  2299. x2r = wn4r * (x0r - x0i);
  2300. x2i = wn4r * (x0i + x0r);
  2301. a[24] = x1r + x2r;
  2302. a[25] = x1i + x2i;
  2303. a[26] = x1r - x2r;
  2304. a[27] = x1i - x2i;
  2305. x1r = y12r + y14i;
  2306. x1i = y12i - y14r;
  2307. x0r = y13r - y15i;
  2308. x0i = y13i + y15r;
  2309. x2r = wn4r * (x0r - x0i);
  2310. x2i = wn4r * (x0i + x0r);
  2311. a[28] = x1r - x2i;
  2312. a[29] = x1i + x2r;
  2313. a[30] = x1r + x2i;
  2314. a[31] = x1i - x2r;
  2315. }
  2316. void cftf081(double *a, double *w) {
  2317. double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i,
  2318. y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i,
  2319. y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
  2320. wn4r = w[1];
  2321. x0r = a[0] + a[8];
  2322. x0i = a[1] + a[9];
  2323. x1r = a[0] - a[8];
  2324. x1i = a[1] - a[9];
  2325. x2r = a[4] + a[12];
  2326. x2i = a[5] + a[13];
  2327. x3r = a[4] - a[12];
  2328. x3i = a[5] - a[13];
  2329. y0r = x0r + x2r;
  2330. y0i = x0i + x2i;
  2331. y2r = x0r - x2r;
  2332. y2i = x0i - x2i;
  2333. y1r = x1r - x3i;
  2334. y1i = x1i + x3r;
  2335. y3r = x1r + x3i;
  2336. y3i = x1i - x3r;
  2337. x0r = a[2] + a[10];
  2338. x0i = a[3] + a[11];
  2339. x1r = a[2] - a[10];
  2340. x1i = a[3] - a[11];
  2341. x2r = a[6] + a[14];
  2342. x2i = a[7] + a[15];
  2343. x3r = a[6] - a[14];
  2344. x3i = a[7] - a[15];
  2345. y4r = x0r + x2r;
  2346. y4i = x0i + x2i;
  2347. y6r = x0r - x2r;
  2348. y6i = x0i - x2i;
  2349. x0r = x1r - x3i;
  2350. x0i = x1i + x3r;
  2351. x2r = x1r + x3i;
  2352. x2i = x1i - x3r;
  2353. y5r = wn4r * (x0r - x0i);
  2354. y5i = wn4r * (x0r + x0i);
  2355. y7r = wn4r * (x2r - x2i);
  2356. y7i = wn4r * (x2r + x2i);
  2357. a[8] = y1r + y5r;
  2358. a[9] = y1i + y5i;
  2359. a[10] = y1r - y5r;
  2360. a[11] = y1i - y5i;
  2361. a[12] = y3r - y7i;
  2362. a[13] = y3i + y7r;
  2363. a[14] = y3r + y7i;
  2364. a[15] = y3i - y7r;
  2365. a[0] = y0r + y4r;
  2366. a[1] = y0i + y4i;
  2367. a[2] = y0r - y4r;
  2368. a[3] = y0i - y4i;
  2369. a[4] = y2r - y6i;
  2370. a[5] = y2i + y6r;
  2371. a[6] = y2r + y6i;
  2372. a[7] = y2i - y6r;
  2373. }
  2374. void cftf082(double *a, double *w) {
  2375. double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i,
  2376. y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i,
  2377. y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;
  2378. wn4r = w[1];
  2379. wk1r = w[2];
  2380. wk1i = w[3];
  2381. y0r = a[0] - a[9];
  2382. y0i = a[1] + a[8];
  2383. y1r = a[0] + a[9];
  2384. y1i = a[1] - a[8];
  2385. x0r = a[4] - a[13];
  2386. x0i = a[5] + a[12];
  2387. y2r = wn4r * (x0r - x0i);
  2388. y2i = wn4r * (x0i + x0r);
  2389. x0r = a[4] + a[13];
  2390. x0i = a[5] - a[12];
  2391. y3r = wn4r * (x0r - x0i);
  2392. y3i = wn4r * (x0i + x0r);
  2393. x0r = a[2] - a[11];
  2394. x0i = a[3] + a[10];
  2395. y4r = wk1r * x0r - wk1i * x0i;
  2396. y4i = wk1r * x0i + wk1i * x0r;
  2397. x0r = a[2] + a[11];
  2398. x0i = a[3] - a[10];
  2399. y5r = wk1i * x0r - wk1r * x0i;
  2400. y5i = wk1i * x0i + wk1r * x0r;
  2401. x0r = a[6] - a[15];
  2402. x0i = a[7] + a[14];
  2403. y6r = wk1i * x0r - wk1r * x0i;
  2404. y6i = wk1i * x0i + wk1r * x0r;
  2405. x0r = a[6] + a[15];
  2406. x0i = a[7] - a[14];
  2407. y7r = wk1r * x0r - wk1i * x0i;
  2408. y7i = wk1r * x0i + wk1i * x0r;
  2409. x0r = y0r + y2r;
  2410. x0i = y0i + y2i;
  2411. x1r = y4r + y6r;
  2412. x1i = y4i + y6i;
  2413. a[0] = x0r + x1r;
  2414. a[1] = x0i + x1i;
  2415. a[2] = x0r - x1r;
  2416. a[3] = x0i - x1i;
  2417. x0r = y0r - y2r;
  2418. x0i = y0i - y2i;
  2419. x1r = y4r - y6r;
  2420. x1i = y4i - y6i;
  2421. a[4] = x0r - x1i;
  2422. a[5] = x0i + x1r;
  2423. a[6] = x0r + x1i;
  2424. a[7] = x0i - x1r;
  2425. x0r = y1r - y3i;
  2426. x0i = y1i + y3r;
  2427. x1r = y5r - y7r;
  2428. x1i = y5i - y7i;
  2429. a[8] = x0r + x1r;
  2430. a[9] = x0i + x1i;
  2431. a[10] = x0r - x1r;
  2432. a[11] = x0i - x1i;
  2433. x0r = y1r + y3i;
  2434. x0i = y1i - y3r;
  2435. x1r = y5r + y7r;
  2436. x1i = y5i + y7i;
  2437. a[12] = x0r - x1i;
  2438. a[13] = x0i + x1r;
  2439. a[14] = x0r + x1i;
  2440. a[15] = x0i - x1r;
  2441. }
  2442. void cftf040(double *a) {
  2443. double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
  2444. x0r = a[0] + a[4];
  2445. x0i = a[1] + a[5];
  2446. x1r = a[0] - a[4];
  2447. x1i = a[1] - a[5];
  2448. x2r = a[2] + a[6];
  2449. x2i = a[3] + a[7];
  2450. x3r = a[2] - a[6];
  2451. x3i = a[3] - a[7];
  2452. a[0] = x0r + x2r;
  2453. a[1] = x0i + x2i;
  2454. a[2] = x1r - x3i;
  2455. a[3] = x1i + x3r;
  2456. a[4] = x0r - x2r;
  2457. a[5] = x0i - x2i;
  2458. a[6] = x1r + x3i;
  2459. a[7] = x1i - x3r;
  2460. }
  2461. void cftb040(double *a) {
  2462. double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
  2463. x0r = a[0] + a[4];
  2464. x0i = a[1] + a[5];
  2465. x1r = a[0] - a[4];
  2466. x1i = a[1] - a[5];
  2467. x2r = a[2] + a[6];
  2468. x2i = a[3] + a[7];
  2469. x3r = a[2] - a[6];
  2470. x3i = a[3] - a[7];
  2471. a[0] = x0r + x2r;
  2472. a[1] = x0i + x2i;
  2473. a[2] = x1r + x3i;
  2474. a[3] = x1i - x3r;
  2475. a[4] = x0r - x2r;
  2476. a[5] = x0i - x2i;
  2477. a[6] = x1r - x3i;
  2478. a[7] = x1i + x3r;
  2479. }
  2480. void cftx020(double *a) {
  2481. double x0r, x0i;
  2482. x0r = a[0] - a[2];
  2483. x0i = a[1] - a[3];
  2484. a[0] += a[2];
  2485. a[1] += a[3];
  2486. a[2] = x0r;
  2487. a[3] = x0i;
  2488. }
  2489. void rftfsub(int n, double *a, int nc, double *c) {
  2490. int j, k, kk, ks, m;
  2491. double wkr, wki, xr, xi, yr, yi;
  2492. m = n >> 1;
  2493. ks = 2 * nc / m;
  2494. kk = 0;
  2495. for (j = 2; j < m; j += 2) {
  2496. k = n - j;
  2497. kk += ks;
  2498. wkr = 0.5 - c[nc - kk];
  2499. wki = c[kk];
  2500. xr = a[j] - a[k];
  2501. xi = a[j + 1] + a[k + 1];
  2502. yr = wkr * xr - wki * xi;
  2503. yi = wkr * xi + wki * xr;
  2504. a[j] -= yr;
  2505. a[j + 1] -= yi;
  2506. a[k] += yr;
  2507. a[k + 1] -= yi;
  2508. }
  2509. }
  2510. void rftbsub(int n, double *a, int nc, double *c) {
  2511. int j, k, kk, ks, m;
  2512. double wkr, wki, xr, xi, yr, yi;
  2513. m = n >> 1;
  2514. ks = 2 * nc / m;
  2515. kk = 0;
  2516. for (j = 2; j < m; j += 2) {
  2517. k = n - j;
  2518. kk += ks;
  2519. wkr = 0.5 - c[nc - kk];
  2520. wki = c[kk];
  2521. xr = a[j] - a[k];
  2522. xi = a[j + 1] + a[k + 1];
  2523. yr = wkr * xr + wki * xi;
  2524. yi = wkr * xi - wki * xr;
  2525. a[j] -= yr;
  2526. a[j + 1] -= yi;
  2527. a[k] += yr;
  2528. a[k + 1] -= yi;
  2529. }
  2530. }
  2531. void dctsub(int n, double *a, int nc, double *c) {
  2532. int j, k, kk, ks, m;
  2533. double wkr, wki, xr;
  2534. m = n >> 1;
  2535. ks = nc / n;
  2536. kk = 0;
  2537. for (j = 1; j < m; j++) {
  2538. k = n - j;
  2539. kk += ks;
  2540. wkr = c[kk] - c[nc - kk];
  2541. wki = c[kk] + c[nc - kk];
  2542. xr = wki * a[j] - wkr * a[k];
  2543. a[j] = wkr * a[j] + wki * a[k];
  2544. a[k] = xr;
  2545. }
  2546. a[m] *= c[0];
  2547. }
  2548. void dstsub(int n, double *a, int nc, double *c) {
  2549. int j, k, kk, ks, m;
  2550. double wkr, wki, xr;
  2551. m = n >> 1;
  2552. ks = nc / n;
  2553. kk = 0;
  2554. for (j = 1; j < m; j++) {
  2555. k = n - j;
  2556. kk += ks;
  2557. wkr = c[kk] - c[nc - kk];
  2558. wki = c[kk] + c[nc - kk];
  2559. xr = wki * a[k] - wkr * a[j];
  2560. a[k] = wkr * a[k] + wki * a[j];
  2561. a[j] = xr;
  2562. }
  2563. a[m] *= c[0];
  2564. }