我正在使用这个算法来检测 这个音频文件的音高。正如你所听到的,这是用吉他演奏的 E2 音符,背景中有一点噪音。
我正在使用上面链接的算法,如下所示:
y, sr = librosa.load(filename, sr=40000)
pitches, magnitudes = librosa.core.piptrack(y=y, sr=sr, fmin=75, fmax=1600)
np.set_printoptions(threshold=np.nan)
print pitches[np.nonzero(pitches)]
结果,我几乎得到了我fmin
和之间所有可能的频率fmax
。我与该piptrack
方法的输出有什么关系来发现时间框架的基频?
更新
不过,我仍然不确定那些二维数组代表什么。假设我想知道第 5 帧中 82Hz 的强度有多大。我可以使用 STFT 函数来做到这一点,该函数只返回一个 2D 矩阵(用于绘制频谱图)。
但是,piptrack
做了一些其他可能有用的事情,我真的不明白是什么。pitches[f, t] contains instantaneous frequency at bin f, time t
. 这是否意味着,如果我想在时间帧 t 找到最大频率,我必须:
- 转到
magnitudes[][t]
数组,找到最大量级的 bin。 - 将 bin 分配给一个变量
f
。 - Find
pitches[b][t]
找到属于该 bin 的频率?