FFT音高检测 - 旋律提取

时间:2011-11-27 19:55:54

标签: signal-processing fft pitch sound-synthesis audio

我正在创建一个音调检测程序,它从帧的FFT中获得的功率谱中提取基频。这就是我到目前为止所做的:

  • 将输入音频信号分成帧。
  • 将框架与汉明窗口相乘
  • 计算帧sqrt(real ^ 2 + img ^ 2)
  • 的FFT和幅度
  • 通过谐波产品谱找到基频(峰值)
  • 将峰值频率(频率频率)转换为音符(例如,~440 Hz为A4)

现在程序为每个帧生成一个值为0到87的整数。根据公式I here,每个整数对应于钢琴音符。我现在试图通过基于计算的音符合成声音来模仿输入信号中的旋律。我试着简单地生成一个幅度和频率对应于基频的正弦波,但结果听起来没有原始声音(几乎听起来像随机的哔哔声)。

根据我从基本频率获得的信息,根据我所拥有的音乐,我真的不懂音乐,能否根据输入(乐器,声音,乐器+声音)产生类似声音的声音?如果没有,我可以尝试使用我目前拥有的代码。

谢谢!

4 个答案:

答案 0 :(得分:4)

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

对于单声道音调提取,您可以尝试在时域和频域中实现各种算法。几个例子包括Yin(时域)和HPS(频域),维基百科提供了关于两者的进一步细节的链接:

但是,如果你想从复音材料中提取旋律,它们都不会很好用。从复调音乐中提取旋律仍然是一个研究问题,并且没有一套简单的步骤可以遵循。研究界提供了一些可以试用的工具(仅限非商业用途),即:

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

答案 1 :(得分:3)

您的方法可能适用于合成音乐,使用同步的音符以适合您的fft帧时间和长度,并且仅使用其完整频谱与您的HPS音高估计器兼容的音符声音。普通音乐都不是这样。

对于更一般的情况,自动音乐转录似乎仍然是一个研究问题,没有简单的5步解决方案。音高是人类的心理声学现象。人们会听到当地频谱中可能存在或可能不存在的注释。 HPS音调估计算法比使用FFT峰值更可靠,但对于多种音乐声音仍然可能失败。此外,跨越音符边界或瞬变的任何帧的FFT可能不包含明确的单个音高进行估计。

答案 2 :(得分:3)

您可能不希望从FFT中选取峰值来计算音高。您可能想要使用自相关。我在这里写了一个非常相似的问题的长答案:Cepstral Analysis for pitch detection

答案 3 :(得分:1)

由于以下原因,您的方法不适用于任何一般音乐示例:

  1. 音乐本质上是动态的。意味着音乐中存在的每一个声音都是由不同的静音,攻击,延音,衰减和沉默时期调制的,也称为声音的包络。

  2. 单音不能正确合成乐器音符和人声乐曲。这些音符必须由基调和许多谐波合成。

  3. 然而,合成乐器音符或人声音符的基音和谐波是不够的,还必须合成音符的包络,如上面的1所述。

    < / LI>
  4. 此外,要合成音乐中的旋律乐段,无论是乐器还是声乐,必须合成上面的1-3项,对于乐段中的每个音符,还必须合成每个音符相对于音符的时间。通道的开头。

  5. 从最终混音录音中分析提取单个乐器或人声是一个非常棘手的问题,您的方法无法解决这个问题,因此您的方法无法正确解决问题1-4。

    < / LI>

    简而言之,任何试图通过使用严格的分析方法从音乐录音的最终混音中提取近乎完美的音乐抄本的方法,最糟糕的情况几乎肯定是注定要失败,并且至多属于先进的领域研究

    如何摆脱这种僵局取决于工作的目的是什么,OP没有提及。

    这项工作是用于商业产品,还是业余爱好项目?

    如果是商业工作,需要采取各种进一步的方法(成本高昂或成本高昂),但这些方法的细节取决于工作的目标。

    作为结束语,由于以下原因,您的合成听起来像是随机的哔哔声:

    1. 您的基本音调检测器与滚动FFT帧的时序相关联,这实际上会在每个滚动FFT帧的开始时间产生可能是假的基音。

    2. 为什么检测到的基音可能是假的?因为你将音乐样本任意剪裁成(FFT)帧,因此可能会在音符中间某处截断许多同时发声的音符,从而扭曲音符的光谱特征。

    3. 您不是要尝试合成检测到的音符的包络,也不能,因为根据您的分析无法获取信封信息。

    4. 因此,合成结果可能是一系列纯正弦啁啾,通过滚动FFT帧的delta-t在时间上隔开。每个啁啾可能具有不同的频率,具有不同的包络大小,并且可能具有矩形形状的包络。

    5. 要了解音符的复杂性,请查看以下参考资料:

      Musical instrument spectra to 102.4 KHz

      Musical instrument note spectra and their time-domain envelopes

      特别注意构成每个音符的许多纯音,以及每个音符的时域包络的复杂形状。多个音符相对于彼此的可变时序是音乐的另一个重要方面,就像典型音乐中的复音(同时发出多个声音)一样。

      所有这些音乐元素都是对自动音乐转录采用严格的分析方法,极具挑战性。