filters0.c 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428
  1. /*
  2. * Copyright (c) 1983-2023 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. /* floatsams version*/
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <structures.h>
  25. #include <tkglobals.h>
  26. #include <globcon.h>
  27. #include <processno.h>
  28. #include <modeno.h>
  29. #include <arrays.h>
  30. #include <filters.h>
  31. #include <cdpmain.h>
  32. #include <sfsys.h>
  33. /*RWD*/
  34. #include <string.h>
  35. #ifndef cdp_round
  36. extern int cdp_round(double a);
  37. #endif
  38. #if defined unix || defined __GNUC__
  39. #define round(x) lround((x))
  40. #endif
  41. #define MINUS96DB (0.000016)
  42. static void filtering(int n,int chans,float *buf,
  43. double *a,double *b,double *y,double *z,double *d,double *e,double *ampl,dataptr dz);
  44. static double check_float_limits(double sum, dataptr dz);
  45. static int newvalue(int valno,int valincrno, int sampcntno, dataptr dz);
  46. static int newfval(int *fsams,dataptr dz);
  47. static int do_filters(dataptr dz);
  48. static int do_qvary_filters(dataptr dz);
  49. static int do_fvary_filters(dataptr dz);
  50. static void print_filter_frqs(dataptr dz);
  51. static int do_varifilter(dataptr dz);
  52. static int do_sweep_filter(dataptr dz);
  53. static double getfrq(double lfrq,double hfrq,double sfrq,dataptr dz);
  54. static int do_allpass_filter(dataptr dz);
  55. static int allpass(float *buf,int chans,double prescale,dataptr dz);
  56. static int varidelay_allpass(float *buf,int chans,double prescale,dataptr dz);
  57. static int do_eq_filter(dataptr dz);
  58. static float multifilter(double *dll,double *dbb,double *dnn,double *dhh,double *dpp,
  59. double qfac,double coeff,float input,dataptr dz);
  60. static int do_lphp_filter(dataptr dz);
  61. static int my_modulus(int x,int y);
  62. static void lphp_filt_chan(double *e1,double *e2,double *s1,double *s2,
  63. double *den1,double *den2,double *cn,dataptr dz,int chan);
  64. static int do_fvary2_filters(dataptr dz);
  65. /****************************** FILTER_PROCESS *************************/
  66. int filter_process(dataptr dz)
  67. {
  68. int exit_status = FINISHED;
  69. int filter_tail = 0, tail_extend = 0, was_tail_extend = 0, bufspace;
  70. // NEW MAY 2012
  71. int do_norm = 0, chans = dz->infile->channels, sndendset = 0;
  72. double inmaxsamp = 0.0, outmaxsamp = 0.0, maxsamp = 0.0;
  73. float *buf = dz->sampbuf[0];
  74. int n, m, k, sndend = 0;
  75. int framend, framestart, framesize = F_SECSIZE, framecnt = dz->buflen/framesize;
  76. switch(dz->process) {
  77. case(FLTBANKV):
  78. if(dz->vflag[2])
  79. do_norm = 1;
  80. break;
  81. case(FLTBANKV2):
  82. if(dz->vflag[1])
  83. do_norm = 1;
  84. break;
  85. case(FLTBANKN):
  86. do_norm = 1;
  87. break;
  88. }
  89. // MAY 2012 TO HERE
  90. if(dz->process==FLTBANKC) {
  91. print_filter_frqs(dz);
  92. return(FINISHED);
  93. }
  94. display_virtual_time(0,dz);
  95. // NEW MAY 2012
  96. if(do_norm) {
  97. fprintf(stdout,"INFO: Assessing input level.\n");
  98. fflush(stdout);
  99. while(dz->samps_left > 0) {
  100. if((exit_status = read_samps(buf,dz))<0)
  101. return(exit_status);
  102. for(n = 0;n < dz->ssampsread;n++)
  103. inmaxsamp = max(inmaxsamp,fabs(buf[n]));
  104. }
  105. if(inmaxsamp <= 0.0) {
  106. sprintf(errstr,"No level found in input signal\n");
  107. return DATA_ERROR;
  108. }
  109. sndseekEx(dz->ifd[0],0,0);
  110. reset_filedata_counters(dz);
  111. if(dz->process==FLTBANKV) {
  112. if((exit_status = newfval(&(dz->iparam[FLT_FSAMS]),dz))<0)
  113. return(exit_status);
  114. } else if(dz->process==FLTBANKV2) {
  115. dz->iparam[FLT_FSAMS] = dz->iparam[FLT_BLOKSIZE];
  116. dz->param[FLT_TIMESTEP] = (double)dz->iparam[FLT_BLOKSIZE]/(double)dz->infile->srate;
  117. dz->param[FLT_TOTALTIME] = 0.0;
  118. if((exit_status = newfval2(dz->parray[FLT_FBRK],dz->parray[FLT_HBRK],dz))<0)
  119. return(exit_status);
  120. } else if(dz->process==FLTBANKN) {
  121. if(dz->brksize[FLT_Q])
  122. exit_status = do_qvary_filters(dz);
  123. else
  124. exit_status = do_filters(dz);
  125. }
  126. fprintf(stdout,"INFO: Assessing output level.\n");
  127. fflush(stdout);
  128. while(dz->samps_left > 0 || filter_tail > 0) {
  129. memset((char *)dz->sampbuf[0],0,(size_t) (dz->buflen * sizeof(float)));
  130. if(filter_tail || tail_extend) {
  131. dz->ssampsread = 0;
  132. } else {
  133. if((exit_status = read_samps(dz->sampbuf[0],dz))<0)
  134. return(exit_status);
  135. if(dz->samps_left <= 0) {
  136. if(dz->process==FLTBANKV || dz->process==FLTBANKV2)
  137. filter_tail = round(dz->param[FILT_TAILV] * (double)dz->infile->srate) * dz->infile->channels;
  138. else
  139. filter_tail = (int)round((dz->param[FILT_TAIL] * (double)dz->infile->srate) * dz->infile->channels);
  140. if(filter_tail == 0) {
  141. was_tail_extend = 1;
  142. tail_extend = 1;
  143. }
  144. }
  145. }
  146. if(filter_tail) {
  147. bufspace = dz->buflen - dz->ssampsread;
  148. if(bufspace >= filter_tail) {
  149. dz->ssampsread += filter_tail;
  150. filter_tail = 0;
  151. } else {
  152. dz->ssampsread = dz->buflen;
  153. filter_tail -= bufspace;
  154. }
  155. } else if(tail_extend) {
  156. bufspace = dz->buflen;
  157. dz->ssampsread = dz->buflen;
  158. }
  159. switch(dz->process) {
  160. case(FLTBANKV): exit_status = do_fvary_filters(dz); break;
  161. case(FLTBANKV2):exit_status = do_fvary2_filters(dz); break;
  162. case(FLTBANKN):
  163. if(dz->brksize[FLT_Q])
  164. exit_status = do_qvary_filters(dz);
  165. else
  166. exit_status = do_filters(dz);
  167. break;
  168. }
  169. if(exit_status <0)
  170. return(exit_status);
  171. if(tail_extend) {
  172. sndend = dz->buflen;
  173. framend = dz->buflen;
  174. for(k = framecnt; k > 0; k--) { // Search backwards thro buffer, frame by frame
  175. framestart = framend - framesize;
  176. maxsamp = 0.0;
  177. for(n = framend-chans;n >= framestart;n-=chans) {
  178. for(m=0;m<chans;m++) { // Search backwards thro frame, samp-grup by samp-group
  179. if(fabs(buf[n+m]) > maxsamp) {
  180. if(!sndendset) { // If samples cease to be zero
  181. sndend = n + chans; // Mark start of end-zeros in buffer
  182. sndendset = 1; // and flag that snd end has been found
  183. }
  184. maxsamp = fabs(buf[n+m]);
  185. }
  186. }
  187. if(maxsamp < MINUS96DB) { // If max level in frame falls below -96dB
  188. if(sndendset) { // If we found a place in buffer after which samples were all zero
  189. dz->ssampsread = sndend; // Mark this as end of output, and quit the main filtering loop
  190. tail_extend = 0; // by setting tail_extend to zero
  191. dz->samps_left = 0; // SAFETY
  192. break;
  193. } else // If we didn't find place ....
  194. sndend = framestart; // Then all samples in the frame are zero.
  195. } // So move snd end to start of current frame.
  196. } // .. and search backwards thro previous frame
  197. if(tail_extend == 0)
  198. break;
  199. framend = framestart;
  200. }
  201. }
  202. if(tail_extend)
  203. tail_extend++;
  204. if(dz->ssampsread > 0) {
  205. for(n = 0;n < dz->ssampsread;n++)
  206. outmaxsamp = max(outmaxsamp,(double)fabs(buf[n]));
  207. }
  208. }
  209. if(outmaxsamp <= 0.0) {
  210. sprintf(errstr,"No level found in output signal.\n");
  211. return DATA_ERROR;
  212. }
  213. dz->param[FLT_GAIN] *= (inmaxsamp/outmaxsamp);
  214. sndseekEx(dz->ifd[0],0,0);
  215. reset_filedata_counters(dz);
  216. if(dz->process==FLTBANKV || dz->process==FLTBANKV2) {
  217. for(n = 0;n<dz->iparam[FLT_CNT];n++) {
  218. dz->parray[FLT_FRQ][n] = dz->parray[FLT_INFRQ][n];
  219. dz->parray[FLT_AMP][n] = dz->parray[FLT_INAMP][n];
  220. dz->parray[FLT_LASTFVAL][n] = dz->parray[FLT_FRQ][n];
  221. dz->parray[FLT_LASTAVAL][n] = dz->parray[FLT_AMP][n];
  222. }
  223. }
  224. dz->iparam[FLT_FRQ_INDEX] = dz->iparam[FLT_CNT];
  225. dz->iparam[FLT_TIMES_CNT] = 1;
  226. filter_tail = 0;
  227. tail_extend = 0;
  228. sndendset = 0;
  229. sndend = 0;
  230. tail_extend = 0;
  231. was_tail_extend = 0;
  232. fprintf(stdout,"INFO: Running filter.\n");
  233. fflush(stdout);
  234. }
  235. // MAY 2012, TO HERE
  236. if(dz->process==FLTBANKV) {
  237. if((exit_status = newfval(&(dz->iparam[FLT_FSAMS]),dz))<0)
  238. return(exit_status);
  239. } else if(dz->process==FLTBANKV2) {
  240. dz->iparam[FLT_FSAMS] = dz->iparam[FLT_BLOKSIZE];
  241. dz->param[FLT_TIMESTEP] = (double)dz->iparam[FLT_BLOKSIZE]/(double)dz->infile->srate;
  242. dz->param[FLT_TOTALTIME] = 0.0;
  243. if((exit_status = newfval2(dz->parray[FLT_FBRK],dz->parray[FLT_HBRK],dz))<0)
  244. return(exit_status);
  245. }
  246. while(dz->samps_left > 0 || filter_tail > 0 || tail_extend) {
  247. memset((char *)dz->sampbuf[0],0,(size_t) (dz->buflen * sizeof(float)));
  248. if(filter_tail > 0 || tail_extend) {
  249. dz->ssampsread = 0;
  250. } else {
  251. if((exit_status = read_samps(dz->sampbuf[0],dz))<0)
  252. return(exit_status);
  253. if(dz->samps_left <= 0) {
  254. if(dz->process==FLTBANKV || dz->process==FLTBANKV2)
  255. filter_tail = round(dz->param[FILT_TAILV] * (double)dz->infile->srate) * dz->infile->channels;
  256. else
  257. filter_tail = (int)round((dz->param[FILT_TAIL] * (double)dz->infile->srate) * dz->infile->channels);
  258. if(filter_tail == 0) {
  259. was_tail_extend = 1;
  260. tail_extend = 1;
  261. fprintf(stdout,"INFO: Writing Filter tail.\n");
  262. fflush(stdout);
  263. }
  264. }
  265. }
  266. if(filter_tail) {
  267. bufspace = dz->buflen - dz->ssampsread;
  268. if(bufspace >= filter_tail) {
  269. dz->ssampsread += filter_tail;
  270. filter_tail = 0;
  271. } else {
  272. dz->ssampsread = dz->buflen;
  273. filter_tail -= bufspace;
  274. }
  275. } else if(tail_extend) {
  276. bufspace = dz->buflen;
  277. dz->ssampsread = dz->buflen;
  278. }
  279. switch(dz->process) {
  280. case(FLTBANKN):
  281. case(FLTBANKU):
  282. if(dz->brksize[FLT_Q])
  283. exit_status = do_qvary_filters(dz);
  284. else
  285. exit_status = do_filters(dz);
  286. break;
  287. case(FLTBANKV): exit_status = do_fvary_filters(dz); break;
  288. case(FLTBANKV2):exit_status = do_fvary2_filters(dz); break;
  289. case(FLTSWEEP): exit_status = do_sweep_filter(dz); break;
  290. case(FSTATVAR): exit_status = do_varifilter(dz); break;
  291. case(ALLPASS): exit_status = do_allpass_filter(dz); break;
  292. case(EQ): exit_status = do_eq_filter(dz); break;
  293. case(LPHP): exit_status = do_lphp_filter(dz); break;
  294. }
  295. if(exit_status <0)
  296. return(exit_status);
  297. if(tail_extend) {
  298. sndend = dz->buflen;
  299. framend = dz->buflen;
  300. for(k = framecnt; k > 0; k--) { // Search backwards thro buffer, frame by frame
  301. framestart = framend - framesize;
  302. maxsamp = 0.0;
  303. for(n = framend-chans;n >= framestart;n-=chans) {
  304. for(m=0;m<chans;m++) { // Search backwards thro frame, samp-grup by samp-group
  305. if(fabs(buf[n+m]) > maxsamp) {
  306. if(!sndendset) { // If samples cease to be zero
  307. sndend = n + chans; // Mark start of end-zeros in buffer
  308. sndendset = 1; // and flag that snd end has been found
  309. }
  310. maxsamp = fabs(buf[n+m]);
  311. }
  312. }
  313. if(maxsamp < MINUS96DB) { // If max level in frame falls below -96dB
  314. if(sndendset) { // If we found a place in buffer after which samples were all zero
  315. dz->ssampsread = sndend; // Mark this as end of output, and quit the main filtering loop
  316. tail_extend = 0; // by setting tail_extend to zero
  317. dz->samps_left = 0; // SAFETY
  318. break;
  319. } else // If we didn't find place ....
  320. sndend = framestart; // Then all samples in the frame are zero.
  321. } // So move snd end to start of current frame.
  322. } // .. and search backwards thro previous frame
  323. if(tail_extend == 0)
  324. break;
  325. framend = framestart;
  326. }
  327. if((maxsamp < MINUS96DB) && !sndendset) { // Entire buffer is "zero"
  328. tail_extend = 0; // Force exit by seting tail_extend to zero
  329. dz->samps_left = 0; // SAFETY // DO NOT set samps_read to 0, as there may be input samples still to write
  330. }
  331. }
  332. if(tail_extend)
  333. tail_extend++;
  334. if(dz->ssampsread > 0) {
  335. if(sloom && was_tail_extend) { // Force Loom progress bar to respond to tail-write
  336. if(!tail_extend)
  337. dz->total_samps_written = dz->insams[0];
  338. else
  339. dz->total_samps_written = (long)round((double)dz->insams[0] * ((double)(tail_extend % 8)/8.0));
  340. dz->total_samps_written -= dz->ssampsread;
  341. }
  342. if((exit_status = write_samps(dz->sampbuf[0],dz->ssampsread,dz))<0)
  343. return(exit_status);
  344. }
  345. }
  346. if(dz->iparam[FLT_OVFLW] > 0) {
  347. if(!sloom && !sloombatch)
  348. fprintf(stdout,"Number of overflows: %d\n",dz->iparam[FLT_OVFLW]);
  349. else
  350. fprintf(stdout,"INFO: Number of overflows: %d\n",dz->iparam[FLT_OVFLW]);
  351. fflush(stdout);
  352. }
  353. return(FINISHED);
  354. }
  355. /*************************** DO_FVARY_FILTERS *****************************/
  356. int do_fvary_filters(dataptr dz)
  357. {
  358. int exit_status;
  359. int n, m, fno, chans = dz->infile->channels;
  360. float *buf = dz->sampbuf[0];
  361. double *fincr = dz->parray[FLT_FINCR];
  362. double *aincr = dz->parray[FLT_AINCR];
  363. double *ampl = dz->parray[FLT_AMPL];
  364. double *a = dz->parray[FLT_A];
  365. double *b = dz->parray[FLT_B];
  366. double *y = dz->parray[FLT_Y];
  367. double *z = dz->parray[FLT_Z];
  368. double *d = dz->parray[FLT_D];
  369. double *e = dz->parray[FLT_E];
  370. int fsams = dz->iparam[FLT_FSAMS];
  371. if (dz->vflag[DROP_OUT_AT_OVFLOW]) {
  372. for (n = 0; n < dz->ssampsread; n += chans) {
  373. if(fsams <= 0) {
  374. if((exit_status = newfval(&fsams,dz))<0)
  375. return(exit_status);
  376. }
  377. if(dz->brksize[FLT_Q]) {
  378. if((dz->iparam[FLT_SAMS] -= chans) <= 0) {
  379. if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
  380. sprintf(errstr,"Ran out of Q values: do_fvary_filters()\n");
  381. return(PROGRAM_ERROR);
  382. }
  383. dz->iparam[FLT_SAMS] *= chans;
  384. }
  385. }
  386. if((dz->iparam[FLT_BLOKCNT] -= chans) <= 0) {
  387. for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++) {
  388. get_coeffs1(fno,dz);
  389. get_coeffs2(fno,dz);
  390. }
  391. if(dz->brksize[FLT_Q])
  392. dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];
  393. for(m=0;m<dz->iparam[FLT_CNT];m++) {
  394. dz->parray[FLT_FRQ][m] *= fincr[m];
  395. dz->parray[FLT_AMP][m] *= aincr[m];
  396. }
  397. dz->iparam[FLT_BLOKCNT] = dz->iparam[FLT_BLOKSIZE] * chans;
  398. }
  399. filtering(n,chans,buf,a,b,y,z,d,e,ampl,dz);
  400. if(dz->iparam[FLT_OVFLW] > 0) {
  401. sprintf(errstr,"Filter overflowed\n");
  402. return(GOAL_FAILED);
  403. }
  404. fsams--;
  405. }
  406. } else {
  407. for (n = 0; n < dz->ssampsread; n += chans) {
  408. if(fsams <= 0) {
  409. if((exit_status = newfval(&fsams,dz))<0)
  410. return(exit_status);
  411. }
  412. if(dz->brksize[FLT_Q]) {
  413. if((dz->iparam[FLT_SAMS] -= chans) <= 0) {
  414. if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
  415. sprintf(errstr,"Ran out of Q values: do_fvary_filters()\n");
  416. return(PROGRAM_ERROR);
  417. }
  418. dz->iparam[FLT_SAMS] *= chans;
  419. }
  420. }
  421. if((dz->iparam[FLT_BLOKCNT] -= chans) <= 0) {
  422. for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++) {
  423. get_coeffs1(fno,dz);
  424. get_coeffs2(fno,dz);
  425. }
  426. if(dz->brksize[FLT_Q])
  427. dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];
  428. for(m=0;m<dz->iparam[FLT_CNT];m++) {
  429. dz->parray[FLT_FRQ][m] *= fincr[m];
  430. dz->parray[FLT_AMP][m] *= aincr[m];
  431. }
  432. dz->iparam[FLT_BLOKCNT] = dz->iparam[FLT_BLOKSIZE] * chans;
  433. }
  434. filtering(n,chans,buf,a,b,y,z,d,e,ampl,dz);
  435. fsams--;
  436. }
  437. }
  438. dz->iparam[FLT_FSAMS] = fsams;
  439. return(CONTINUE);
  440. }
  441. /*************************** DO_FILTERS *******************************/
  442. int do_filters(dataptr dz)
  443. {
  444. int n;
  445. int chans = dz->infile->channels;
  446. float *buf = dz->sampbuf[0];
  447. double *ampl = dz->parray[FLT_AMPL];
  448. double *a = dz->parray[FLT_A];
  449. double *b = dz->parray[FLT_B];
  450. double *y = dz->parray[FLT_Y];
  451. double *z = dz->parray[FLT_Z];
  452. double *d = dz->parray[FLT_D];
  453. double *e = dz->parray[FLT_E];
  454. for (n = 0; n < dz->ssampsread; n += chans)
  455. filtering(n,chans,buf,a,b,y,z,d,e,ampl,dz);
  456. return(CONTINUE);
  457. }
  458. /*************************** DO_QVARY_FILTERS *****************************/
  459. int do_qvary_filters(dataptr dz)
  460. {
  461. int n;
  462. int fno, chans = dz->infile->channels;
  463. float *buf = dz->sampbuf[0];
  464. double *ampl = dz->parray[FLT_AMPL];
  465. double *a = dz->parray[FLT_A];
  466. double *b = dz->parray[FLT_B];
  467. double *y = dz->parray[FLT_Y];
  468. double *z = dz->parray[FLT_Z];
  469. double *d = dz->parray[FLT_D];
  470. double *e = dz->parray[FLT_E];
  471. for (n = 0; n < dz->ssampsread; n += chans) {
  472. if((dz->iparam[FLT_SAMS] -= chans) <= 0) {
  473. if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
  474. sprintf(errstr,"Ran out of Q values: do_qvary_filters()\n");
  475. return(PROGRAM_ERROR);
  476. }
  477. dz->iparam[FLT_SAMS] *= chans;
  478. }
  479. if((dz->iparam[FLT_BLOKCNT] -= chans) <= 0) {
  480. for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++)
  481. get_coeffs2(fno,dz);
  482. dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];
  483. dz->iparam[FLT_BLOKCNT] = dz->iparam[FLT_BLOKSIZE] * chans;
  484. }
  485. filtering(n,chans,buf,a,b,y,z,d,e,ampl,dz);
  486. }
  487. return(CONTINUE);
  488. }
  489. /******************************* NEWVALUE ***************************
  490. *
  491. * VAL is the base value from which we calculate.
  492. * VALINCR is the value increment per block of samples.
  493. * SAMPCNT is the number of samples from 1 brkpnt val to next.
  494. */
  495. int newvalue(int valno,int valincrno, int sampcntno, dataptr dz)
  496. {
  497. double *p;
  498. double ratio, one_over_steps;
  499. double thistime;
  500. double thisval;
  501. int linear_flag = FALSE;
  502. if(dz->process==ALLPASS && valno==FLT_DELAY)
  503. linear_flag = dz->vflag[FLT_LINDELAY];
  504. p = dz->brkptr[valno];
  505. if(p - dz->brk[valno] >= dz->brksize[valno] * 2)
  506. return(FALSE);
  507. thistime = (double)round((*p++) * dz->infile->srate);
  508. thisval = *p++;
  509. dz->iparam[sampcntno] = round(thistime - dz->lastind[valno]);
  510. /* steps = no_of_samples/sampsize_of_blok: therefore.. */
  511. one_over_steps = (double)dz->iparam[FLT_BLOKSIZE]/(double)dz->iparam[sampcntno];
  512. if(linear_flag)
  513. dz->param[valincrno] = (thisval - dz->lastval[valno]) * one_over_steps;
  514. else {
  515. ratio = (thisval/dz->lastval[valno]);
  516. dz->param[valincrno] = pow(ratio,(one_over_steps));
  517. }
  518. dz->param[valno] = dz->lastval[valno];
  519. dz->lastval[valno] = thisval;
  520. dz->lastind[valno] = thistime;
  521. dz->brkptr[valno] = p;
  522. return(TRUE);
  523. }
  524. /******************************* NEWFVAL ***************************
  525. *
  526. * VAL is the base value from which we calculate.
  527. * VALINCR is the value increment per block of samples.
  528. * FSAMS is the number of samples (per channel) from 1 brkpnt val to next.
  529. * brk is the particular table we're accessing.
  530. */
  531. int newfval(int *fsams,dataptr dz)
  532. {
  533. int thistime, lasttime;
  534. double rratio, one_over_steps;
  535. int n,m,k;
  536. double thisval;
  537. double *lastfval = dz->parray[FLT_LASTFVAL];
  538. double *lastaval = dz->parray[FLT_LASTAVAL];
  539. double *aincr = dz->parray[FLT_AINCR];
  540. double *fincr = dz->parray[FLT_FINCR];
  541. int total_frqcnt = dz->iparam[FLT_CNT] * dz->iparam[FLT_TIMESLOTS];
  542. if(dz->iparam[FLT_TIMES_CNT]>dz->iparam[FLT_TIMESLOTS]) {
  543. sprintf(errstr,"Ran off end of filter data: newfval()\n");
  544. return(PROGRAM_ERROR);
  545. }
  546. k = dz->iparam[FLT_TIMES_CNT];
  547. lasttime = dz->lparray[FLT_SAMPTIME][k-1];
  548. thistime = dz->lparray[FLT_SAMPTIME][k];
  549. *fsams = thistime - lasttime;
  550. /* steps = fsams/FLT_BLOKSIZE: therefore ... */
  551. one_over_steps = (double)dz->iparam[FLT_BLOKSIZE]/(double)(*fsams);
  552. if(dz->iparam[FLT_FRQ_INDEX] >= total_frqcnt)
  553. return(FINISHED);
  554. for(n=0, m= dz->iparam[FLT_FRQ_INDEX];n<dz->iparam[FLT_CNT];n++,m++) {
  555. /* FREQUENCY */
  556. thisval = dz->parray[FLT_INFRQ][m];
  557. if(flteq(lastfval[n],thisval))
  558. fincr[n] = 1.0;
  559. else {
  560. rratio = (thisval/lastfval[n]);
  561. fincr[n] = pow(rratio,one_over_steps);
  562. }
  563. dz->parray[FLT_FRQ][n] = lastfval[n];
  564. lastfval[n] = thisval;
  565. /* AMPLITUDE */
  566. thisval = dz->parray[FLT_INAMP][m];
  567. if(flteq(thisval,lastaval[n]))
  568. aincr[n] = 1.0;
  569. else {
  570. rratio = (thisval/lastaval[n]);
  571. aincr[n] = pow(rratio,one_over_steps);
  572. }
  573. dz->parray[FLT_AMP][n] = lastaval[n];
  574. lastaval[n] = thisval;
  575. }
  576. dz->iparam[FLT_FRQ_INDEX] += dz->iparam[FLT_CNT];
  577. dz->iparam[FLT_TIMES_CNT]++;
  578. return(FINISHED);
  579. }
  580. /************************** FILTERING ****************************/
  581. void filtering(int n,int chans,float *buf,double *a,double *b,double *y,double *z,
  582. double *d,double *e,double *ampl,dataptr dz)
  583. {
  584. double input, sum, xx;
  585. int chno, this_samp, fno, i;
  586. for(chno = 0; chno < chans; chno++) {
  587. this_samp = n + chno;
  588. input = (double)buf[this_samp];
  589. sum = 0.0;
  590. for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++) {
  591. i = (fno * chans) + chno;
  592. xx = input + (a[fno] * y[i]) + (b[fno] * z[i]);
  593. z[i] = y[i];
  594. y[i] = xx;
  595. if(dz->vflag[FLT_DBLFILT]) {
  596. xx += (a[fno] * d[i]) + (b[fno] * e[i]);
  597. e[i] = d[i];
  598. d[i] = xx;
  599. }
  600. sum += (xx * ampl[fno]);
  601. }
  602. sum *= dz->param[FLT_GAIN];
  603. sum = check_float_limits(sum,dz);
  604. buf[this_samp] = (float) sum;
  605. }
  606. }
  607. /************************** IO_FILTERING ****************************/
  608. void io_filtering
  609. (float *buf1,float *buf2,int chans,int n,
  610. double *a,double *b,double *y,double *z,double *d,double *z1,double *ampl,dataptr dz)
  611. {
  612. double input, sum, xx;
  613. int chno, this_samp, fno, i;
  614. for(chno = 0; chno < chans; chno++) {
  615. this_samp = n + chno;
  616. input = (double)buf1[this_samp];
  617. sum = 0.0;
  618. for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++) {
  619. i = (fno * chans) + chno;
  620. xx = input + (a[fno] * y[i]) + (b[fno] * z[i]);
  621. z[i] = y[i];
  622. y[i] = xx;
  623. if(dz->vflag[FLT_DBLFILT]) {
  624. xx += (a[fno] * d[i]) + (b[fno] * z1[i]);
  625. z1[i] = d[i];
  626. d[i] = xx;
  627. }
  628. sum += (xx * ampl[fno]);
  629. }
  630. sum *= dz->param[FLT_GAIN];
  631. sum = check_float_limits(sum,dz);
  632. buf2[this_samp] = (float) sum;
  633. }
  634. }
  635. /************************ CHECK_FLOAT_LIMITS **************************/
  636. //TODO: if shorts o/p - do clipping; if floatsams, report but don't change!
  637. double check_float_limits(double sum,dataptr dz)
  638. {
  639. double peak = fabs(sum);
  640. #ifdef NOTDEF
  641. //do this when 'modify loudness' can handle floatsams!
  642. if(dz->true_outfile_stype== SAMP_FLOAT){
  643. if(peak > 1.0){
  644. dz->iparam[FLT_OVFLW]++;
  645. dz->peak_fval = max(dz->peak_fval,peak);
  646. }
  647. }
  648. else {
  649. #endif
  650. if (sum > 1.0) {
  651. //TW SUGGEST KEEP THIS; prevents FILTER BLOWING UP: see notes
  652. dz->param[FLT_GAIN] *= 0.9999;
  653. dz->iparam[FLT_OVFLW]++;
  654. dz->peak_fval = max(dz->peak_fval,peak);
  655. //return(1.0);
  656. if(dz->clip_floatsams)
  657. sum = 1.0;
  658. }
  659. if (sum < -1.0) {
  660. //TW SUGGEST KEEP THIS; prevents FILTER BLOWING UP: see notes
  661. dz->param[FLT_GAIN] *= 0.9999;
  662. dz->iparam[FLT_OVFLW]++;
  663. dz->peak_fval = max(dz->peak_fval,peak);
  664. //return(-1.0);
  665. if(dz->clip_floatsams)
  666. sum = -1.0;
  667. }
  668. #ifdef NOTDEF
  669. }
  670. #endif
  671. return sum;
  672. }
  673. /************************ PRINT_FILTER_FRQS *******************************/
  674. void print_filter_frqs(dataptr dz)
  675. {
  676. int n;
  677. double *frq = dz->parray[FLT_FRQ];
  678. for(n=0;n<dz->iparam[FLT_CNT];n++)
  679. fprintf(dz->fp,"%lf\n",frq[n]);
  680. }
  681. /******************************* DO_VARIFILTER ******************************/
  682. int do_varifilter(dataptr dz)
  683. {
  684. double *dls = dz->parray[FLT_DLS];
  685. double *dbs = dz->parray[FLT_DBS];
  686. double *dhs = dz->parray[FLT_DHS];
  687. double *dns = dz->parray[FLT_DNS];
  688. double *dops[2];
  689. double coeff = 0.0;
  690. float *buf = dz->sampbuf[0];
  691. int n;
  692. int k, chans = dz->infile->channels;
  693. int is_fbrk = FALSE, is_qbrk = FALSE;
  694. if(dz->brksize[FLT_ONEFRQ]) is_fbrk = TRUE;
  695. if(dz->brksize[FLT_Q]) is_qbrk = TRUE;
  696. for(n=0;n<chans;n++) {
  697. switch(dz->mode){
  698. case(FSW_HIGH): dops[n] = &(dz->parray[FLT_DHS][n]); break;
  699. case(FSW_LOW): dops[n] = &(dz->parray[FLT_DLS][n]); break;
  700. case(FSW_BAND): dops[n] = &(dz->parray[FLT_DBS][n]); break;
  701. case(FSW_NOTCH): dops[n] = &(dz->parray[FLT_DNS][n]); break;
  702. }
  703. }
  704. for (n = 0 ; n < dz->ssampsread; n += chans) {
  705. if(is_fbrk && (--dz->iparam[FLT_FSAMS] <= 0)) {
  706. if(!newvalue(FLT_ONEFRQ,FLT_F_INCR,FLT_FSAMS,dz)) {
  707. sprintf(errstr,"Ran out of sweepfrq values: do_varifilter()\n");
  708. return(PROGRAM_ERROR);
  709. }
  710. }
  711. if(is_qbrk && (--dz->iparam[FLT_SAMS] <= 0)) {
  712. if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
  713. sprintf(errstr,"Ran out of Q values: do_sweep_filter()\n");
  714. return(PROGRAM_ERROR);
  715. }
  716. }
  717. if(--dz->iparam[FLT_BLOKCNT] <= 0){
  718. coeff = (2.0 * PI * dz->param[FLT_ONEFRQ]) * dz->param[FLT_INV_SR];
  719. if(is_fbrk) dz->param[FLT_ONEFRQ] *= dz->param[FLT_F_INCR];
  720. if(is_qbrk) {
  721. dz->param[FLT_QFAC] = 1.0/(1.0 + dz->param[FLT_Q]);
  722. dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];
  723. }
  724. dz->iparam[FLT_BLOKCNT] = dz->iparam[FLT_BLOKSIZE];
  725. }
  726. for(k=0;k<chans;k++)
  727. buf[n+k] = multifilter(&(dbs[k]),&(dls[k]),&(dhs[k]),&(dns[k]),dops[k],dz->param[FLT_Q],coeff,buf[n+k],dz);
  728. }
  729. return(CONTINUE);
  730. }
  731. /******************************* DO_SWEEP_FILTER ******************************/
  732. int do_sweep_filter(dataptr dz)
  733. {
  734. double *dls = dz->parray[FLT_DLS];
  735. double *dbs = dz->parray[FLT_DBS];
  736. double *dhs = dz->parray[FLT_DHS];
  737. double *dns = dz->parray[FLT_DNS];
  738. double *dops[2];
  739. double coeff = 0.0, frq;
  740. float *buf = dz->sampbuf[0];
  741. int n;
  742. int k, chans = dz->infile->channels;
  743. int is_lbrk = FALSE, is_hbrk = FALSE, is_sbrk = FALSE, is_qbrk = FALSE;
  744. if(dz->brksize[FLT_LOFRQ]) is_lbrk = TRUE;
  745. if(dz->brksize[FLT_HIFRQ]) is_hbrk = TRUE;
  746. if(dz->brksize[FLT_SWPFRQ]) is_sbrk = TRUE;
  747. if(dz->brksize[FLT_Q]) is_qbrk = TRUE;
  748. for(n=0;n<chans;n++) {
  749. switch(dz->mode){
  750. case(FSW_HIGH): dops[n] = &(dz->parray[FLT_DHS][n]); break;
  751. case(FSW_LOW): dops[n] = &(dz->parray[FLT_DLS][n]); break;
  752. case(FSW_BAND): dops[n] = &(dz->parray[FLT_DBS][n]); break;
  753. case(FSW_NOTCH): dops[n] = &(dz->parray[FLT_DNS][n]); break;
  754. }
  755. }
  756. for (n = 0 ; n < dz->ssampsread; n += chans) {
  757. if(is_lbrk && (--dz->iparam[FLT_LOSAMS] <= 0)) {
  758. if(!newvalue(FLT_LOFRQ,FLT_LOINCR,FLT_LOSAMS,dz)) {
  759. sprintf(errstr,"Ran out of lofrq values: do_sweep_filter()\n");
  760. return(PROGRAM_ERROR);
  761. }
  762. }
  763. if(is_hbrk && (--dz->iparam[FLT_HISAMS] <= 0)) {
  764. if(!newvalue(FLT_HIFRQ,FLT_HIINCR,FLT_HISAMS,dz)) {
  765. sprintf(errstr,"Ran out of hifrq values: do_sweep_filter()\n");
  766. return(PROGRAM_ERROR);
  767. }
  768. }
  769. if(is_sbrk && (--dz->iparam[FLT_SWSAMS] <= 0)) {
  770. if(!newvalue(FLT_SWPFRQ,FLT_SWINCR,FLT_SWSAMS,dz)) {
  771. sprintf(errstr,"Ran out of sweepfrq values: do_sweep_filter()\n");
  772. return(PROGRAM_ERROR);
  773. }
  774. }
  775. if(is_qbrk && (--dz->iparam[FLT_SAMS] <= 0)) {
  776. if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
  777. sprintf(errstr,"Ran out of Q values: do_sweep_filter()\n");
  778. return(PROGRAM_ERROR);
  779. }
  780. }
  781. if(--dz->iparam[FLT_BLOKCNT] <= 0){
  782. frq = getfrq(dz->param[FLT_LOFRQ],dz->param[FLT_HIFRQ],dz->param[FLT_SWPFRQ],dz);
  783. coeff = (2.0 * PI * frq) * dz->param[FLT_INV_SR];
  784. if(is_lbrk) dz->param[FLT_LOFRQ] *= dz->param[FLT_LOINCR];
  785. if(is_hbrk) dz->param[FLT_HIFRQ] *= dz->param[FLT_HIINCR];
  786. if(is_sbrk) dz->param[FLT_SWPFRQ] *= dz->param[FLT_SWINCR];
  787. if(is_qbrk) {
  788. dz->param[FLT_QFAC] = 1.0/(1.0 + dz->param[FLT_Q]);
  789. dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];
  790. }
  791. dz->iparam[FLT_BLOKCNT] = dz->iparam[FLT_BLOKSIZE];
  792. }
  793. for(k=0;k<chans;k++)
  794. buf[n+k] = multifilter(&(dbs[k]),&(dls[k]),&(dhs[k]),&(dns[k]),dops[k],dz->param[FLT_Q],coeff,buf[n+k],dz);
  795. }
  796. return(CONTINUE);
  797. }
  798. /*************************** GETFRQ ****************************
  799. *
  800. * NB sfrq is already adjusted to advance over a whole flt_blok.
  801. */
  802. double getfrq(double lfrq,double hfrq,double sfrq,dataptr dz)
  803. {
  804. double thispos;
  805. double range = hfrq - lfrq;
  806. thispos = (cos(dz->param[FLT_CYCPOS]) + 1.0) * 0.5;
  807. dz->param[FLT_CYCPOS] = fmod(dz->param[FLT_CYCPOS] + sfrq,TWOPI);
  808. return((thispos * range) + lfrq);
  809. }
  810. /******************************* DO_ALLPASS_FILTER ******************************/
  811. int do_allpass_filter(dataptr dz)
  812. {
  813. int exit_status;
  814. int chans = dz->infile->channels;
  815. float *buf = dz->sampbuf[0];
  816. double prescale = dz->param[FLT_PRESCALE];
  817. if(dz->brksize[FLT_DELAY])
  818. exit_status = varidelay_allpass(buf,chans,prescale,dz);
  819. else
  820. exit_status = allpass(buf,chans,prescale,dz);
  821. return(exit_status);
  822. }
  823. /******************************* VARIDELAY_ALLPASS ******************************/
  824. int varidelay_allpass(float *buf,int chans,double prescale,dataptr dz)
  825. {
  826. int n, thisdelbfpos1, thisdelbfpos2, sampno;
  827. int delay, channo;
  828. double frac, ip, op, delval1,delval2, delval;
  829. double *delbuf1 = dz->parray[FLT_DELBUF1];
  830. double *delbuf2 = dz->parray[FLT_DELBUF2];
  831. int maxdelsamps = dz->iparam[FLT_MAXDELSAMPS] * chans;
  832. int delbufpos = dz->iparam[FLT_DELBUFPOS];
  833. switch(dz->mode) {
  834. case(FLT_PHASESHIFT):
  835. for(n=0;n<dz->ssampsread;n+= chans){
  836. if(--dz->iparam[FLT_SAMS] <= 0) {
  837. if(!newvalue(FLT_DELAY,FLT_D_INCR,FLT_SAMS,dz)) {
  838. sprintf(errstr,"Ran out of Delay vals: varidelay_allpass()\n");
  839. return(PROGRAM_ERROR);
  840. }
  841. }
  842. delay = (int)dz->param[FLT_DELAY];
  843. frac = dz->param[FLT_DELAY] - (double)delay;
  844. for(channo = 0;channo < chans; channo++) {
  845. sampno = n + channo;
  846. thisdelbfpos1 = my_modulus((delbufpos - (delay*chans)),maxdelsamps);
  847. thisdelbfpos2 = my_modulus((thisdelbfpos1 + chans) ,maxdelsamps);
  848. ip = (double)buf[sampno] * prescale;
  849. op = (-dz->param[FLT_GAIN]) * ip;
  850. delval1 = delbuf1[thisdelbfpos1];
  851. delval2 = delbuf1[thisdelbfpos2];
  852. delval = delval1 + ((delval2 - delval1) * frac);
  853. op += delval;
  854. delval1 = delbuf2[thisdelbfpos1];
  855. delval2 = delbuf2[thisdelbfpos2];
  856. delval = delval1 + ((delval2 - delval1) * frac);
  857. op += dz->param[FLT_GAIN] * delval;
  858. delbuf1[delbufpos] = ip;
  859. delbuf2[delbufpos] = op;
  860. if(++delbufpos >= maxdelsamps)
  861. // delbufpos = 0;
  862. delbufpos -= maxdelsamps; /*RWD 9:2001 */
  863. //TW ?????? maxdelsamps is a mutiple of channels, delbufpos is incremented by 1 each time
  864. // so (delbufpos -= maxdelsamps) = 0
  865. buf[sampno] = (float) (op);
  866. }
  867. if(dz->vflag[FLT_LINDELAY])
  868. dz->param[FLT_DELAY] += dz->param[FLT_D_INCR];
  869. else
  870. dz->param[FLT_DELAY] *= dz->param[FLT_D_INCR];
  871. }
  872. break;
  873. case(FLT_PHASER):
  874. for(n=0;n<dz->ssampsread;n+= chans){
  875. if(--dz->iparam[FLT_SAMS] <= 0) {
  876. if(!newvalue(FLT_DELAY,FLT_D_INCR,FLT_SAMS,dz)) {
  877. sprintf(errstr,"Ran out of Delay vals: varidelay_allpass()\n");
  878. return(PROGRAM_ERROR);
  879. }
  880. }
  881. delay = (int)dz->param[FLT_DELAY];
  882. frac = dz->param[FLT_DELAY] - (double)delay;
  883. for(channo = 0;channo < chans; channo++) {
  884. sampno = n + channo;
  885. thisdelbfpos1 = my_modulus((delbufpos - (delay*chans)),maxdelsamps);
  886. thisdelbfpos2 = my_modulus((thisdelbfpos1 + chans) ,maxdelsamps);
  887. ip = (double)buf[sampno] * prescale;
  888. op = (-dz->param[FLT_GAIN]) * ip;
  889. delval1 = delbuf1[thisdelbfpos1];
  890. delval2 = delbuf1[thisdelbfpos2];
  891. delval = delval1 + ((delval2 - delval1) * frac);
  892. op += delval;
  893. delval1 = delbuf2[thisdelbfpos1];
  894. delval2 = delbuf2[thisdelbfpos2];
  895. delval = delval1 + ((delval2 - delval1) * frac);
  896. op += dz->param[FLT_GAIN] * delval;
  897. delbuf1[delbufpos] = ip;
  898. delbuf2[delbufpos] = op;
  899. if(++delbufpos >= maxdelsamps)
  900. //delbufpos = 0;
  901. delbufpos -= maxdelsamps; /*RWD 9:2001 (see e_tmp/cdpfloat ) */
  902. //TW ?????? maxdelsamps is a mutiple of channels, delbufpos is incremented by 1 each time
  903. // so (delbufpos -= maxdelsamps) = 0
  904. buf[sampno] = (float) ((op + (double)buf[sampno]) * 0.5);
  905. }
  906. if(dz->vflag[FLT_LINDELAY])
  907. dz->param[FLT_DELAY] += dz->param[FLT_D_INCR];
  908. else
  909. dz->param[FLT_DELAY] *= dz->param[FLT_D_INCR];
  910. }
  911. break;
  912. default:
  913. sprintf(errstr,"Unknown case:varidelay_allpass()\n");
  914. return(PROGRAM_ERROR);
  915. }
  916. dz->iparam[FLT_DELBUFPOS] = delbufpos;
  917. return(FINISHED);
  918. }
  919. /******************************* ALLPASS ******************************/
  920. int allpass(float *buf,int chans,double prescale,dataptr dz)
  921. {
  922. int n, sampno;
  923. int channo;
  924. double *delbuf1 = dz->parray[FLT_DELBUF1];
  925. double *delbuf2 = dz->parray[FLT_DELBUF2];
  926. int maxdelsamps = dz->iparam[FLT_MAXDELSAMPS] * chans;
  927. int delbufpos = dz->iparam[FLT_DELBUFPOS];
  928. double ip, op;
  929. switch(dz->mode) {
  930. case(FLT_PHASESHIFT):
  931. for(n=0;n<dz->ssampsread;n+=chans){
  932. for(channo = 0;channo < chans; channo++) {
  933. sampno = n + channo;
  934. ip = (double)buf[sampno] * prescale;
  935. op = (-dz->param[FLT_GAIN]) * ip;
  936. op += delbuf1[delbufpos];
  937. op += dz->param[FLT_GAIN] * delbuf2[delbufpos];
  938. delbuf1[delbufpos] = ip;
  939. delbuf2[delbufpos] = op;
  940. if(++delbufpos >= maxdelsamps)
  941. /*delbufpos = 0;*/
  942. delbufpos -= maxdelsamps; /*RWD */
  943. //TW ?????? maxdelsamps is a mutiple of channels, delbufpos is incremented by 1 each time
  944. // so (delbufpos -= maxdelsamps) = 0
  945. buf[sampno] = (float)(op);
  946. }
  947. }
  948. break;
  949. case(FLT_PHASER):
  950. for(n=0;n<dz->ssampsread;n+=chans){
  951. for(channo = 0;channo < chans; channo++) {
  952. sampno = n + channo;
  953. ip = (double)buf[sampno] * prescale;
  954. op = (-dz->param[FLT_GAIN]) * ip;
  955. op += delbuf1[delbufpos];
  956. op += dz->param[FLT_GAIN] * delbuf2[delbufpos];
  957. delbuf1[delbufpos] = ip;
  958. delbuf2[delbufpos] = op;
  959. if(++delbufpos >= maxdelsamps)
  960. /*delbufpos = 0;*/
  961. delbufpos -= maxdelsamps; /*RWD */
  962. //TW ?????? maxdelsamps is a mutiple of channels, delbufpos is incremented by 1 each time
  963. // so (delbufpos -= maxdelsamps) = 0
  964. buf[sampno] = (float)((op + (double)buf[sampno]) * 0.5);
  965. }
  966. }
  967. break;
  968. default:
  969. sprintf(errstr,"Unknown case: allpass()\n");
  970. return(PROGRAM_ERROR);
  971. }
  972. dz->iparam[FLT_DELBUFPOS] = delbufpos;
  973. return(FINISHED);
  974. }
  975. /******************************* DO_EQ_FILTER ******************************/
  976. int do_eq_filter(dataptr dz)
  977. {
  978. double ip, op;
  979. int n, sampno;
  980. float *buf = dz->sampbuf[0];
  981. int chans = dz->infile->channels, chno;
  982. double *xx1 = dz->parray[FLT_XX1];
  983. double *xx2 = dz->parray[FLT_XX2];
  984. double *yy1 = dz->parray[FLT_YY1];
  985. double *yy2 = dz->parray[FLT_YY2];
  986. double a0 = dz->param[FLT_A0];
  987. double a1 = dz->param[FLT_A1];
  988. double a2 = dz->param[FLT_A2];
  989. double b1 = dz->param[FLT_B1];
  990. double b2 = dz->param[FLT_B2];
  991. double prescale = dz->param[FLT_PRESCALE];
  992. //double inv_of_maxsamp = 1.0/(double)F_MAXSAMP;
  993. for(n = 0;n < dz->ssampsread; n+= chans){
  994. for(chno = 0;chno < chans; chno++) {
  995. sampno = n+chno;
  996. ip = (double)buf[sampno] /* * inv_of_maxsamp*/;
  997. ip *= prescale;
  998. op = (a0 * ip) + (a1 * xx1[chno]) + (a2 * xx2[chno]) - (b1 * yy1[chno]) - (b2 * yy2[chno]);
  999. xx2[chno] = xx1[chno];
  1000. xx1[chno] = ip;
  1001. yy2[chno] = yy1[chno];
  1002. yy1[chno] = op;
  1003. buf[sampno] = (float)(op);
  1004. }
  1005. }
  1006. return(FINISHED);
  1007. }
  1008. /************************** MULTIFILTER **************************/
  1009. float multifilter(double *dll,double *dbb,double *dnn,double *dhh,double *dpp,
  1010. double qfac,double coeff,float input,dataptr dz)
  1011. {
  1012. double dya, dsa;
  1013. dya = (double)input;
  1014. *dhh = (qfac * *dbb) - *dll - dya;
  1015. *dbb = *dbb - (coeff * *dhh);
  1016. *dll = *dll - (coeff * *dbb);
  1017. *dnn = *dll + *dhh;
  1018. dsa = (*dpp) * dz->param[FLT_GAIN]; /* dpp points to dhh,dbb,dll,dnn */
  1019. #ifdef NOTDEF
  1020. if (fabs(dsa) > F_MAXSAMP) {
  1021. dz->iparam[FLT_OVFLW]++;
  1022. dz->param[FLT_GAIN] *= .9999;
  1023. if (dsa > 0.0)
  1024. dsa = (double)F_MAXSAMP;
  1025. else
  1026. dsa = (double)F_MINSAMP;
  1027. }
  1028. return((float)dsa); /* TRUNCATE */
  1029. #else
  1030. return (float) check_float_limits(dsa,dz);
  1031. #endif
  1032. }
  1033. /***************************** FILTER *************************************/
  1034. /* RWD TODO: add fix for nchans */
  1035. //int do_lphp_filter(dataptr dz)
  1036. //{
  1037. // double *e1s,*e2s,*s1s,*s2s;
  1038. // double *e1 = dz->parray[FLT_E1];
  1039. // double *e2 = dz->parray[FLT_E2];
  1040. // double *s1 = dz->parray[FLT_S1];
  1041. // double *s2 = dz->parray[FLT_S2];
  1042. // double *den1 = dz->parray[FLT_DEN1];
  1043. // double *den2 = dz->parray[FLT_DEN2];
  1044. // double *cn = dz->parray[FLT_CN];
  1045. // switch(dz->infile->channels) {
  1046. // case(STEREO):
  1047. // e1s = dz->parray[FLT_E1S];
  1048. // e2s = dz->parray[FLT_E2S];
  1049. // s1s = dz->parray[FLT_S1S];
  1050. // s2s = dz->parray[FLT_S2S];
  1051. // lphp_filt_stereo(e1,e2,s1,s2,e1s,e2s,s1s,s2s,den1,den2,cn,dz);
  1052. // break;
  1053. // case(MONO):
  1054. // lphp_filt(e1,e2,s1,s2,den1,den2,cn,dz);
  1055. // break;
  1056. // }
  1057. // return(FINISHED);
  1058. //}
  1059. //
  1060. // TW MULTICHAN 2010
  1061. int do_lphp_filter(dataptr dz)
  1062. {
  1063. int i;
  1064. int index;
  1065. double *e1,*e2,*s1,*s2;
  1066. double *den1 = dz->parray[FLT_DEN1];
  1067. double *den2 = dz->parray[FLT_DEN2];
  1068. double *cn = dz->parray[FLT_CN];
  1069. for(i=0; i < dz->infile->channels; i++) {
  1070. index = i * FLT_LPHP_ARRAYS_PER_FILTER;
  1071. e1 = dz->parray[FLT_E1_BASE + index];
  1072. e2 = dz->parray[FLT_E2_BASE + index];
  1073. s1 = dz->parray[FLT_S1_BASE + index];
  1074. s2 = dz->parray[FLT_S2_BASE + index];
  1075. lphp_filt_chan(e1,e2,s1,s2,den1,den2,cn,dz,i);
  1076. }
  1077. return(FINISHED);
  1078. }
  1079. /***************************** LPHP_FILT *************************************/
  1080. void lphp_filt(double *e1,double *e2,double *s1,double *s2,
  1081. double *den1,double *den2,double *cn,dataptr dz)
  1082. {
  1083. int i;
  1084. int k;
  1085. float *buf = dz->sampbuf[0];
  1086. double ip, op = 0.0, b1;
  1087. for (i = 0 ; i < dz->ssampsread; i++) {
  1088. ip = (double) buf[i];
  1089. for (k = 0 ; k < dz->iparam[FLT_CNT]; k++) {
  1090. b1 = dz->param[FLT_MUL] * cn[k];
  1091. op = (cn[k] * ip) + (den1[k] * s1[k]) + (den2[k] * s2[k]) + (b1 * e1[k]) + (cn[k] * e2[k]);
  1092. s2[k] = s1[k];
  1093. s1[k] = op;
  1094. e2[k] = e1[k];
  1095. e1[k] = ip;
  1096. }
  1097. op *= dz->param[FLT_PRESCALE];
  1098. //RWD NB gain modification...
  1099. #ifdef NOTDEF
  1100. if (fabs(op) > 1.0) {
  1101. dz->iparam[FLT_OVFLW]++;
  1102. //TW SUGGEST KEEP THIS: PREVENTS FILTER BLOWING UP
  1103. dz->param[FLT_PRESCALE] *= .9999;
  1104. if (op > 0.0)
  1105. op = 1.0;
  1106. else
  1107. op = -1.0;
  1108. }
  1109. buf[i] = (float)op;
  1110. #else
  1111. buf[i] = (float) check_float_limits(op,dz);
  1112. #endif
  1113. }
  1114. }
  1115. /*RWD 4:2000 */
  1116. void lphp_filt_chan(double *e1,double *e2,double *s1,double *s2,
  1117. double *den1,double *den2,double *cn,dataptr dz,int chan)
  1118. {
  1119. int i;
  1120. int k;
  1121. float *buf = dz->sampbuf[0];
  1122. double ip, op = 0.0, b1;
  1123. for (i = chan ; i < dz->ssampsread; i+= dz->infile->channels) {
  1124. ip = (double) buf[i];
  1125. for (k = 0 ; k < dz->iparam[FLT_CNT]; k++) {
  1126. b1 = dz->param[FLT_MUL] * cn[k];
  1127. op = (cn[k] * ip) + (den1[k] * s1[k]) + (den2[k] * s2[k]) + (b1 * e1[k]) + (cn[k] * e2[k]);
  1128. s2[k] = s1[k];
  1129. s1[k] = op;
  1130. e2[k] = e1[k];
  1131. e1[k] = ip;
  1132. }
  1133. op *= dz->param[FLT_PRESCALE];
  1134. //RWD NB gain modification...
  1135. #ifdef NOTDEF
  1136. if (fabs(op) > 1.0) {
  1137. dz->iparam[FLT_OVFLW]++;
  1138. //TW SUGGEST KEEP THIS: PREVENTS FILTER BLOWING UP
  1139. dz->param[FLT_PRESCALE] *= .9999;
  1140. if (op > 0.0)
  1141. op = 1.0;
  1142. else
  1143. op = -1.0;
  1144. }
  1145. buf[i] = (float)op;
  1146. #else
  1147. buf[i] = (float) check_float_limits(op,dz);
  1148. #endif
  1149. }
  1150. }
  1151. /***************************** LPHP_FILT_STEREO *************************************/
  1152. void lphp_filt_stereo(double *e1,double *e2,double *s1,double *s2,double *e1s,double *e2s,double *s1s,double *s2s,
  1153. double *den1,double *den2,double *cn,dataptr dz)
  1154. {
  1155. int i, j;
  1156. int k;
  1157. float *buf = dz->sampbuf[0];
  1158. double ip, op = 0.0, b1;
  1159. for (i = 0 ; i < dz->ssampsread; i+=2) {
  1160. ip = (double)buf[i];
  1161. for (k = 0 ; k < dz->iparam[FLT_CNT]; k++) {
  1162. b1 = dz->param[FLT_MUL] * cn[k];
  1163. op = (cn[k] * ip) + (den1[k] * s1[k]) + (den2[k] * s2[k]) + (b1 * e1[k]) + (cn[k] * e2[k]);
  1164. s2[k] = s1[k];
  1165. s1[k] = op;
  1166. e2[k] = e1[k];
  1167. e1[k] = ip;
  1168. }
  1169. op *= dz->param[FLT_PRESCALE];
  1170. #ifdef NOTDEF
  1171. if (fabs(op) > F_MAXSAMP) {
  1172. dz->iparam[FLT_OVFLW]++;
  1173. dz->param[FLT_PRESCALE] *= .9999;
  1174. if (op > 0.0)
  1175. op = (double)F_MAXSAMP;
  1176. else
  1177. op = (double)F_MINSAMP;
  1178. }
  1179. buf[i] = (float)op;
  1180. #else
  1181. buf[i] = (float) check_float_limits(op,dz);
  1182. #endif
  1183. j = i+1;
  1184. ip = (double)buf[j];
  1185. for (k = 0 ; k < dz->iparam[FLT_CNT]; k++) {
  1186. b1 = dz->param[FLT_MUL] * cn[k];
  1187. op = (den1[k] * s1s[k]) + (den2[k] * s2s[k]) + (cn[k] * ip) + (b1 * e1s[k]) + (cn[k] * e2s[k]);
  1188. s2s[k] = s1s[k];
  1189. s1s[k] = op;
  1190. e2s[k] = e1s[k];
  1191. e1s[k] = ip;
  1192. }
  1193. op *= dz->param[FLT_PRESCALE];
  1194. #ifdef NOTDEF
  1195. if (fabs(op) > F_MAXSAMP) {
  1196. dz->iparam[FLT_OVFLW]++;
  1197. dz->param[FLT_PRESCALE] *= .9999;
  1198. if (op > 0.0)
  1199. op = (double)F_MAXSAMP;
  1200. else
  1201. op = (double)F_MINSAMP;
  1202. }
  1203. buf[j] = (float)op;
  1204. #else
  1205. buf[j] = (float) check_float_limits(op,dz);
  1206. #endif
  1207. }
  1208. }
  1209. /***************************** MY_MODULUS *************************************/
  1210. int my_modulus(int x,int y)
  1211. {
  1212. if(x>=0)
  1213. return(x%y);
  1214. while(x < 0)
  1215. x += y;
  1216. return(x);
  1217. }
  1218. /**************************** NEWFVAL2 *******************************/
  1219. int newfval2(double *fbrk,double *hbrk,dataptr dz)
  1220. {
  1221. int n, m, k, timepoint, nextrow;
  1222. int entrycnt = dz->iparam[FLT_ENTRYCNT];
  1223. int wordcnt = dz->iparam[FLT_WORDCNT];
  1224. int hentrycnt = dz->iparam[HRM_ENTRYCNT];
  1225. int hwordcnt = dz->iparam[HRM_WORDCNT];
  1226. //long srate = dz->infile->srate;
  1227. double lotime, hitime, timefrac, valdiff;
  1228. double thistime = dz->param[FLT_TOTALTIME];
  1229. memset((char *)dz->parray[FLT_INFRQ],0,dz->iparam[FLT_CNT] * sizeof(double));
  1230. memset((char *)dz->parray[FLT_INAMP],0,dz->iparam[FLT_CNT] * sizeof(double));
  1231. timepoint = 0;
  1232. while(thistime >= fbrk[timepoint]) { /* search times in frq array */
  1233. timepoint += entrycnt;
  1234. if(timepoint >= wordcnt)
  1235. break;
  1236. }
  1237. timepoint -= entrycnt;
  1238. lotime = fbrk[timepoint];
  1239. nextrow = timepoint + entrycnt;
  1240. for(n = timepoint+1,k = 0; n < nextrow;n+=2,k += dz->iparam[FLT_HARMCNT]) {
  1241. dz->parray[FLT_INFRQ][k] = fbrk[n]; /* Get frqs of fundamentals into array, leaving space for harmonics */
  1242. dz->parray[FLT_INAMP][k] = fbrk[n+1]; /* Get amps of fundamentals into array, leaving space for harmonics */
  1243. }
  1244. if(nextrow != wordcnt) { /* if not at end of table, do interpolation */
  1245. nextrow += entrycnt;
  1246. timepoint += entrycnt;
  1247. hitime = fbrk[timepoint];
  1248. timefrac = (thistime - lotime)/(hitime - lotime);
  1249. k = 0;
  1250. for(n = timepoint+1,k=0; n < nextrow;n+=2,k += dz->iparam[FLT_HARMCNT]) {
  1251. /* FRQ */
  1252. valdiff = fbrk[n] - dz->parray[FLT_INFRQ][k];
  1253. valdiff *= timefrac;
  1254. dz->parray[FLT_INFRQ][k] = dz->parray[FLT_INFRQ][k] + valdiff;
  1255. /* AMP */
  1256. valdiff = fbrk[n+1] - dz->parray[FLT_INAMP][k];
  1257. valdiff *= timefrac;
  1258. dz->parray[FLT_INAMP][k] = dz->parray[FLT_INAMP][k] + valdiff;
  1259. }
  1260. }
  1261. timepoint = 0;
  1262. while(thistime >= hbrk[timepoint]) { /* search times in frq array */
  1263. timepoint += hentrycnt;
  1264. if(timepoint >= hwordcnt) {
  1265. break;
  1266. }
  1267. }
  1268. timepoint -= hentrycnt;
  1269. lotime = hbrk[timepoint];
  1270. nextrow = timepoint + hentrycnt;
  1271. k = 0;
  1272. for(n = timepoint+1,k=0; n < nextrow;n+=2,k++) {
  1273. dz->parray[HARM_FRQ_CALC][k] = hbrk[n];
  1274. dz->parray[HARM_AMP_CALC][k] = hbrk[n+1];
  1275. }
  1276. if(nextrow != hwordcnt) { /* if not at end of table, do interpolation */
  1277. nextrow += hentrycnt;
  1278. timepoint += hentrycnt;
  1279. hitime = hbrk[timepoint];
  1280. timefrac = (thistime - lotime)/(hitime - lotime);
  1281. k = 0;
  1282. for(n = timepoint+1,k=0; n < nextrow;n+=2,k++) {
  1283. /* PARTIAL MULTIPLIER */
  1284. valdiff = hbrk[n] - dz->parray[HARM_FRQ_CALC][k];
  1285. valdiff *= timefrac;
  1286. dz->parray[HARM_FRQ_CALC][k] = dz->parray[HARM_FRQ_CALC][k] + valdiff;
  1287. /* PARTIAL AMP */
  1288. valdiff = hbrk[n+1] - dz->parray[HARM_AMP_CALC][k];
  1289. valdiff *= timefrac;
  1290. dz->parray[HARM_AMP_CALC][k] = dz->parray[HARM_AMP_CALC][k] + valdiff;
  1291. }
  1292. }
  1293. for(k=0;k<dz->iparam[FLT_CNT];k+=dz->iparam[FLT_HARMCNT]) {
  1294. for(m=0; m < dz->iparam[FLT_HARMCNT];m++) { /* calc vals for partials from basefrq vals */
  1295. dz->parray[FLT_INFRQ][k+m] = dz->parray[FLT_INFRQ][k] * dz->parray[HARM_FRQ_CALC][m];
  1296. dz->parray[FLT_INAMP][k+m] = dz->parray[FLT_INAMP][k] * dz->parray[HARM_AMP_CALC][m];
  1297. dz->parray[FLT_FRQ][k+m] = dz->parray[FLT_INFRQ][k+m];
  1298. dz->parray[FLT_AMP][k+m] = dz->parray[FLT_INAMP][k+m];
  1299. }
  1300. }
  1301. dz->param[FLT_TOTALTIME] += dz->param[FLT_TIMESTEP];
  1302. return(FINISHED);
  1303. }
  1304. /*************************** DO_FVARY2_FILTERS *****************************/
  1305. int do_fvary2_filters(dataptr dz)
  1306. {
  1307. int exit_status;
  1308. int n, fno, chans = dz->infile->channels;
  1309. float *buf = dz->sampbuf[0];
  1310. //double *fincr = dz->parray[FLT_FINCR];
  1311. //double *aincr = dz->parray[FLT_AINCR];
  1312. double *ampl = dz->parray[FLT_AMPL];
  1313. double *a = dz->parray[FLT_A];
  1314. double *b = dz->parray[FLT_B];
  1315. double *y = dz->parray[FLT_Y];
  1316. double *z = dz->parray[FLT_Z];
  1317. double *d = dz->parray[FLT_D];
  1318. double *e = dz->parray[FLT_E];
  1319. int fsams = dz->iparam[FLT_FSAMS];
  1320. for (n = 0; n < dz->ssampsread; n += chans) {
  1321. if(dz->brksize[FLT_Q]) {
  1322. if((dz->iparam[FLT_SAMS] -= chans) <= 0) {
  1323. if(!newvalue(FLT_Q,FLT_Q_INCR,FLT_SAMS,dz)) {
  1324. sprintf(errstr,"Ran out of Q values: do_fvary2_filters()\n");
  1325. return(PROGRAM_ERROR);
  1326. }
  1327. dz->iparam[FLT_SAMS] *= chans;
  1328. }
  1329. }
  1330. if(fsams <= 0) {
  1331. if((exit_status = newfval2(dz->parray[FLT_FBRK],dz->parray[FLT_HBRK],dz))<0)
  1332. return(exit_status);
  1333. fsams = dz->iparam[FLT_FSAMS];
  1334. for (fno = 0; fno < dz->iparam[FLT_CNT]; fno++) {
  1335. get_coeffs1(fno,dz);
  1336. get_coeffs2(fno,dz);
  1337. }
  1338. if(dz->brksize[FLT_Q])
  1339. dz->param[FLT_Q] *= dz->param[FLT_Q_INCR];
  1340. }
  1341. filtering(n,chans,buf,a,b,y,z,d,e,ampl,dz);
  1342. fsams--;
  1343. }
  1344. return(CONTINUE);
  1345. }