def f0Twm(pfreq, pmag, ef0max, minf0, maxf0, f0t=0): """ Function that wraps the f0 detection function TWM, selecting the possible f0 candidates and calling the function TWM with them pfreq, pmag: peak frequencies and magnitudes, ef0max: maximum error allowed, minf0, maxf0: minimum and maximum f0 f0t: f0 of previous frame if stable returns f0: fundamental frequency in Hz """ if (minf0 < 0): # raise exception if minf0 is smaller than 0 raise ValueError( "Minimum fundamental frequency (minf0) smaller than 0") if (maxf0 >= 10000): # raise exception if maxf0 is bigger than 10000Hz raise ValueError( "Maximum fundamental frequency (maxf0) bigger than 10000Hz") if (pfreq.size < 3) & ( f0t == 0): # return 0 if less than 3 peaks and not previous f0 return 0 f0c = np.argwhere((pfreq > minf0) & (pfreq < maxf0))[:, 0] # use only peaks within given range if (f0c.size == 0): # return 0 if no peaks within range return 0 f0cf = pfreq[f0c] # frequencies of peak candidates f0cm = pmag[f0c] # magnitude of peak candidates if f0t > 0: # if stable f0 in previous frame shortlist = np.argwhere( np.abs(f0cf - f0t) < f0t / 2.0)[:, 0] # use only peaks close to it maxc = np.argmax(f0cm) maxcfd = f0cf[maxc] % f0t if maxcfd > f0t / 2: maxcfd = f0t - maxcfd if (maxc not in shortlist) and ( maxcfd > (f0t / 4)): # or the maximum magnitude peak is not a harmonic shortlist = np.append(maxc, shortlist) f0cf = f0cf[shortlist] # frequencies of candidates if (f0cf.size == 0): # return 0 if no peak candidates return 0 f0, f0error = UF_C.twm( pfreq, pmag, f0cf) # call the TWM function with peak candidates, cython version # f0, f0error = TWM_p(pfreq, pmag, f0cf) # call the TWM function with peak candidates, python version if (f0 > 0) and (f0error < ef0max ): # accept and return f0 if below max error allowed return f0 else: return 0
def f0Twm(pfreq, pmag, ef0max, minf0, maxf0, f0t=0): """ Function that wraps the f0 detection function TWM, selecting the possible f0 candidates and calling the function TWM with them pfreq, pmag: peak frequencies and magnitudes, ef0max: maximum error allowed, minf0, maxf0: minimum and maximum f0 f0t: f0 of previous frame if stable returns f0: fundamental frequency in Hz """ if (minf0 < 0): # raise exception if minf0 is smaller than 0 raise ValueError("Minumum fundamental frequency (minf0) smaller than 0") if (maxf0 >= 10000): # raise exception if maxf0 is bigger than 10000Hz raise ValueError("Maximum fundamental frequency (maxf0) bigger than 10000Hz") if (pfreq.size < 3) & (f0t == 0): # return 0 if less than 3 peaks and not previous f0 return 0 f0c = np.argwhere((pfreq>minf0) & (pfreq<maxf0))[:,0] # use only peaks within given range if (f0c.size == 0): # return 0 if no peaks within range return 0 f0cf = pfreq[f0c] # frequencies of peak candidates f0cm = pmag[f0c] # magnitude of peak candidates if f0t>0: # if stable f0 in previous frame shortlist = np.argwhere(np.abs(f0cf-f0t)<f0t/2.0)[:,0] # use only peaks close to it maxc = np.argmax(f0cm) maxcfd = f0cf[maxc]%f0t if maxcfd > f0t/2: maxcfd = f0t - maxcfd if (maxc not in shortlist) and (maxcfd>(f0t/4)): # or the maximum magnitude peak is not a harmonic shortlist = np.append(maxc, shortlist) f0cf = f0cf[shortlist] # frequencies of candidates if (f0cf.size == 0): # return 0 if no peak candidates return 0 f0, f0error = UF_C.twm(pfreq, pmag, f0cf) # call the TWM function with peak candidates if (f0>0) and (f0error<ef0max): # accept and return f0 if below max error allowed return f0 else: return 0