def pitch_strength_one_candidate(f_erbs, nL, pc):
"""
Calculates the pitch ``strength'' for a single
candidate
Args:
f_erbs (array):
nL : normalized loudness
pc : pitch candidate
Returns:
s (float): value of strength for a pitch
"""
# fix rounds a number *towards* zero
n = int(np.fix(f_erbs[-1] / pc - 0.75)) # number of harmonics
if n == 0:
return np.nan
k = np.zeros(f_erbs.shape) # kernel
# normalize freq w.r.t. candidate
q = f_erbs / pc
# create kernel
primes = np.concatenate((np.ones(1), primes_2_to_n(n)))
for i in primes:
a = np.abs(q - i)
# peak's weight
p = a < 0.25
k[p] = np.cos(2 * np.pi * q[p])
# valley's weight
v = np.logical_and(0.25 < a, a < 0.75)
k[v] = k[v] + np.cos(2 * np.pi * q[v]) / 2
# apply envelope
k = k * np.sqrt(1 / f_erbs)
# K+-normalized kernel
k = k / np.linalg.norm(k[k>0])
# strength value of pitch
s = np.dot(k, nL)
return s
评论列表
文章目录