关于音频:如何分析PCM或WAV样本的基频?

关于音频:如何分析PCM或WAV样本的基频?

How do you analyse the fundamental frequency of a PCM or WAV sample?

我有一个样本保存在DirectX的缓冲区中。 这是从乐器弹奏和捕获的音符样本。 如何分析采样的频率(就像吉他调音器一样)? 我相信涉及FFT,但是我没有指向HOWTO的指针。


FFT可以帮助您确定频率在哪里,但不能准确告诉您频率是多少。 FFT中的每个点都是一个"频率"频率,因此,如果FFT中存在一个峰值,您所知道的就是您想要的频率在该频率或频率范围内。

如果您希望它真正准确,则需要具有高分辨率的长FFT和大量的bin(=大量的内存和大量的计算)。您还可以在对数标度频谱上使用二次插值,从低分辨率FFT中猜测出真正的峰值,效果令人惊讶。

如果计算成本最为重要,则可以尝试将信号转换为可以计数零交叉的形式,然后计数越多,测量越准确。

但是,如果缺少基本原理,这些方法都将无法工作。 :)

我在这里概述了几种不同的算法,并且内插FFT通常是最精确的(尽管仅在基波是最强谐波时才有效-否则,您需要更聪明地找到它),并且零交叉点接近第二(尽管这仅适用于每个周期有一个交叉的波形)。这些条件都不是典型的。

请记住,在许多乐器(例如钢琴或吉他)中,高于基本频率的部分不是完美的谐波。每个部分实际上有点失调或不和谐。因此,FFT中的高频峰值将不完全位于基频的整数倍上,并且波形将从一个周期到下一个周期稍有变化,这会导致自相关。

为了获得真正准确的频率读数,我会说要使用自相关来猜测基频,然后使用二次插值找到真实的峰值。 (您可以在频域中进行自相关以节省CPU周期。)有很多陷阱,正确的使用方法实际上取决于您的应用程序。


还有其他基于时间的算法,而不是基于频率的算法。
自相关是用于音调检测的相对简单的算法。
参考:http://cnx.org/content/m11714/latest/

我已经编写了自相关的c#实现和其他可读的算法。查看http://code.google.com/p/yaalp/。

http://code.google.com/p/yaalp/source/browse/#svn/trunk/csaudio/WaveAudio/WaveAudio
列出文件,PitchDetection.cs是您想要的文件。

(该项目是GPL;因此,如果您使用该代码,请理解这些术语)。


吉他调音器不使用FFT或DFT。通常他们只算零交叉。您可能无法获得基本频率,因为某些波形比其他波形具有更多的零交叉,但通常可以这样获得基本频率的倍数。尽管您可能会掉一个或多个八度音,但这足以获得音符。

在对零交叉计数之前,低通滤波通常可以消除多余的零交叉。调整低通滤波器需要了解一些您想要检测的频率范围


确实会涉及FFT(快速傅立叶变换)。 FFT使您可以用固定频率和幅度变化的简单正弦波之和来近似任何模拟信号。实际上,您要做的是获取一个样本并将其分解为幅度->频率对,然后获取与最高幅度相对应的频率。

希望其他SO读者可以填补我在理论和代码之间留下的空白!


具体来说:

如果从输入阵列中的原始PCM开始,基本上就是波幅与时间的关系图,执行FFT会将其转换为输入采样率从0到1/2的频率直方图。结果数组中每个条目的值将是相应子频率的"强度"。

因此,以给定的大小为N的输入数组(以S个样本/秒为样本),找到根频率:

1
2
3
4
5
FFT(N, input, output);
max = max_i = 0;
for(i=0;i<N;i++)
  if (output[i]>max) max_i = i;
root = S/2.0 * max_i/N ;


检索PCM音频信号中的基频是一项艰巨的任务,并且有很多要讨论的地方...

无论如何,通常基于时间的方法不适合用于复音信号,因为由多个基频导致的不同谐波分量之和给出的复波具有零交叉率,该交叉率仅取决于最低频率分量。
同样在频域中,FFT也不是最合适的方法,因为音符之间的频率间隔遵循指数尺度,而不是线性的。这意味着,如果时域中分析窗口的大小不够大,则FFT方法中使用的恒定频率分辨率可能不足以解析较低频率的音符。

一种更合适的方法是恒定Q变换,它是在对信号进行2次低通滤波和抽取(即将采样频率的每一步减半)后进行DFT滤波,以便获得具有不同频率的不同子带解析度。这样,DFT的计算得以优化。问题在于时间分辨率也是可变的,并且对于较低的子带会增加...

最后,如果我们试图估计单个音符的基本频率,则FFT / DFT方法是可以的。在复音环境中,事物发生了变化,其中不同声音的部分重叠并根据其相位差求和/取消幅度,因此单个频谱峰值可能属于不同的谐波含量(属于不同的音符)。在这种情况下,相关性不会给出良好的结果...


应用DFT,然后从结果中得出基本频率。搜寻DFT信息将为您提供所需的信息-我会将您链接到一些信息,但是它们对数学知识的期望差异很大。

祝好运。


推荐阅读