我有一个来自DirectX缓冲区的样本。它是一个乐器演奏并被捕获的音符样本。如何分析样本的频率(就像吉他调音器一样)?我相信需要使用FFT,但我没有相关的HOWTO指针。
我有一个来自DirectX缓冲区的样本。它是一个乐器演奏并被捕获的音符样本。如何分析样本的频率(就像吉他调音器一样)?我相信需要使用FFT,但我没有相关的HOWTO指针。
除了基于频率的算法外,还有其他基于时间的算法。
自相关是一种相对简单的音高检测算法。
参考链接: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协议,请了解使用代码的条款)。
FFTs(快速傅里叶变换)确实会被涉及。FFT允许你用一组固定频率和变幅的简单正弦波来近似任何模拟信号。你将要做的就是对样本进行分解,得到振幅->频率对,然后取与最高振幅相对应的频率。
希望其他SO读者能填补我在理论和代码之间留下的空白!
更具体地说:
如果您从输入数组中的原始 PCM 开始,您基本上拥有的是波幅与时间的图表。做 FFT 将会将其转换为从0到输入采样率的1/2的频率直方图。结果数组中每个条目的值将是对应子频率的“强度”。
因此,要在给定大小为 N、以 S 次/秒采样的输入数组中找到根频率:
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 ;