1

我最近一直在使用 FFT 进行音高检测,我注意到虽然音符是正确的(例如 C、D# 等),但有很多音符在错误的八度音阶中(例如 E2 被归类为 E3,C3 是归类为 C4,总是向上八度)。

为什么会这样?我的算法是在计算 FFT 箱后,我得到强度最大的箱并计算它的频率。

对此有什么帮助吗?谢谢!

4

4 回答 4

2

两个想法:-

  1. 如果您的输入和您的算法总是与您期望的相差 1 个八度音程,那么您就不能接受这样的校准并总是减去一个八度音程吗?

  2. 当您拿起吉他弦时,您总是会得到一个恰好高一个八度的谐波(第二谐波),非常响亮 - 大约与自然音(第一谐波)一样响亮。接下来你会得到 1 个八度音阶以上的 7 个半音(3 次泛音),但八度音阶的泛音非常明显。

于 2012-11-24T04:11:30.360 回答
1

对我来说听起来像谐波。格雷格的尖锐问题似乎是在正确的轨道上。

如果这是真的,您可以尝试查找所有存储桶的统计中位数并找到最接近的,而不是查找统计模式(如您当前所做的那样)。

如果您看到输出的变化,您还可以进行时间平滑(随时间平均)。

我知道吉他调音师会做一些这样的事情,但仍然会间歇性地出错。这是一个混乱的业务:)

说到实时采样,根据您的采样源,需要考虑很多异常情况,这些异常情况可能会给您带来意想不到的结果:

  • 声音中的泛音
  • 声音中听不见的音调

这些将显示在您的数据中,但您可能听不到它们。如果您尝试匹配多个音调或和弦,您的工作将更加复杂。

于 2011-06-27T02:02:30.157 回答
0

在决定将音高放入哪个八度音阶时,请尝试在每个桶中添加以 3 倍频率存在的音频量的一部分(例如,将 1320Hz 桶的幅度的一部分添加到 440Hz 桶中)。在大多数乐器上,A440 可能在 880Hz、1320Hz、1760Hz、2200Hz、2640Hz 等处具有显着的分量。A880 可能具有 880Hz、1760Hz 和 2640Hz,但不会有显着的 1320Hz 分量(也不是 2220Hz事情)。因此,如果您的代码试图确定一个音符是 A440 还是 A880,查看三次谐波桶(或其他奇次谐波)可能会提供有用的线索。

于 2012-11-24T04:19:30.710 回答
0

八度音检测可能非常棘手,尤其是在缺少基本谐波和/或其他谐波的复音信号上。假设您正确检测“音高”而不仅仅是“谐波”(参见下面的维基百科链接),那么您可以使用我开发的八度检测算法。

为了对 PitchScope Player 进行音高检测,我决定采用一个 2 阶段算法,其工作原理如下: a) 首先检测音符的 ScalePitch -- 'ScalePitch' 有 12 个可能的音高值:{ E, F, F#, G、G#、A、A#、B、C、C#、D、D#}。在确定一个音符的 ScalePitch 和 Time-Width 之后,b) 然后通过检查 4 个可能的 Octave-Candidate 音符的所有谐波来计算该音符的八度(基本)。

我的音高检测应用程序 PitchScope Player 的完整 C++ 源代码和可执行文件位于 GitHub(下面的链接)上,您可以编译并逐步查看我的 Octave 检测算法是如何工作的。

您可能希望关注文件 FundCandidCalcer.cpp 中的函数 FundCandidCalcer::Calc_Best_Octave_Candidate() 以查看 C++ 中的算法。下图还粗略地说明了如何计算八度音程。

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

https://github.com/CreativeDetectors/PitchScope_Player

下图演示了八度检测算法,一旦确定了该音符的 ScalePitch,我开发该算法以选择正确的八度候选音符(即正确的基本音)。

在此处输入图像描述

于 2016-09-10T18:58:26.163 回答