FFT音高检测 - 旋律提取

my *_*MDB 5 audio signal-processing fft pitch sound-synthesis

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

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

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

我根本不了解音乐所以我可以根据从基频得到的信息,根据输入(乐器,声音,乐器+声音)产生类似声音的声音吗?如果没有,我可以尝试使用我目前拥有的代码.

谢谢!

jjs*_*jjs 5

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

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

但是,如果您想从和弦素材中提取旋律,这两种方法都不会奏效。从和弦音乐中提取旋律仍然是一个研究问题,没有一套简单的步骤可以遵循。研究社区提供了一些工具供您试用(但仅限于非商业用途),即:

  • 旋律:http ://mtg.upf.edu/technologies/melodia

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


hot*_*aw2 3

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

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