检测基频

时间:2009-01-12 14:19:22

标签: signal-processing detect frequency pitch-tracking

在印度的IIT-Bombay举办了这个技术节,在那里他们举办了一个名为“Artbots”的活动,我们应该设计具有艺术能力的艺术机器人。我有一个关于音乐机器人的想法,它以歌曲作为输入,检测歌曲中的音符并在钢琴上播放。我需要一些方法来帮助我计算歌曲音符的音高。关于如何去做的任何想法/建议?

9 个答案:

答案 0 :(得分:13)

这正是我在这里做的去年项目:)除了我的项目是关于追踪人类歌唱音调的一件事(我没有机器人来演奏曲调)

我能想到的最快捷方式是利用BASS library。它包含即用型功能,可以为您提供默认录制设备的FFT数据。看看BASS附带的“livespec”代码示例。

顺便说一下,原始FFT数据不足以确定基频。您需要 Harmonic Product Spectrum 等算法才能获得F0。

另一个考虑因素是音频源。如果您要进行FFT并在其上应用谐波产品频谱。您需要确保输入只有一个音频源。如果它包含多个来源,例如在现代歌曲中,则需要考虑许多频率。

  

谐波产品谱理论

     

如果输入信号是音符,   然后它的频谱应该由a组成   系列峰,对应   谐波的基频   组件的整数倍   基频。因此当我们   压缩光谱的数量   次(下采样),并进行比较   与原始光谱,我们可以看到   最强的谐波峰值线   起来。原始的第一个高峰   频谱与第二个相吻合   由a压缩的谱中的峰值   因子2,恰逢其时   光谱中的第三个峰值   压缩了三倍。   因此,当各种光谱是   相乘,结果会   从根本上形成明确的高峰   频率。

     

方式

     

首先,我们将输入信号分成   通过应用汉宁窗口,   窗口大小和跳跃大小的位置   作为输入。对于每个窗口,   我们利用短时傅立叶   转换以转换输入信号   从时域到频率   域。一旦输入在   频域,我们申请   谐波产品谱技术   每个窗口。

     

HPS涉及两个步骤:   下采样和乘法。至   下采样,我们压缩了光谱   通过重新采样在每个窗口中两次:   我们第一次压缩了   原始频谱由两个和   第二次,三次。一旦这样   完成后,我们将三者相乘   光谱一起找到   频率对应峰值   (最大值)。这个特别   频率代表根本   特定窗口的频率。

     

HPS方法的局限性

     

此方法的一些不错的功能   包括:它是计算上的   价格便宜,合理抵抗   加性和乘性噪声,和   可调节到不同的类型   投入。例如,我们可以改变   压缩光谱的数量   使用,我们可以取代光谱   乘以光谱   加成。但是,因为人类的音调   感知基本上是对数,   这意味着可能会出现低音调   跟踪的准确性低于高   音高。

     

HPS的另一个严重缺陷   方法是它的分辨率   仅与FFT的长度一样好   用来计算光谱。要是我们   我们是,执行短而快的FFT   离散数量有限   我们可以考虑的频率。为了   获得更高的分辨率   输出(因此看得少   我们的音调输出中的颗粒度),我们   需要采用更长的FFT   需要更多时间。

来自:http://cnx.org/content/m11714/latest/

答案 1 :(得分:4)

只是评论:基本谐波也可能从(谐波)声音中丢失,这不会改变感知音高。作为极限情况,如果你采用方波(例如,C#音符)并完全抑制一次谐波,感知音符仍然是C#,在同一个八度音阶。在某种程度上,当它猜到一个音符时,我们的大脑能够补偿一些谐波的缺失,甚至是第一个谐波。 因此,要使用频域技术检测音高,您应该考虑所有谐波(傅里叶变换幅度中的局部最大值),并提取它们的某种“最大公约数”。频率。音高检测根本不是一个小问题......

DAFX有大约30页专门用于音高检测,有示例和Matlab代码。

答案 2 :(得分:2)

自相关 - http://en.wikipedia.org/wiki/Autocorrelation

过零 - http://en.wikipedia.org/wiki/Zero_crossing(这种方法用于廉价的吉他调音器)

答案 3 :(得分:2)

尝试YAAPT pitch tracking,检测时域和频域的基频。您可以从链接下载Matlab源代码,并使用光谱处理部分查找FFT输出中的峰值。

Python包http://bjbschmitt.github.io/AMFM_decompy/pYAAPT.html#

答案 4 :(得分:1)

你试过Wikipedia's article on pitch detection吗?它包含一些您可能感兴趣的参考文献。

此外,这是一个list of DSP applications and libraries,你可以在那里逛逛。该列表仅提及Linux软件包,但其中许多是跨平台的,您可以查看很多源代码。

仅供参考,检测单声道录音中音符的音高是大多数精通DSP的人所能及的。检测所有音符(包括和弦和音符)的音高要困难得多。

答案 5 :(得分:1)

只是一个想法 - 但你需要处理数字音频流作为输入吗?

如果没有,请考虑使用音乐的符号表示(例如MIDI)。然后将明确说明音符的音高,您可以非常容易地合成与音高,节奏和许多其他音乐参数相对应的声音(和动作)。

如果您需要分析数字音频流(mp3,wav,实时输入等),请记住,虽然简单单音声音的音高检测非常先进,但是复音音高检测是一个未解决的问题。在这种情况下,您可能会发现我对this question的答案很有帮助。

答案 6 :(得分:1)

要从复音音乐中提取旋律的基频,您可以尝试使用MELODIA插件:http://mtg.upf.edu/technologies/melodia

提取歌曲中所有乐器的F0(多F0跟踪)或将其转录为音符是一项更加艰巨的任务。旋律提取和音乐转录仍然是开放的研究问题,所以无论你使用哪种算法/工具都不希望获得完美的结果。

答案 7 :(得分:0)

你基本上需要一个频谱分析仪。您可以在录制模拟输入时进行FFT,但很大程度上取决于录制的分辨率。

答案 8 :(得分:0)

我立即想到了什么:

  • 过滤掉非常低的频率(鼓,低音线),
  • 滤除高频(谐波)
  • FFT,
  • 在旋律的FFT输出中查找峰值

我不确定,如果这适用于非常复调的声音 - 可能是谷歌搜索“FFT,分析,旋律等”将返回有关可能出现的问题的更多信息。

问候