filters0-711.c 38 KB

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