Changeset b4eadf0
 Timestamp:
 Feb 1, 2017, 10:53:54 PM (8 years ago)
 Branches:
 yinfft+
 Children:
 a7b14a6
 Parents:
 8f0db97
 gitauthor:
 Eduard Müller <mueller.eduard@googlemail.com> (01/13/17 16:33:37)
 gitcommitter:
 Paul Brossier <piem@piem.org> (02/01/17 22:53:54)
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

src/pitch/pitchyinfft.c
r8f0db97 rb4eadf0 38 38 smpl_t tol; /**< Yin tolerance */ 39 39 smpl_t confidence; /**< confidence */ 40 uint_t s hort_period; /** shortest period under which to check for octave error*/40 uint_t samplerate; /**< samplerate we got initialized with */ 41 41 }; 42 42 … … 70 70 p>win = new_aubio_window ("hanningz", bufsize); 71 71 p>weight = new_fvec (bufsize / 2 + 1); 72 p>samplerate = samplerate; 72 73 for (i = 0; i < p>weight>length; i++) { 73 74 freq = (smpl_t) i / (smpl_t) bufsize *(smpl_t) samplerate; … … 94 95 //p>weight>data[i] = SQRT(DB2LIN(p>weight>data[i])); 95 96 } 96 // check for octave errors above 1300 Hz 97 p>short_period = (uint_t)ROUND(samplerate / 1300.); 97 98 // disable weighting 99 fvec_set_all (p>weight, 1.0); 100 98 101 return p; 99 102 … … 113 116 fvec_t *yin = p>yinfft; 114 117 smpl_t tmp = 0., sum = 0.; 118 115 119 // window the input 116 120 fvec_weighted_copy(input, p>win, p>winput); … … 146 150 } 147 151 } 148 // find best candidates 149 tau = fvec_min_elem (yin); 150 if (yin>data[tau] < p>tol) { 151 // no interpolation, directly return the period as an integer 152 //output>data[0] = tau; 153 //return; 154 155 // 3 point quadratic interpolation 156 //return fvec_quadratic_peak_pos (yin,tau,1); 157 /* additional check for (unlikely) octave doubling in higher frequencies */ 158 if (tau > p>short_period) { 159 output>data[0] = fvec_quadratic_peak_pos (yin, tau); 160 } else { 161 /* should compare the minimum value of each interpolated peaks */ 162 halfperiod = FLOOR (tau / 2 + .5); 163 if (yin>data[halfperiod] < p>tol) 164 output>data[0] = fvec_quadratic_peak_pos (yin, halfperiod); 165 else 166 output>data[0] = fvec_quadratic_peak_pos (yin, tau); 167 } 168 } else { 152 153 // calc min available confidence first 154 tmp = fvec_min(yin); 155 if (tmp > p>tol) { 156 // give up  got no confident candidate at all 169 157 output>data[0] = 0.; 170 } 158 return; 159 } 160 161 // choose lowest confident candidate first, to avoid choosing harmonics 162 tau = 0; 163 for (l = 1; l < yin>length; l++) { 164 // is this candidate "roughly" as good as the lowest one? 165 if (ABS (yin>data[l]  tmp) < 0.1) { 166 tau = l; 167 break; 168 } 169 } 170 // find local min around current pick to sharpen the results 171 const uint_t LOCAL_NOTE_SEEK_RANGE = 1; 172 const smpl_t note = aubio_bintomidi (tau, p>samplerate, p>fftout>length); 173 const uint_t startbin = MAX (0, (uint_t)aubio_miditobin (note  LOCAL_NOTE_SEEK_RANGE, 174 p>samplerate, p>fftout>length)); 175 const uint_t endbin = MIN (yin>length, (uint_t)(aubio_miditobin (note + LOCAL_NOTE_SEEK_RANGE, 176 p>samplerate, p>fftout>length) + 0.5)); 177 tmp = yin>data[tau]; 178 for (l = startbin; l < endbin; l++) { 179 if (yin>data[l] < tmp ) { 180 tmp = yin>data[l]; 181 tau = l; 182 } 183 } 184 output>data[0] = fvec_quadratic_peak_pos(yin, tau); 171 185 } 172 186
Note: See TracChangeset
for help on using the changeset viewer.