如何获取wav文件中的注释列表?

时间:2012-07-09 01:10:14

标签: c++ audio fftw pitch

我正在编写一个帮助人们学习吉他的程序。要做到这一点,我需要能够查看一个时间样本,看看他们播放了什么音符。我看了一下FFTW,但我不明白如何让它工作。我也试图弄清楚Goertzel算法,但它似乎只适用于像拨号音这样的单频音符(尽管不确定)。为了清楚起见,我确实需要能够检测到多个音符(以查看是否演奏了和弦),但是如果有一些谐波进入则无关紧要。

我用C ++编写代码,并且更喜欢跨平台的解决方案。

更新:我意识到检测特定音符并不是那么重要;我真正需要的是检查某些频率是否存在,而其他频率则不存在。例如,如果有人播放C,我想检查C频率是否存在(约262 Hz),以及可能是524 Hz和786 Hz,并检查附近的不是的音符在泛音系列附近(如B和D)不存在。

3 个答案:

答案 0 :(得分:3)

wav文件中没有注释。采样的声音是。

人类可能会在某些wav文件中感知到可能已经播放过的某些音符,但是从录制的声音到录制的音乐进行自动复音音高估计/识别以获得丰富而复杂的波形,例如由吉他制作,仍会出现成为一个高级研究课题。

如果可能存在某些非常有限的音乐类型,则会涉及一些非平凡的DSP。 FFTW对于音调估计所需的更复杂的DSP处理的一小部分可能是有用的,Goertzel滤波较少。

答案 1 :(得分:0)

我不能指出你的具体细节,但我相信你需要的是Fourier transform来检测你正在寻找的频率。还有一个类似的问题here

答案 2 :(得分:0)

这个pdf怎么样? http://miracle.otago.ac.nz/tartini/papers/A_Smarter_Way_to_Find_Pitch.pdf

FFT的问题在于,如果进行256次采样FFT,则只能得到256个输出。从本质上讲,这意味着它会将您的频率空间划分为有限的频率范围。

这是因为如果你只检查256个样本(256个可以用N代替,用于FFT的样本数),任何与256的倍数相关的频率看起来都是一样的。

换句话说,如果检查256个均匀间隔的样本,则在时间0,1 / 256,2 / 256,3 / 256,... 255/256处进行。然后,具有频率80周/秒的两个信号sin(2 pi 80 x)和具有频率(80 + 9 * 256)的sin(2 pi(80 + 9 * 256)x)将具有相同的样品。

这里,9可以用k代替,即要使用的倍数。您可以用1,2,3,4,5等替换9。您也可以用任何值替换256(N)。

例如,在200/256(其中一个样本)进行采样,我们有: 罪(2 pi(80 + 9 * 256)(200/256))=罪(2 pi 80(200/256)+ 2 pi * 9 * 200)

因为2 pi的倍数不会影响罪,所以这与...相同 罪(2 pi 80(200/256))。

更一般地说, sin(2 pi(M + k * N)j / N)= sin(2 pi M(j / N)+ 2 pi k * j)= sin(2 pi M(j / N)),其中j是任意整数0,...,N - 1,N是​​样本数,(j / N)是采样时间,M是每秒循环数,k是任意整数... -2,-1 ,0,1,2 ......

根据奈奎斯特采样,如果要区分,-128,-127,-126,-125,...,125,126,127个周期/秒,则需要256个样本/秒。 256个样本/秒意味着区分256个频率。但是,0周/秒,256周/秒,512周/秒,1024周/秒都看起来都一样。