signal-processing - FFT 音高检测 - 旋律提取

标签 signal-processing fft pitch sound-synthesis audio

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

2年前关闭。




Improve this question




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

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

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

    我不太了解音乐,所以根据我所拥有的,我可以根据我从基频获得的信息生成与输入(乐器、语音、乐器 + 语音)相似的旋律的声音吗?如果没有,我可以尝试使用我目前拥有的代码还有哪些其他想法。

    谢谢!

    最佳答案

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

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

  • http://en.wikipedia.org/wiki/Pitch_detection_algorithm

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

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

    关于signal-processing - FFT 音高检测 - 旋律提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8288547/

    相关文章:

    audio - 开放音高变化

    Python 音频帧音高变化

    Python:在播放过程中改变声音的速度

    javascript - WebAudio 的 DynamicsCompressorNode 中的 dB 代表什么

    c - 就地乘法子例程 - 传递指针或值?

    c++ - 改变 float 样本的体积

    math - 为空间域中的给定掩码在频域中找到等效的高斯滤波器掩码

    python - 如何缩放基于 FFT 的互相关,使其峰值等于 Pearson's rho

    c - DSP 的快速二维卷积

    signal-processing - 在计算快速傅里叶变换时..?