filters0.c 55 KB

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