在印度的IIT-Bombay举办了这个技术节,在那里他们举办了一个名为“Artbots”的活动,我们应该设计具有艺术能力的艺术机器人。我有一个关于音乐机器人的想法,它以歌曲作为输入,检测歌曲中的音符并在钢琴上播放。我需要一些方法来帮助我计算歌曲音符的音高。关于如何去做的任何想法/建议?
答案 0 :(得分:13)
这正是我在这里做的去年项目:)除了我的项目是关于追踪人类歌唱音调的一件事(我没有机器人来演奏曲调)
我能想到的最快捷方式是利用BASS library。它包含即用型功能,可以为您提供默认录制设备的FFT数据。看看BASS附带的“livespec”代码示例。
顺便说一下,原始FFT数据不足以确定基频。您需要 Harmonic Product Spectrum 等算法才能获得F0。
另一个考虑因素是音频源。如果您要进行FFT并在其上应用谐波产品频谱。您需要确保输入只有一个音频源。如果它包含多个来源,例如在现代歌曲中,则需要考虑许多频率。
谐波产品谱理论
如果输入信号是音符, 然后它的频谱应该由a组成 系列峰,对应 谐波的基频 组件的整数倍 基频。因此当我们 压缩光谱的数量 次(下采样),并进行比较 与原始光谱,我们可以看到 最强的谐波峰值线 起来。原始的第一个高峰 频谱与第二个相吻合 由a压缩的谱中的峰值 因子2,恰逢其时 光谱中的第三个峰值 压缩了三倍。 因此,当各种光谱是 相乘,结果会 从根本上形成明确的高峰 频率。
方式强>
首先,我们将输入信号分成 通过应用汉宁窗口, 窗口大小和跳跃大小的位置 作为输入。对于每个窗口, 我们利用短时傅立叶 转换以转换输入信号 从时域到频率 域。一旦输入在 频域,我们申请 谐波产品谱技术 每个窗口。
HPS涉及两个步骤: 下采样和乘法。至 下采样,我们压缩了光谱 通过重新采样在每个窗口中两次: 我们第一次压缩了 原始频谱由两个和 第二次,三次。一旦这样 完成后,我们将三者相乘 光谱一起找到 频率对应峰值 (最大值)。这个特别 频率代表根本 特定窗口的频率。
HPS方法的局限性
此方法的一些不错的功能 包括:它是计算上的 价格便宜,合理抵抗 加性和乘性噪声,和 可调节到不同的类型 投入。例如,我们可以改变 压缩光谱的数量 使用,我们可以取代光谱 乘以光谱 加成。但是,因为人类的音调 感知基本上是对数, 这意味着可能会出现低音调 跟踪的准确性低于高 音高。
HPS的另一个严重缺陷 方法是它的分辨率 仅与FFT的长度一样好 用来计算光谱。要是我们 我们是,执行短而快的FFT 离散数量有限 我们可以考虑的频率。为了 获得更高的分辨率 输出(因此看得少 我们的音调输出中的颗粒度),我们 需要采用更长的FFT 需要更多时间。
答案 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,分析,旋律等”将返回有关可能出现的问题的更多信息。
问候