首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Librosa螺距跟踪

Librosa螺距跟踪
EN

Stack Overflow用户
提问于 2017-05-09 19:05:14
回答 3查看 13.7K关注 0票数 17

我使用算法来检测音频文件的音调。正如你所听到的,这是一个E2音符在吉他上演奏,背景中有一点噪音。

我使用STFT生成了这个光谱图:

我使用的算法如下所示:

代码语言:javascript
复制
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)]

因此,我在fminfmax之间得到了几乎所有可能的频率。我与piptrack方法的输出有什么关系,以发现时间框架的基频?

更新

不过,我仍然不确定那些2D数组代表什么。假设我想知道在框架5中82赫兹有多强,我可以使用STFT函数来实现,它只是返回一个2D矩阵(用来绘制光谱图)。

但是,piptrack还做了一些可能有用的事情,我真的不明白是什么。pitches[f, t] contains instantaneous frequency at bin f, time t。这是否意味着,如果我想在时间框架内找到最大频率,我必须:

  1. 转到magnitudes[][t]数组,找到具有最大震级的bin。
  2. 将bin分配给变量f
  3. 找到pitches[b][t]来找到属于那个垃圾桶的频率?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-16 19:14:45

原来,在特定的框架下选择音高的方法很简单,t

代码语言:javascript
复制
def detect_pitch(y, sr, t):
  index = magnitudes[:, t].argmax()
  pitch = pitches[index, t]

  return pitch

首先通过查看magnitudes数组获得最强频率的帧,然后在pitches[index, t]上找到音高。

票数 10
EN

Stack Overflow用户

发布于 2017-05-11 19:55:48

基音检测是一个棘手的话题,而且往往有违直觉。我不喜欢这个特定函数的源代码记录方式--几乎看起来开发人员混淆了“调和”和“音调”。

当一个音符(音高)在吉他或钢琴上发出时,我们听到的不仅仅是一个声音振动的频率,而是发生在不同数学相关频率上的多个声音振动的组合,称为谐波。典型的基音跟踪技术包括在对应于期望的谐波频率的某些桶中搜索FFT的结果。例如,按下钢琴上的中C键,复合谐波的单个频率将以261.6 Hz作为基频,523 Hz为二次谐波,785 Hz为三次谐波,1046 Hz为四次谐波等。之后的谐波为基频的整数倍,261.6 Hz ( ex: 2x 261.6 = 523,3x 261.6 = 785,4x 261.6 = 1046 )。然而,谐波所在的频率是对数间隔的,但FFT使用的是线性间隔。通常,FFT的垂直间距在较低的频率下不能得到足够的解析。

因此,当我编写一个音高检测应用程序(PitchScope Player)时,我选择创建一个对数间距的DFT,而不是FFT,这样我就可以专注于音乐感兴趣的精确频率(参见我的自定义DFT随附的3秒吉他独奏图)。如果你是认真的追求基音检测,你应该考虑做更多的阅读这个主题,查看其他示例代码(我的代码链接在下面),并考虑编写自己的函数来测量频率。

检测

播放器

票数 13
EN

Stack Overflow用户

发布于 2022-06-11 18:29:39

要找到整个音频片段的音高:

代码语言:javascript
复制
def detect_pitch(y, sr):
    pitches, magnitudes = librosa.core.piptrack(y=y, sr=sr, fmin=75, fmax=1600)
    # get indexes of the maximum value in each time slice
    max_indexes = np.argmax(magnitudes, axis=0)
    # get the pitches of the max indexes per time slice
    pitches = pitches[max_indexes, range(magnitudes.shape[1])]
    return pitches
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43877971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档