问题标签 [pitch-tracking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2263 浏览

javascript - Javascript:如何确定 mp3 文件的音调

我做了很多谷歌搜索,但找不到一个关于如何确定 mp3 文件的音符的例子。

到目前为止,我已经阅读了一些关于 FFT(快速傅立叶变换)的内容,可以从中计算音频文件的音高,并根据音高符号导出音符。

但是后来我读到mp3 文件格式在时域中,由于有损压缩格式不包含频率分析所需的样本值……这是否意味着您必须将 mp3 转换为 wav文件以计算密钥?

我发现了几个用于视觉目的的实时音高检测示例,但不适用于分析整个 mp3 文件并输出音乐键。

我希望有人能指出我正确的方向。

谢谢。

0 投票
1 回答
422 浏览

c# - 如何修复谐波产品频谱中的倍频程误差?

我正在创建一个语音训练应用程序,并使用 FFT 将信号从时域转换为频域。在应用 FFT 之前,我已经使用 blackman-harris 窗口对信号进行了窗口化。然后我使用谐波产品频谱来提取基频。最低频率为 F2 (87.307 Hz),最高频率为 C6 (1046.502 Hz)。FFT 长度为 8192,采样频率为 44100 Hz。

为了修复八度音阶错误,我应用了这里提到的规则;

我使用锯齿波测试了系统,我注意到倍频程错误仍然可见。87.307 Hz 到 ~190 Hz 它会产生高倍频程误差。G5 (783.991) 向上有时它显示一个八度更低。

以下是一些结果: 输入 | 结果 | 错误

请帮我解决这个问题,因为这会严重影响系统对用户的最终反馈。

0 投票
1 回答
2312 浏览

android - android中的吉他音高检测

我尝试在安卓平台上开发吉他游戏。

而且我需要进行实时音高检测以获取吉他和弦/弦的频率。

我会从麦克风获取输入,然后分析输入(输入演奏哪种吉他弦/和弦)

我找到了两种我可以使用的方法,一种是 YIN,另一种是 FFT。

哪种方法可以获得更好的性能和准确的结果?

0 投票
1 回答
223 浏览

audio - Unity3D中音频信号谐波的幅度

我已经设法使用 GetSpectrumData 函数计算了来自麦克风的音频输入的音高。但是现在我需要获取音频前 7 个谐波的幅度(项目要求)我对音频 dsp 的了解非常少。我唯一理解的是谐波是基频的倍数。但是我将如何获得谐波的幅度。

谢谢

0 投票
2 回答
331 浏览

python - Pitch detection results wrong

I am using freq_from_crossings from here (I haven't changed the code). My input is an audio file with an acoustic guitar E2 note and nothing else (as my microphone is pretty bad, the sound is not very clear).

This is the waveform:

waveform And this is the spectrogram I am getting:

spectrogram

From the spectrogram it is pretty clear that the loudest harmonic corresponds to the E2 note. However, freq_from_crossings returns 415.461966359 which is not at all the pitch played. What components could have gone wrong?

Thanks

0 投票
2 回答
11934 浏览

python - Librosa 音高跟踪 - STFT

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

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

我正在使用上面链接的算法,如下所示:

结果,我几乎得到了我fmin和之间所有可能的频率fmax。我与该piptrack方法的输出有什么关系来发现时间框架的基频?

更新

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

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

  1. 转到magnitudes[][t]数组,找到最大量级的 bin。
  2. 将 bin 分配给一个变量f
  3. Findpitches[b][t]找到属于该 bin 的频率?
0 投票
1 回答
1937 浏览

python - 切片音频信号以检测音高

我正在使用Librosa转录单声道吉他音频信号。

我认为,根据开始时间“分割”信号,以在正确的时间检测音符变化,这将是一个好的开始。

Librosa 提供了一个功能,可以在开始时间之前检测局部最小值。我检查了这些时间,它们是正确的。

这是原始信号的波形和最小值的时间。

波形

演奏的旋律是 E4, F4, F#4 ..., B4。

因此,理想的结果应该是:330Hz、350Hz、...、493Hz(大约)。

如您所见,minima数组中的时间表示音符播放前的时间。

然而,在一个切片信号上(10-12 秒,每个切片只有一个音符),我的频率检测方法的结果非常糟糕。我很困惑,因为我在我的代码中看不到任何错误:

其中freq_from函数直接取自这里

我认为这只是方法的精度差,但我得到了一些疯狂的结果。具体来说,freq_from_hps返回:

这些值应该是 8 个相应切片的 8 个音高(以赫兹为单位!)。

freq_from_fft返回相似的值,同时freq_from_autocorr返回一些更“正常”的值,但也返回一些接近 10000Hz 的随机值:

这是整个信号的频谱图:

全谱图

例如,这是切片 1 的频谱图(E4 音符): 频谱图4

如您所见,切片已正确完成。但是有几个问题。首先,频谱图中存在八度音阶问题。我期待一些问题。然而,我从上面提到的 3 种方法得到的结果非常奇怪。

这是我的信号处理理解或我的代码的问题吗?

0 投票
1 回答
2055 浏览

python - 单吉他音符 Python 的谐波积谱

我正在尝试检测用吉他演奏的 B3 音符的音高。音频可以在这里找到。

这是频谱图: 频谱图

如您所见,基本音高约为 250Hz,对应于 B3 音符。

它还包含大量谐波,这就是我选择从这里使用 HPS 的原因。我正在使用此代码来检测音高:

我的采样率为 40000。但是,我得到的结果不是接近 250Hz(B3 注意),而是 0.66Hz。这怎么可能?

我还尝试了来自同一个 repo 的自相关方法,但我也得到了不好的结果,比如 10000Hz。

感谢一个答案,我知道我必须应用一个滤波器来去除信号中的低频。我怎么做?是否有多种方法可以做到这一点,推荐哪一种?

状态更新:

答案提出的高通滤波器正在工作。如果我在我的音频信号的答案中应用该函数,它会正确显示大约 245Hz。但是,我想过滤整个信号,而不仅仅是它的一部分。一个音符可能位于信号的中间,或者一个信号包含多个音符(我知道一个解决方案是开始检测,但我很想知道为什么这不起作用)。这就是我编辑代码以返回的原因filtered_audio

问题是,如果我这样做,即使噪音已被正确消除(见截图)。结果我得到 0.05。

频谱图

0 投票
2 回答
1428 浏览

python - 一个音符的录制音频会产生多个起始时间

我正在使用Librosa库进行音高和起始检测。具体来说,我正在使用onset_detectand piptrack

这是我的代码:

在录音棚中录制的吉他音频样本上运行此程序时,因此样本没有噪音(像这样),我在这两个功能中都得到了非常好的结果。开始时间是正确的,频率几乎总是正确的(有时会出现一些八度音阶错误)。

然而,当我尝试用我便宜的麦克风录制自己的吉他声音时,出现了一个大问题。我得到带有噪音的音频文件,例如this。该onset_detect算法感到困惑,并认为噪声包含起始时间。因此,我得到了非常糟糕的结果。即使我的音频文件由一个音符组成,我也会有很多次发作。

这是两个波形。第一个是在录音室录制的 B3 音符的吉他样本,而第二个是我录制的 E2 音符。

工作室 记录

第一个的结果是正确的 B3(检测到一个起始时间)。第二个的结果是一个包含7 个元素的数组,这意味着检测到 7 个起始时间,而不是 1 个!其中一个元素是正确的开始时间,其他元素只是噪声部分的随机峰值。

另一个例子是这个包含音符 B3、C4、D4、E4 的音频文件:

b3-e4

如您所见,噪声很清晰,我的高通滤波器没有帮助(这是应用滤波器后的波形)。

我认为这是一个噪音问题,因为这些文件之间的区别就在那里。如果是,我能做些什么来减少它?我尝试过使用高通滤波器,但没有任何变化。

0 投票
2 回答
1657 浏览

python - Python 中的自相关代码会产生错误(吉他音高检测)

此链接提供了基于自相关的音高检测算法的代码。我用它来检测简单吉他旋律中的音高。

一般来说,它会产生非常好的结果。例如,对于旋律 C4、C#4、D4、D#4、E4,它会输出:

这与正确的音符相关。

但是,在某些情况下,例如音频文件(E4、F4、F#4、G4、G#4、A4、A#4、B4),它会产生错误:

更具体地说,这里有三个错误:错误检测到13381Hz而不是 F4(~350Hz)(奇怪的错误),以及 218Hz 而不是 A4(440Hz)和 244Hz 而不是 B4(~493Hz),它们是八度音阶错误。

我认为这两个错误是由不同的东西引起的?这是代码:

您可以在上面的第一个链接中看到该freq_from_autocorr功能。

我唯一改变的是这一行:

我已替换为:

更新

我注意到offset我使用的最小的(我用来检测每个音高的最小信号段),我得到的高频(10000+ Hz)错误越多。

具体来说,我注意到在这些情况下(10000+ Hz)不同的部分是i_peak值的计算。在没有错误的情况下,它在 50-150 的范围内,在错误的情况下,它是 3-5。