【问题标题】:Multiple pitch detection: FFT or other?多音高检测:FFT 还是其他?
【发布时间】:2012-03-25 16:57:05
【问题描述】:

我研究了快速傅立叶变换,但无法找到一种方法让他们从一个信号中解码多个频率。有没有办法分解 fft 计算的结果,以便我们可以看到和弦中的各个音高,或者根据 fft 的结果计算最可能的和弦?

如果没有,是否还有另一种音高检测方法可以在现场环境中检测多个音高?

编辑:我尝试一次不超过六个音高,因为我正在编写的软件处理吉他;如果程序用户有一把七弦吉他,那么它需要能够最多拾取七个音高。

在这种情况下,FFT(或其他方法)是否能够从单个麦克风信号处理这个问题,还是我必须制作一个单独读取每个字符串的吉他拾音器?

【问题讨论】:

  • 原始信号中有多少个音调或正弦波?如果只是几个(例如 DTMF 信号中的 2 个核心音),FFT 可能会起作用。只需搜索峰值。否则,对于音乐来说,这通常被认为是计算机科学和信号处理中的一个难题。您可以在 Internet 上搜索“自动音乐转录”,您可能会找到一些尝试这样做的软件程序或代码。
  • 有一款名为 Melodyne 的著名软件可以处理复杂的声音。

标签: c++ signal-processing fft pitch


【解决方案1】:

您需要首先了解 'pitch' 的真正含义(阅读下面的 Wikipedia 链接)。当在吉他或钢琴上发出一个音符时,我们听到的不仅仅是一个声音振动频率,而是在不同数学相关频率上发生的多个声音振动的复合。这种不同频率的振动复合的元素被称为谐波或分音。例如,如果我们按下钢琴上的中间 C 键,复合谐波的各个频率将从 261.6 Hz 作为基频开始,523 Hz 将是 2 次谐波,785 Hz 将是 3 次谐波,1046 Hz 将是 4 次谐波等。后面的谐波是基频 261.6 Hz 的整数倍(例如:2 x 261.6 = 523、3 x 261.6 = 785、4 x 261.6 = 1046)。

下面是 GitHub.com 上的 C++ 源代码,它是我设计的一种不寻常的两阶段算法,它可以在 Windows 上播放时对复音 MP3 文件进行实时音高检测。这个免费的应用程序(PitchScope Player,可在网络上获得)经常用于检测 MP3 录音中吉他或萨克斯管独奏的音符。您可以下载适用于 Windows 的可执行文件,以查看我的算法在您选择的 mp3 文件上的运行情况。该算法旨在检测 MP3 或 WAV 音乐文件中任何给定时刻的最主要音高(音符)。在 MP3 录制期间的任何给定时刻,最主要的音高(一个音符)的变化可以准确地推断出音符的开始。

我使用修改后的 DFT 对数变换(类似于 FFT)首先通过寻找具有峰值电平的频率来检测这些可能的谐波(见下图)。由于我为修改后的 Log DFT 收集数据的方式,我不必对信号应用窗口函数,也不必添加和重叠。我创建了 DFT,因此它的频率通道以对数方式定位,以便直接与吉他、萨克斯等音符产生的谐波频率对齐。

我的音高检测算法实际上是一个两阶段的过程:a)首先检测到 ScalePitch('ScalePitch' 有 12 个可能的音高值:{E, F, F#, G, G#, A, A#, B, C, C#, D, D#} ) b) 并在确定 ScalePitch 之后,通过检查 4 个可能的 Octave-Candidate 音符的所有谐波来计算 Octave。该算法旨在检测和弦 MP3 文件中任何给定时刻的最主要音高(音符)。这通常对应于器乐独奏的音符。对我的两阶段音高检测算法的 C++ 源代码感兴趣的人可能希望从 GitHub.com 上 SPitchCalc.cpp 文件中的 Estimate_ScalePitch() 函数开始。

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

【讨论】:

  • 这很有趣,但是您的描述令人困惑。您强调您的算法适用于“复音 mp3 文件”,但您描述的算法仅检测单个音高,这不是 OP 所要求的。单音高检测算法已经相当普遍,并且已经存在了几十年。您可以在音乐商店购买的每个数字调谐器都使用与您描述的方法类似的方法来实现这种算法。你的算法有什么不同?
【解决方案2】:

可能需要一个吉他拾音器来隔离每根琴弦。否则,将所有泛音分开可能是一个非常困难的问题。

【讨论】:

    【解决方案3】:

    有两种众所周知的用于参数谱估计的统计技术。一个是MUSIC 另一个是ESPRIT。如果您可以将信号表示为加权复指数(即正弦曲线)的总和,则可以应用它们中的任何一个。此外,相关矩阵的特征分解还会告诉您信号中的频率数量,因此您甚至不应该知道这一点。 ESPRIT 比 MUSIC 更好,因为您不应该在频域中搜索峰值。结果是直接给你频率。但是,众所周知,MUSIC 更强大。

    【讨论】:

    • 这几乎就是我想要的;生成实时结果的速度是否足够快(即向吉他手提供实时反馈)?
    • 取决于您的数据大小。我更喜欢 ESPRIT,在这种情况下,你应该做两个特征分解。对于 M × M 自相关矩阵,这对应于 M^3 操作。问题是您的 M 应该大于 K(K 是信号中的频率数)。所以我认为这对你来说不是一个大问题,因为你没有太多的频率。
    • @YBE : 据报道,当人们不知道所涉及的指数的确切数量时,MUSIC 和 ESPRIT 的表现很差,而且吉他可以为每根弦产生一些大而不同数量的泛音(可能是几十个) ),其中一些可能略微不和谐。
    • @hotpaw2,您不知道指数的数量是对的,但是,自相关矩阵的特征分解也可以说明所涉及的组件数量。由于信号特征值大于噪声特征值,因此特征谱中的某个点应该有显着下降。虽然,在严重噪声观察的情况下,噪声特征值将与信号特征值相当。还有另一种称为湮灭滤波器方法的技术与 Cadzow 的迭代去噪一起使用,据称它是稳健的。
    猜你喜欢
    • 2011-05-28
    • 2011-09-23
    • 2023-03-19
    • 2011-01-15
    • 2010-11-30
    • 2012-05-09
    • 1970-01-01
    • 2017-05-30
    • 2023-03-11
    相关资源
    最近更新 更多