我正在使用这个算法来检测这个音频文件的音高。正如你所听到的,它是在吉他上演奏的E2音符,背景中有一些噪音。
我使用STFT生成了这个频谱图:
而我是这样使用上面链接的算法的:
因此,我得到了在
更新
尽管如此,我仍然不确定这两个二维数组代表什么。假设我想找出第5帧中82Hz的强度。我可以使用STFT函数来完成这个任务,该函数只返回一个二维矩阵(用于绘制频谱图)。
但是,
1. 转到
我使用STFT生成了这个频谱图:
![spectrogram](https://istack.dev59.com/HHmGd.webp)
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函数来完成这个任务,该函数只返回一个二维矩阵(用于绘制频谱图)。
但是,
piptrack
还做了一些额外的工作,这可能很有用,但我真的不明白是什么。 pitches [f,t]包含bin f,time t的瞬时频率
。这是什么意思?如果我想在时间帧t中找到最大频率,我需要:1. 转到
magnitudes[] [t]
数组,找到具有最大幅度的bin。
2. 将bin分配给变量f
。
3. 找到pitches [b] [t]
以查找属于该bin的频率?
pitches
包含fmin
和fmax
之间每个 FFT bin 的频率。尝试检查magnitudes
中的非零元素,并查看它们对应的音高。 - Linuxios