为什么 PitchDetection 更适合吹口哨?

Why does PitchDetection work better with whistling?

我正在使用 TarsosDSP 附带的 UtterAsterisk 示例程序。该程序的目标是显示指示用户应该做的注释的水平条。垂直条从左向右移动,向用户指示何时执行哪些音符的正确时间。用户获得积分取决于用户是否在正确的时间内做出正确的笔记。

Link 到应用截图:https://0110.be/files/photos/392/UtterAsterisk.png

这个程序有 3 个部分:

  1. select 音频输入
  2. select 检测算法
  3. 预期音符与实际音符的视觉表示:每 X 毫秒生成一个黑色小方块,代表用户所做的音符。在本节的标题中(在最新版本的程序中),它表示 "whistling works best".

我想知道为什么这段代码最适合吹口哨?

作为背景信息,我正在尝试为类似程序制作一个快速原型,但用户会发出 non-whistling、non-vocal(无语音)声音(如动物声音)和需要匹配正确性。

我试过用口哨吹出程序上指示的音符,效果非常好(除了我吹口哨很糟糕!)。

我尝试了 select 不同的检测算法,但是当我 non-whistling 发出声音时,声音发出的音符并不总是在第 3 部分注册。

我有一种感觉,吹口哨会产生一个音符,而发出嘎嘎声(像鸭子一样)实际上是一个泛音(希望我没听错:几个音符混合在一起发出声音)。

第 151、152 行:https://github.com/JorenSix/TarsosDSP/blob/master/src/examples/be/tarsos/dsp/example/UtterAsterisk.java

// add a processor, handle percussion event.
dispatcher.addAudioProcessor(new PitchProcessor(algo, sampleRate, bufferSize, this));

我认为 PitchProcessor 只会处理一个峰值,因为它 returns 一个 pitchDetectionResult,它只包含一个频率(第 59 行): https://github.com/JorenSix/TarsosDSP/blob/master/src/core/be/tarsos/dsp/pitch/PitchDetectionResult.java

不幸的是,我主要是从数字信号处理领域开始,可以使用一些帮助来了解在这个特定应用程序中如何更好地吹口哨。如果我的直觉是正确的(吹口哨 = 单音符),那么一个人如何能够做与该程序相同的基本操作(将用户发出的动物声音与录音进行匹配)?

感谢您的意见!

看来答案就在这里。

where the user would produce non-whistling, non-vocal (no speech) sounds (like animal sounds) and would need to be matched for correctness.

看来那些"sounds"可能是多重音调的结果, 吹口哨(人类吹口哨)可能产生单一音调的地方。

为了比较, 测试在钢琴上弹奏的单个音符(或键)与在钢琴上弹奏的和弦(多个音符)的声音之间的差异。

另一种选择是使用电话发出拨号音(例如按 7)而不是吹口哨。 电话会发出 DTMF(双音等等)声音。