Changeset 56ef7e1 for src/onset/peakpick.c
- Timestamp:
- Oct 18, 2009, 3:08:59 PM (15 years ago)
- Branches:
- feature/autosink, feature/cnn, feature/cnn_org, feature/constantq, feature/crepe, feature/crepe_org, feature/pitchshift, feature/pydocstrings, feature/timestretch, fix/ffmpeg5, master, pitchshift, sampler, timestretch, yinfft+
- Children:
- e5f49af
- Parents:
- 74516f7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/onset/peakpick.c
r74516f7 r56ef7e1 53 53 fvec_t * scratch; 54 54 55 /** number of channels to analyse */ 56 uint_t channels; 57 55 58 /** \bug should be used to calculate filter coefficients */ 56 59 /* cutoff: low-pass filter cutoff [0.34, 1] */ … … 68 71 * is slightly more permissive than the offline one, and yelds to an increase 69 72 * of false positives. best */ 70 smpl_t aubio_peakpicker_do(aubio_peakpicker_t * p, fvec_t * onset) { 71 fvec_t * onset_keep = (fvec_t *)p->onset_keep; 72 fvec_t * onset_proc = (fvec_t *)p->onset_proc; 73 fvec_t * onset_peek = (fvec_t *)p->onset_peek; 74 fvec_t * scratch = (fvec_t *)p->scratch; 75 smpl_t mean = 0., median = 0.; 76 smpl_t isonset = 0.; 77 uint_t length = p->win_post + p->win_pre + 1; 78 uint_t i = 0, j; 73 void 74 aubio_peakpicker_do (aubio_peakpicker_t * p, fvec_t * onset, fvec_t * out) 75 { 76 fvec_t *onset_keep = p->onset_keep; 77 fvec_t *onset_proc = p->onset_proc; 78 fvec_t *onset_peek = p->onset_peek; 79 fvec_t *scratch = p->scratch; 80 smpl_t mean = 0., median = 0.; 81 uint_t length = p->win_post + p->win_pre + 1; 82 uint_t i, j = 0; 79 83 80 /* store onset in onset_keep */ 81 /* shift all elements but last, then write last*/82 /* for (i=0;i<channels;i++) {*/83 for (j=0;j<length-1;j++) {84 onset_keep->data[i][j] = onset_keep->data[i][j+1];85 86 87 onset_keep->data[i][length-1] = onset->data[i][0];88 onset_proc->data[i][length-1] = onset->data[i][0];89 /* } */ 84 for (i = 0; i < p->channels; i++) { 85 /* store onset in onset_keep */ 86 /* shift all elements but last, then write last */ 87 for (j = 0; j < length - 1; j++) { 88 onset_keep->data[i][j] = onset_keep->data[i][j + 1]; 89 onset_proc->data[i][j] = onset_keep->data[i][j]; 90 } 91 onset_keep->data[i][length - 1] = onset->data[i][0]; 92 onset_proc->data[i][length - 1] = onset->data[i][0]; 93 } 90 94 91 92 93 95 /* filter onset_proc */ 96 /** \bug filtfilt calculated post+pre times, should be only once !? */ 97 //aubio_biquad_do_filtfilt(p->biquad,onset_proc,scratch); 94 98 95 /* calculate mean and median for onset_proc */ 96 /* for (i=0;i<onset_proc->channels;i++) { */ 97 mean = fvec_mean(onset_proc); 98 /* copy to scratch */ 99 for (j = 0; j < length; j++) 100 scratch->data[i][j] = onset_proc->data[i][j]; 101 median = p->thresholdfn(scratch); 102 /* } */ 99 for (i = 0; i < p->channels; i++) { 100 /* calculate mean and median for onset_proc */ 101 mean = fvec_mean_channel (onset_proc, i); 102 /* copy to scratch */ 103 for (j = 0; j < length; j++) 104 scratch->data[i][j] = onset_proc->data[i][j]; 105 median = p->thresholdfn (scratch, i); 103 106 104 /* for (i=0;i<onset->channels;i++) { */ 105 /* shift peek array */ 106 for (j=0;j<3-1;j++) 107 onset_peek->data[i][j] = onset_peek->data[i][j+1]; 108 /* calculate new peek value */ 109 onset_peek->data[i][2] = 110 onset_proc->data[i][p->win_post] - median - mean * p->threshold; 111 /* } */ 112 //AUBIO_DBG("%f\n", onset_peek->data[0][2]); 113 isonset = (p->pickerfn)(onset_peek,1); 114 if (isonset) { //(isonset) { 115 isonset = fvec_quadint(onset_peek, 1, 1); 107 /* shift peek array */ 108 for (j = 0; j < 3 - 1; j++) 109 onset_peek->data[i][j] = onset_peek->data[i][j + 1]; 110 /* calculate new peek value */ 111 onset_peek->data[i][2] = 112 onset_proc->data[i][p->win_post] - median - mean * p->threshold; 113 out->data[i][0] = (p->pickerfn) (onset_peek, 1); 114 if (out->data[i][0]) { 115 out->data[i][0] = fvec_quadint (onset_peek, 1, i); 116 } 116 117 } 117 return isonset;118 118 } 119 119 … … 126 126 } 127 127 128 /** function added by Miguel Ramirez to return the onset detection amplitude in peakval */129 128 uint_t aubio_peakpicker_set_threshold(aubio_peakpicker_t * p, smpl_t threshold) { 130 129 p->threshold = threshold; 131 130 return AUBIO_OK; 132 131 } … … 145 144 } 146 145 147 aubio_peakpicker_t * new_aubio_peakpicker( smpl_t threshold) {146 aubio_peakpicker_t * new_aubio_peakpicker(uint_t channels) { 148 147 aubio_peakpicker_t * t = AUBIO_NEW(aubio_peakpicker_t); 149 148 t->threshold = 0.1; /* 0.0668; 0.33; 0.082; 0.033; */ 150 if (threshold > 0. && threshold < 10.)151 t->threshold = threshold;152 149 t->win_post = 5; 153 150 t->win_pre = 1; 151 //channels = 1; 152 t->channels = channels; 154 153 155 t->thresholdfn = (aubio_thresholdfn_t)(fvec_median ); /* (fvec_mean); */154 t->thresholdfn = (aubio_thresholdfn_t)(fvec_median_channel); /* (fvec_mean); */ 156 155 t->pickerfn = (aubio_pickerfn_t)(fvec_peakpick); 157 156 158 t->scratch = new_fvec(t->win_post+t->win_pre+1, 1);159 t->onset_keep = new_fvec(t->win_post+t->win_pre+1, 1);160 t->onset_proc = new_fvec(t->win_post+t->win_pre+1, 1);161 t->onset_peek = new_fvec(3, 1);157 t->scratch = new_fvec(t->win_post+t->win_pre+1, channels); 158 t->onset_keep = new_fvec(t->win_post+t->win_pre+1, channels); 159 t->onset_proc = new_fvec(t->win_post+t->win_pre+1, channels); 160 t->onset_peek = new_fvec(3, channels); 162 161 163 162 /* cutoff: low-pass filter cutoff [0.34, 1] */
Note: See TracChangeset
for help on using the changeset viewer.