首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFT基音检测-旋律提取

FFT基音检测-旋律提取
EN

Stack Overflow用户
提问于 2011-11-27 19:55:53
回答 4查看 13K关注 0票数 5

我正在创建一个基音检测程序,从帧的FFT中提取基频。到目前为止,这就是我所拥有的:

  • 将输入的音频信号分割成帧。
  • 加汉明窗的多帧
  • 计算帧sqrt(实^2+ img^2)的FFT和幅值
  • 利用谐波乘积谱求基频(峰)
  • 将峰值(bin频率)的频率转换为注意事项(例如,~440 Hz为A4)。

现在,程序为每个帧生成一个值为0到87的整数。根据我发现的这里公式,每个整数对应于一个钢琴音符。我现在试图模仿输入信号中的旋律,根据计算出的音符合成声音。我试图简单地产生一个与基频相对应的正弦波,但是结果听起来一点也不像原来的声音(几乎听起来像随机的嘟嘟声)。

我不太懂音乐,所以根据我所拥有的,我能根据我从基频得到的信息,用类似于输入(乐器、声音、乐器+声音)的旋律产生声音吗?如果没有,我还能尝试使用我目前拥有的代码吗?

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2013-01-24 13:58:56

这在很大程度上取决于你想要使用的音乐内容--提取单声道录音(即单个乐器或声音)的音高与从复调混合音乐中提取单个乐器的音高不同(例如,从复调录音中提取旋律的音调)。

对于单声道基音提取,可以尝试在时域和频域实现多种算法。几个例子包括尹(时域)和HPS (频域),链接到这两个方面的更多详细信息,请参见维基百科:

  • 算法

然而,如果你想从复调材料中提取旋律,这两种方法都不会有很好的效果。从复调音乐中提取旋律仍然是一个研究问题,没有一套简单的步骤可以遵循。研究团体提供了一些工具,您可以试用(但只供非商业用途),即:

  • 梅洛迪亚:http://mtg.upf.edu/technologies/melodia

最后,在合成输出时,我建议合成你提取的连续基音曲线(最简单的方法是估计每X毫秒的基音(例如10),并合成每10毫秒一次改变频率的正弦波,确保连续相位)。这将使您的结果听起来更自然,并且您避免了将一个连续的音调曲线量化为离散音符所涉及的额外错误(这本身就是另一个问题)。

票数 5
EN

Stack Overflow用户

发布于 2011-11-28 05:44:53

您的方法可能适用于合成音乐,使用同步的音符来适应fft帧的定时和长度,并且只使用与HPS音高估计器兼容的完整频谱的音符。对于普通的音乐来说,这一切都不是真的。

对于更普遍的情况,自动音乐转录似乎仍然是一个研究问题,没有简单的5步解决方案。基音是人类的一种心理声学现象。人们会听到局部频谱中可能存在也可能不存在的音符。HPS基音估计算法比FFT峰估计算法可靠得多,但对于多种音乐声音仍有可能失败。另外,任何交叉音符边界或瞬变的帧的FFT可能没有明确的单个音高来估计。

票数 3
EN

Stack Overflow用户

发布于 2012-04-01 06:05:05

你可能不想从FFT中挑选峰值来计算音高。您可能想使用自相关。我在这里为一个类似的问题写了一个很长的答案:基音检测的倒谱分析

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8288547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档