gpt4 book ai didi

python - Librosa 音调跟踪 - STFT

转载 作者:太空狗 更新时间:2023-10-29 17:32:17 31 4
gpt4 key购买 nike

我正在使用 this检测音高的算法 this音频文件。正如您所听到的,这是在吉他上弹奏的 E2 音符,背景中有一点噪音。

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

我正在像这样使用上面链接的算法:

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 方法的输出如何发现时间范围的基频?

更新

不过,我仍然不确定那些二维数组代表什么。假设我想知道第 5 帧中的 82Hz 有多强。我可以使用 STFT 函数来做到这一点,它只返回一个二维矩阵(用于绘制频谱图)。

但是,piptrack 做了一些额外的事情,这可能很有用,但我不太明白是什么。 pitches[f, t] 包含 bin f、时间 t 的瞬时频率。这是否意味着,如果我想找到时间帧 t 的最大频率,我必须:

  1. 转到 magnitudes[][t] 数组,找到最大值的 bin震级。
  2. 将 bin 分配给变量 f
  3. 查找 pitches[b][t] 以查找属于该 bin 的频率?

最佳答案

音高检测是一个棘手的话题,通常有悖常理。我对这个特定功能的源代码记录方式并不满意——开发人员似乎混淆了“谐波”和“音调”。

当在吉他或钢琴上发出单个音符(“音高”)时,我们听到的不仅仅是一种声音振动频率,而是多种声音振动在不同频率下的合成数学上相关的频率,称为谐波。典型的音调跟踪技术包括在 FFT 结果中搜索与预期的谐波频率相对应的特定区间中的幅度。例如,如果我们按下钢琴上的中央 C 键,复合谐波的各个频率将从 261.6 Hz 开始作为基频,523 Hz 将是二次谐波,785 Hz 将是三次谐波,1046 Hz 将是四次谐波等。后来的谐波是基频 261.6 Hz 的整数倍(例如:2 x 261.6 = 523、3 x 261.6 = 785、4 x 261.6 = 1046)。但是,谐波所在的频率是对数间隔的,而FFT使用的是线性间隔。通常,FFT 的垂直间距在较低频率下分辨率不够高。

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

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

https://github.com/CreativeDetectors/PitchScope_Player

enter image description here

关于python - Librosa 音调跟踪 - STFT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43877971/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com