specinfo.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  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. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <structures.h>
  24. #include <tkglobals.h>
  25. #include <pnames.h>
  26. #include <globcon.h>
  27. #include <processno.h>
  28. #include <modeno.h>
  29. #include <arrays.h>
  30. #include <flags.h>
  31. #include <specinfo.h>
  32. #include <cdpmain.h>
  33. #include <formants.h>
  34. #include <speccon.h>
  35. #include <sfsys.h>
  36. #include <osbind.h>
  37. #include <string.h>
  38. #include <specinfo.h>
  39. static int inner_level_loop(int windows_in_buf,dataptr dz);
  40. static int do_speclevel(dataptr dz);
  41. static int normalise_as_transfering_to_sndbuf_and_write_to_file(dataptr dz);
  42. static int read_another_buffer(int *totalwindows_in_buf,dataptr dz);
  43. static int zero_energy_bands(dataptr dz);
  44. static int print_energy_bands(dataptr dz);
  45. static int inner_textout_only_loop(int *peakscore,int *descnt,int windows_in_buf,dataptr dz);
  46. static int output_peak_data(dataptr dz);
  47. static int specpeak(dataptr dz);
  48. static int specprint(dataptr dz);
  49. static int specreport(int *peakscore,int *descnt,dataptr dz);
  50. static int find_maximum(int *maxloc,dataptr dz);
  51. static int print_window(int windowcnt,dataptr dz);
  52. static int report_stable_peaks(int *peakscore,int *descnt,dataptr dz);
  53. static int sort_peaks(int *peakscore,int *descnt,dataptr dz) ;
  54. static int sort_report_peaks_by_amplitude(int pkcnt_here,dataptr dz);
  55. static int sort_report_peaks_by_frq(int pkcnt_here,dataptr dz);
  56. static int show_new_peaks(int pkcnt_here,dataptr dz);
  57. static int print_peaks(int pkcnt_here,dataptr dz);
  58. /****************************** SPECWCNT ***************************/
  59. int specwcnt(dataptr dz)
  60. {
  61. sprintf(errstr,"File contains %d windows\n",dz->wlength);
  62. return(FINISHED);
  63. }
  64. /************************* SPECCHAN ***************************/
  65. int specchan(dataptr dz)
  66. {
  67. int thischan = (int)((dz->param[CHAN_FRQ]+(dz->halfchwidth))/dz->chwidth); /* TRUNCATE */
  68. sprintf(errstr,"%.2lf Hz is in channel %d\n",dz->param[CHAN_FRQ],thischan);
  69. return(FINISHED);
  70. }
  71. /************************* SPECFRQ ***************************/
  72. int specfrq(dataptr dz)
  73. {
  74. double frq = (double)dz->iparam[FRQ_CHAN] * dz->chwidth;
  75. sprintf(errstr,"%.2lf Hz is centre frq of channel %d\n",frq,dz->iparam[FRQ_CHAN]);
  76. return(FINISHED);
  77. }
  78. /**************************** SPECLEVEL ****************************/
  79. int speclevel(dataptr dz)
  80. {
  81. int exit_status;
  82. int samps_read, windows_in_buf;
  83. if(sloom)
  84. dz->total_samps_read = 0L;
  85. while((samps_read = fgetfbufEx(dz->bigfbuf,dz->big_fsize,dz->ifd[0],0)) > 0) {
  86. if(sloom)
  87. dz->total_samps_read += samps_read;
  88. dz->flbufptr[0] = dz->bigfbuf;
  89. windows_in_buf = samps_read/dz->wanted;
  90. if((exit_status = inner_level_loop(windows_in_buf,dz))<0)
  91. return(exit_status);
  92. if(dz->finished)
  93. break;
  94. }
  95. if(samps_read<0) {
  96. sprintf(errstr,"Sound read error.\n");
  97. return(SYSTEM_ERROR);
  98. }
  99. if((exit_status = normalise_as_transfering_to_sndbuf_and_write_to_file(dz))<0)
  100. return(exit_status);
  101. return(FINISHED);
  102. }
  103. /**************************** INNER_LEVEL_LOOP ****************************/
  104. int inner_level_loop(int windows_in_buf,dataptr dz)
  105. {
  106. int exit_status;
  107. int wc;
  108. for(wc=0; wc<windows_in_buf; wc++) {
  109. if((exit_status = do_speclevel(dz))<0)
  110. return(exit_status);
  111. dz->flbufptr[0] += dz->wanted;
  112. dz->total_windows++;
  113. }
  114. return(FINISHED);
  115. }
  116. /**************************** DO_SPECLEVEL ****************************/
  117. int do_speclevel(dataptr dz)
  118. {
  119. #define VERY_BIG (10000000.0)
  120. int vc;
  121. dz->parray[0][dz->itemcnt] = 0.0;
  122. for(vc = 0; vc < dz->wanted; vc += 2)
  123. dz->parray[0][dz->itemcnt] += dz->flbufptr[0][vc];
  124. if(dz->parray[0][dz->itemcnt] > VERY_BIG) {
  125. sprintf(errstr,"Apparent(?) huge signal level in analysis window %d. do_speclevel()\n",dz->itemcnt + 1);
  126. return(PROGRAM_ERROR);
  127. }
  128. if(++dz->itemcnt > dz->wlength) {
  129. sprintf(errstr,"Storage arithmetic problem in do_speclevel().\n");
  130. return(PROGRAM_ERROR);
  131. }
  132. return(FINISHED);
  133. }
  134. /********** NORMALISE_AS_TRANSFERING_TO_SNDBUF_AND_WRITE_TO_FILE *********/
  135. int normalise_as_transfering_to_sndbuf_and_write_to_file(dataptr dz)
  136. {
  137. double maxwindow = 0.0, normaliser;
  138. int n;
  139. for(n=0;n<dz->wlength;n++) {
  140. if(dz->parray[0][n] > maxwindow)
  141. maxwindow = dz->parray[0][n];
  142. }
  143. if(flteq(maxwindow,0.0)) {
  144. sprintf(errstr,"No signal level in analysis file.\n");
  145. return(DATA_ERROR);
  146. }
  147. normaliser = F_MAXSAMP/maxwindow;
  148. for(n=0;n<dz->wlength;n++)
  149. dz->sndbuf[n] = (float)(dz->parray[0][n] * normaliser);
  150. return write_samps(dz->sndbuf,dz->wlength,dz);
  151. }
  152. /**************************** SPECOCTVU ****************************/
  153. int specoctvu(dataptr dz)
  154. {
  155. int exit_status;
  156. int totalwindows_in_buf, windownumber_in_buf;
  157. int x, q, n;
  158. double topfrq;
  159. if((exit_status = read_another_buffer(&totalwindows_in_buf,dz))!=CONTINUE) {
  160. if(exit_status==FINISHED)
  161. fprintf(stdout,"WARNING: No data in input file.\n");
  162. return(exit_status);
  163. }
  164. windownumber_in_buf = 0;
  165. while(dz->total_windows < dz->wlength && totalwindows_in_buf > 0) {
  166. if((exit_status = zero_energy_bands(dz))<0)
  167. return(exit_status);
  168. for(x = 0; x<dz->iparam[OCTVU_TBLOK];x++) {
  169. if(windownumber_in_buf >= totalwindows_in_buf) {
  170. if((exit_status = read_another_buffer(&totalwindows_in_buf,dz))!=CONTINUE)
  171. break;
  172. windownumber_in_buf = 0;
  173. }
  174. q = n = 0;
  175. topfrq = dz->param[OCTVU_BBBTOP];
  176. for(q=0;q<dz->itemcnt;q++) {
  177. for(n = dz->iparray[OCTVU_CHBBOT][q]; n < dz->iparray[OCTVU_CHBTOP][q]; n += 2) {
  178. if(fabs(dz->flbufptr[0][n+1]) < topfrq)
  179. dz->parray[OCTVU_ENERGY][q] += dz->flbufptr[0][n];
  180. }
  181. topfrq *= 2.0;
  182. }
  183. dz->flbufptr[0] += dz->wanted;
  184. windownumber_in_buf++;
  185. if(++dz->total_windows >= dz->wlength) {
  186. break;
  187. }
  188. }
  189. if(exit_status<0)
  190. return(exit_status);
  191. if(x>0 && (exit_status = print_energy_bands(dz))<0)
  192. return(exit_status);
  193. }
  194. return(FINISHED);
  195. }
  196. /**************************** READ_ANOTHER_BUFFER ****************************/
  197. int read_another_buffer(int *totalwindows_in_buf,dataptr dz)
  198. {
  199. int samps_read;
  200. if((samps_read = fgetfbufEx(dz->bigfbuf, dz->big_fsize,dz->ifd[0],0)) <= 0) {
  201. if(samps_read<0) {
  202. sprintf(errstr,"Sound read error.\n");
  203. return(SYSTEM_ERROR);
  204. }
  205. return(FINISHED);
  206. }
  207. dz->flbufptr[0] = dz->bigfbuf;
  208. *totalwindows_in_buf = samps_read/dz->wanted;
  209. return(CONTINUE);
  210. }
  211. /**************************** ZERO_ENERGY_BANDS ****************************/
  212. int zero_energy_bands(dataptr dz)
  213. {
  214. int n;
  215. for(n=0;n<dz->itemcnt;n++)
  216. dz->parray[OCTVU_ENERGY][n] = 0.0;
  217. return(FINISHED);
  218. }
  219. /******************** PRINT_ENERGY_BANDS ***********************/
  220. int print_energy_bands(dataptr dz)
  221. {
  222. #define SCALEFACT (5000.0)
  223. int n;
  224. char temp[64];
  225. double output;
  226. errstr[0] = ENDOFSTR;
  227. for(n=0;n<dz->itemcnt;n++) {
  228. output = SCALEFACT * dz->parray[OCTVU_ENERGY][n];
  229. if(output>0) {
  230. output = log(output);
  231. if(sloom) {
  232. sprintf(temp,"%.3lf",output);
  233. strcat(errstr,temp);
  234. }
  235. fprintf(dz->fp,"%.3lf",output);
  236. } else {
  237. if(sloom) {
  238. sprintf(temp,"-----"/*,output*/);
  239. strcat(errstr,temp);
  240. }
  241. fprintf(dz->fp,"-----");
  242. }
  243. if(n < dz->itemcnt-1) {
  244. if(sloom)
  245. strcat(errstr,"\t");
  246. fprintf(dz->fp,"\t");
  247. } else {
  248. if(sloom) {
  249. fprintf(stdout,"INFO: %s\n",errstr);
  250. fflush(stdout);
  251. errstr[0] = ENDOFSTR;
  252. }
  253. fprintf(dz->fp,"\n");
  254. }
  255. }
  256. return(FINISHED);
  257. }
  258. /**************************** OUTER_TEXTOUT_ONLY_LOOP ****************************/
  259. int outer_textout_only_loop(dataptr dz)
  260. {
  261. int exit_status;
  262. int samps_read, windows_in_buf;
  263. int peakscore = 0;
  264. int descnt = 0;
  265. dz->time = 0.0f;
  266. while((samps_read = fgetfbufEx(dz->bigfbuf, dz->big_fsize,dz->ifd[0],0)) > 0) {
  267. dz->flbufptr[0] = dz->bigfbuf;
  268. windows_in_buf = samps_read/dz->wanted;
  269. if((exit_status = inner_textout_only_loop(&peakscore,&descnt,windows_in_buf,dz))<0)
  270. return(exit_status);
  271. if(dz->finished)
  272. break;
  273. }
  274. if(samps_read<0) {
  275. sprintf(errstr,"Sound read error.\n");
  276. return(SYSTEM_ERROR);
  277. }
  278. if(dz->process == PEAK && dz->itemcnt) {
  279. if((exit_status = output_peak_data(dz))<0)
  280. return(exit_status);
  281. }
  282. return(FINISHED);
  283. }
  284. /**************************** INNER_TEXTOUT_ONLY_LOOP ****************************/
  285. int inner_textout_only_loop(int *peakscore,int *descnt,int windows_in_buf,dataptr dz)
  286. {
  287. int exit_status;
  288. int wc;
  289. for(wc=0; wc<windows_in_buf; wc++) {
  290. if(dz->total_windows==0) {
  291. if((exit_status = skip_or_special_operation_on_window_zero(dz))<0)
  292. return(exit_status);
  293. if(exit_status==TRUE) {
  294. dz->flbufptr[0] += dz->wanted;
  295. dz->total_windows++;
  296. continue;
  297. }
  298. }
  299. if((exit_status = read_values_from_all_existing_brktables((double)dz->time,dz))<0)
  300. return(exit_status);
  301. switch(dz->process) {
  302. case(PEAK): exit_status = specpeak(dz); break;
  303. case(PRINT): exit_status = specprint(dz); break;
  304. case(REPORT): exit_status = specreport(peakscore,descnt,dz); break;
  305. default:
  306. sprintf(errstr,"unknown process in inner_textout_only_loop()\n");
  307. return(PROGRAM_ERROR);
  308. }
  309. if(exit_status<0)
  310. return(exit_status);
  311. dz->flbufptr[0] += dz->wanted;
  312. dz->total_windows++;
  313. dz->time = (float)(dz->time + dz->frametime);
  314. }
  315. return(FINISHED);
  316. }
  317. /******************************** OUTPUT_PEAK_DATA *************************/
  318. int output_peak_data(dataptr dz)
  319. {
  320. int exit_status;
  321. int here;
  322. int k;
  323. double frqtop, frqbot, starttime;
  324. starttime = dz->param[PEAK_ENDTIME];
  325. dz->param[PEAK_ENDTIME] += (dz->iparam[PEAK_TGROUP] * dz->frametime);
  326. if((exit_status = find_maximum(&here,dz))<0)
  327. return(exit_status);
  328. if(here==0)
  329. frqbot = dz->param[PEAK_CUTOFF];
  330. else
  331. frqbot = dz->parray[PEAK_BAND][here-1];
  332. frqtop = dz->parray[PEAK_BAND][here];
  333. if(sloom) {
  334. fprintf(stdout,"INFO: WINDOW\t%.4lf\t%.4lf\t:PEB \t%.4lf\tTO\t%.4lf\n",starttime, dz->param[PEAK_ENDTIME], frqbot, frqtop);
  335. fflush(stdout);
  336. }
  337. fprintf(dz->fp,"WINDOW\t%.4lf\t%.4lf\t:PEB \t%.4lf\tTO\t%.4lf\n",starttime, dz->param[PEAK_ENDTIME], frqbot, frqtop);
  338. for(k=0;k<dz->iparam[PEAK_BANDCNT];k++)
  339. dz->parray[PEAK_MAXI][k] = 0.0;
  340. return(FINISHED);
  341. }
  342. /****************************** SPECPEAK ****************************/
  343. int specpeak(dataptr dz)
  344. {
  345. int exit_status;
  346. double thisamp, sensitivity_of_ear;
  347. int cc, vc, n;
  348. for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2) {
  349. if(dz->flbufptr[0][FREQ]<dz->param[PEAK_CUTOFF] || dz->flbufptr[0][FREQ]>dz->nyquist)
  350. continue;
  351. n = 0;
  352. while(dz->flbufptr[0][FREQ] > dz->parray[PEAK_BAND][n])
  353. n++;
  354. thisamp = dz->flbufptr[0][AMPP];
  355. if(dz->vflag[PEAK_HEAR]) {
  356. if((exit_status = getspecenvamp(&sensitivity_of_ear,dz->flbufptr[0][FREQ],0,dz))<0)
  357. return(exit_status);
  358. thisamp *= sensitivity_of_ear;
  359. }
  360. dz->parray[PEAK_MAXI][n] += thisamp;
  361. }
  362. if(++dz->itemcnt >= dz->iparam[PEAK_TGROUP]) {
  363. if((exit_status = output_peak_data(dz))<0)
  364. return(exit_status);
  365. dz->itemcnt = 0;
  366. }
  367. return(FINISHED);
  368. }
  369. /****************************** SPECPRINT ****************************/
  370. int specprint(dataptr dz)
  371. {
  372. int exit_status;
  373. if(dz->total_windows >= dz->iparam[PRNT_ENDW]) {
  374. dz->finished = 1;
  375. return(FINISHED);
  376. }
  377. if(dz->total_windows >= dz->iparam[PRNT_STARTW]) {
  378. if((exit_status = print_window(dz->total_windows,dz))<0)
  379. return(exit_status);
  380. }
  381. return(FINISHED);
  382. }
  383. /**************************** SPECREPORT ***************************/
  384. int specreport(int *peakscore,int *descnt,dataptr dz)
  385. {
  386. int exit_status;
  387. double lofrq, hifrq;
  388. lofrq = dz->param[REPORT_LOFRQ];
  389. hifrq = dz->param[REPORT_HIFRQ];
  390. if(dz->brksize[REPORT_LOFRQ] || dz->brksize[REPORT_HIFRQ]) {
  391. if(flteq(lofrq,hifrq)) {
  392. sprintf(errstr,"Frequency limits define a zero-width band at time %.2lf.\n",dz->time);
  393. return(USER_ERROR);
  394. }
  395. if(lofrq > hifrq)
  396. swap(&lofrq,&hifrq);
  397. }
  398. rectify_window(dz->flbufptr[0],dz);
  399. if((exit_status = extract_specenv(0,0,dz))<0)
  400. return(exit_status);
  401. if((exit_status = report_stable_peaks(peakscore,descnt,dz))<0)
  402. return(exit_status);
  403. return(FINISHED);
  404. }
  405. /**************************** FIND_MAXIMUM **************************/
  406. int find_maximum(int *maxloc,dataptr dz)
  407. {
  408. double thismax = -1.0;
  409. int k;
  410. *maxloc = -1;
  411. for(k=0;k<dz->iparam[PEAK_BANDCNT];k++) {
  412. if(dz->parray[PEAK_MAXI][k] > thismax) {
  413. thismax = dz->parray[PEAK_MAXI][k];
  414. *maxloc = k;
  415. }
  416. }
  417. /* what if maxloc is NOT SET */
  418. if(*maxloc < 0) {
  419. sprintf(errstr,"Failed to find any peak in data\n");
  420. return(GOAL_FAILED);
  421. }
  422. return(FINISHED);
  423. }
  424. /******************************** PRINT_WINDOW *************************/
  425. int print_window(int windowcnt,dataptr dz)
  426. {
  427. int cc, vc;
  428. fprintf(dz->fp,"************* WINDOW %d *****************\n",windowcnt);
  429. for( cc = 0 ,vc = 0; cc < dz->clength; cc++, vc += 2) {
  430. fprintf(dz->fp,"amp[%d] = %.12f\t",cc,dz->flbufptr[0][AMPP]);
  431. if(dz->flbufptr[0][FREQ] < .01f)
  432. fprintf(dz->fp,"frq[%d] = %lf\n",cc,dz->flbufptr[0][FREQ]);
  433. else
  434. fprintf(dz->fp,"frq[%d] = %.2lf\n",cc,dz->flbufptr[0][FREQ]);
  435. }
  436. return(FINISHED);
  437. }
  438. /****************************** REPORT_STABLE_PEAKS ***************************/
  439. int report_stable_peaks(int *peakscore,int *descnt,dataptr dz)
  440. {
  441. int exit_status;
  442. int thispkcnt;
  443. /* shuffle back stored specenvs */
  444. memmove((char *)dz->stable->spec[0],
  445. (char *)dz->stable->spec[1],dz->iparam[REPORT_SL1] * (dz->infile->specenvcnt * sizeof(int)));
  446. /* put latest specenv array here */
  447. memmove((char *)dz->stable->spec[dz->iparam[REPORT_SL1]],
  448. (char *)dz->specenvamp,(dz->infile->specenvcnt * sizeof(int)));
  449. /* shuffle back stored fpks */
  450. memmove((char *)dz->stable->fpk[0],
  451. (char *)dz->stable->fpk[1],dz->iparam[REPORT_SL1] * (dz->infile->specenvcnt * sizeof(int)));
  452. /* shuffle back stored fpk_totals */
  453. memmove((char *)dz->stable->total_pkcnt,
  454. (char *)(dz->stable->total_pkcnt+1),dz->iparam[REPORT_SL1] * sizeof(int));
  455. /* put into last fpk[z] store */
  456. if((exit_status = extract_formant_peaks2(REPORT_SL1,&thispkcnt,dz->param[REPORT_LOFRQ],dz->param[REPORT_HIFRQ],dz))<0)
  457. return(exit_status);
  458. dz->stable->total_pkcnt[dz->iparam[REPORT_SL1]] = thispkcnt;
  459. if(dz->total_windows >= dz->iparam[REPORT_SL1]) {
  460. if((exit_status = sort_peaks(peakscore,descnt,dz))<0)
  461. return(exit_status);
  462. }
  463. return(FINISHED);
  464. }
  465. /****************************** SORT_PEAKS ****************6**************/
  466. int sort_peaks(int *peakscore,int *descnt,dataptr dz)
  467. {
  468. int exit_status;
  469. int this_pkcnt;
  470. int n = 0, pkcnt_here;
  471. if(dz->total_windows<=dz->iparam[REPORT_SL1])
  472. memset((char *)dz->stable->design_score,0,dz->infile->specenvcnt * sizeof(int));
  473. if((exit_status = score_peaks(peakscore,REPORT_SL1,REPORT_STABL,dz))<0)
  474. return(exit_status);
  475. if(*peakscore==0)
  476. return(FINISHED);
  477. /* Find how many times each peak occurs across the stabilise buffers */
  478. if((exit_status = collect_scores(&this_pkcnt,descnt,dz))<0)
  479. return(exit_status);
  480. /* Sort these on the basis of the most commonly occuring */
  481. if((exit_status = sort_design(this_pkcnt,dz))<0)
  482. return(exit_status);
  483. if(this_pkcnt<=dz->itemcnt || (dz->stable->des[dz->itemcnt-1]->score > dz->stable->des[dz->itemcnt]->score)) {
  484. pkcnt_here = min(this_pkcnt,dz->itemcnt);
  485. for(n=0;n<pkcnt_here;n++) /* If most common pkcnt (or less) peaks more common than ALL others */
  486. dz->peakno[n] = dz->stable->des[n]->chan;/* these are the peaks to keep */
  487. } else { /* Else choose amongst equivalent peaks, in terms of amplitude */
  488. if((exit_status = sort_equivalent_scores(this_pkcnt,dz))<0)
  489. return(exit_status);
  490. pkcnt_here = dz->itemcnt;
  491. }
  492. switch(dz->mode) {
  493. case(AMP_ORDERED_TIMED):
  494. case(AMP_ORDERED_UNTIMED):
  495. if((exit_status = sort_report_peaks_by_amplitude(pkcnt_here,dz))<0)
  496. return(exit_status);
  497. break;
  498. case(FRQ_ORDERED_TIMED):
  499. case(FRQ_ORDERED_UNTIMED):
  500. if((exit_status = sort_report_peaks_by_frq(pkcnt_here,dz))<0)
  501. return(exit_status);
  502. break;
  503. default:
  504. sprintf(errstr,"unknown case in sort_peaks()\n");
  505. return(PROGRAM_ERROR);
  506. }
  507. if((exit_status = show_new_peaks(pkcnt_here,dz))<0)
  508. return(exit_status);
  509. if(dz->total_windows>dz->iparam[REPORT_SL1]) { /* Logically this should be '>=sl1' : but */
  510. if((exit_status = unscore_peaks(peakscore,dz))<0) /* don't have to subtract window 0, as NO PEAKS there */
  511. return(exit_status);
  512. }
  513. return(FINISHED);
  514. }
  515. /****************************** SORT_REPORT_PEAKS_BY_AMPLITUDE ******************************/
  516. int sort_report_peaks_by_amplitude(int pkcnt_here,dataptr dz)
  517. {
  518. int n, m, thischan;
  519. double thisamp;
  520. for(n=0;n<pkcnt_here;n++) { /* For every channel in the set of possible channels */
  521. dz->stable->des[n]->amp = 0.0; /* and store in des-array assocd with channel */
  522. thischan = dz->stable->des[n]->chan;
  523. for(m=0;m<dz->iparam[REPORT_STABL];m++) /* sum amplitudes in that chan across all specenv buffers */
  524. dz->stable->des[n]->amp += dz->stable->spec[m][thischan]; /* and store in des-array assocd with channel */
  525. }
  526. for(n=1;n<pkcnt_here;n++) {
  527. thisamp = dz->stable->des[n]->amp;
  528. m = n-1;
  529. while(m >= 0 && dz->stable->des[m]->amp > thisamp) {
  530. dz->stable->des[m+1]->amp = dz->stable->des[m]->amp;
  531. dz->stable->des[m+1]->chan = dz->stable->des[m]->chan;
  532. m--;
  533. }
  534. dz->stable->des[m+1]->amp = dz->stable->des[n]->amp;
  535. dz->stable->des[m+1]->chan = dz->stable->des[n]->chan;
  536. }
  537. return(FINISHED);
  538. }
  539. /****************************** SORT_REPORT_PEAKS_BY_FRQ ***************************/
  540. int sort_report_peaks_by_frq(int pkcnt_here,dataptr dz)
  541. {
  542. int n, m, k;
  543. for(n=0;n<pkcnt_here-1;n++) {
  544. for(m=n+1;m<pkcnt_here;m++) {
  545. if(dz->specenvfrq[dz->peakno[n]] > dz->specenvfrq[dz->peakno[m]]) {
  546. k = dz->peakno[m];
  547. dz->peakno[m] = dz->peakno[n];
  548. dz->peakno[n] = k;
  549. }
  550. }
  551. }
  552. return(FINISHED);
  553. }
  554. /****************************** SHOW_NEW_PEAKS ***************************/
  555. int show_new_peaks(int pkcnt_here,dataptr dz)
  556. {
  557. int exit_status;
  558. int n, m, newpeak = 0; /*RWD added init */
  559. if(pkcnt_here!=dz->iparam[REPORT_LAST_PKCNT_HERE]) {
  560. if((exit_status = print_peaks(pkcnt_here,dz))<0)
  561. return(exit_status);
  562. } else {
  563. for(n=0;n<pkcnt_here;n++) {
  564. newpeak = 1;
  565. for(m=0;m<dz->iparam[REPORT_LAST_PKCNT_HERE];m++) {
  566. if(dz->peakno[n] == dz->lastpeakno[m]) {
  567. newpeak = 0;
  568. break;
  569. }
  570. }
  571. if(newpeak)
  572. break;
  573. }
  574. if(newpeak) {
  575. if((exit_status = print_peaks(pkcnt_here,dz))<0)
  576. return(exit_status);
  577. }
  578. }
  579. dz->iparam[REPORT_LAST_PKCNT_HERE] = pkcnt_here;
  580. for(n = 0;n < pkcnt_here; n++)
  581. dz->lastpeakno[n] = dz->peakno[n];
  582. return(FINISHED);
  583. }
  584. /****************************** PRINT_PEAKS ***************************/
  585. int print_peaks(int pkcnt_here,dataptr dz)
  586. {
  587. int n;
  588. char temp[200];
  589. switch(dz->mode) {
  590. case(FRQ_ORDERED_TIMED):
  591. case(AMP_ORDERED_TIMED):
  592. if(sloom)
  593. sprintf(errstr,"%.3lf secs : ",dz->time - (dz->stable->offset * dz->frametime));
  594. fprintf(dz->fp,"%.3lf secs : ",dz->time - (dz->stable->offset * dz->frametime));
  595. case(FRQ_ORDERED_UNTIMED):
  596. case(AMP_ORDERED_UNTIMED):
  597. for(n=0;n<pkcnt_here;n++) {
  598. if(sloom) {
  599. sprintf(temp,"\t%.2f",dz->specenvfrq[dz->peakno[n]]);
  600. strcat(errstr,temp);
  601. }
  602. fprintf(dz->fp,"\t%.2f",dz->specenvfrq[dz->peakno[n]]);
  603. if(n && n%8==0) {
  604. if(sloom) {
  605. fprintf(stdout,"INFO: %s\n",errstr);
  606. fflush(stdout);
  607. sprintf(errstr,"\t\t");
  608. }
  609. fprintf(dz->fp,"\n\t\t");
  610. }
  611. }
  612. break;
  613. default:
  614. sprintf(errstr,"Unknown case in print_peaks()\n");
  615. return(PROGRAM_ERROR);
  616. }
  617. if(sloom) {
  618. fprintf(stdout,"INFO: %s\n",errstr);
  619. fflush(stdout);
  620. }
  621. fprintf(dz->fp,"\n");
  622. return(FINISHED);
  623. }