使用Bass Library将libmfcc移植到C#

时间:2012-02-09 15:06:59

标签: c# signal-processing fft spectrum mfcc

我目前正在使用音频分析的低音库,它可以计算FFT并将其作为数组返回,libmfcc使用此数据来计算我需要的MFCC系数的值。 (信息:MFCC就像一个音频谱,但它更符合人类听觉和频率缩放的工作方式) 低音库将值从0返回到1作为FFT值。

现在我遇到了几个问题和问题:

  • 他们的FFT示例数据似乎有不同的格式,值非常高,总共8192个FFT值总和为10739.24,怎么会这样?[/ li]
  • 在他们的example Application中,他们会像下面这样调用函数。为什么如果它们只加载了8192个值,它们使用128作为FFT数组大小?
  • 使用他们复制并编辑了一下的MFCC类来匹配C#语法/函数我得到一些系数的负值,我不认为应该是这种情况。

任何人都可以帮我解释为什么它会返回负值或我做错了什么? 我做了一个简单的示例Ready to Try Program,它执行上述操作并且对调试很有用。
链接:http://www.xup.in/dl,17603935/MFCC_Test.rar/

我的C#应用​​程序的输出(很可能不正确)

  

Coeff 16 = 0,017919318626506 Coeff 17 = -0,155580763009355 Coeff 18 =   -0,76072865841987 Coeff 19 = 0,108961510335727 Coeff 20 = 0,819025783804398 Coeff 21 = -0,660508603974514 Coeff 22 =   -0,951623924906163 Coeff 23 = 0,424922129906254 Coeff 24 = 0,0129727009313168 Coeff 25 = -0,388796833267654 Coeff 26 =   0,270839393161931 Coeff 27 = -0,138515788828431 Coeff 28 =   -0,454837674981149 Coeff 29 = -0,448629344922371 Coeff 30 = -0,11908663618393 Coeff 31 = 0,237500036702818 Coeff 32 = 0,114874386870208 Coeff 33 = -0,100822381384326 Coeff 34 =   0,144242143551012 Coeff 35 = 0,209338502838453 Coeff 36 =   0,247588420953066 Coeff 37 = -0,451654204112441 Coeff 38 =   0,0346927542067229 Coeff 39 = 0,180816031061584

他们的示例FFT数据(不同格式?)

  

14.524506   38.176063   10.673860   3.705076   2.102398   1.461585   1.145616   0.974108   0.878079   0.825304   0.798959   0.789067   0.789914   0.797102   0.808576   0.822048   0.836592   0.851101   0.864869   0.877625   0.888780   0.897852   0.905033   0.910054   0.912214   0.912414   0.909593   0.904497

2 个答案:

答案 0 :(得分:0)

我可以回答第一部分:    示例代码清楚地表明输入数据是使用FFTW计算的,它产生unnormalized result。你需要除以sqrt(n)来得到标准化值,这是我怀疑BASS返回的。

也许将输入乘以sqrt(n)可以得到更好的结果。

答案 1 :(得分:0)

MFCC例程返回倒谱系数(梅尔强度对数的DCT)而不是梅尔强度值。倒谱系数可以为负。我相信示例代码中的值128确实是作者的错误。为了保留信号能量,FFT需要在某个点进行归一化(在FFT,iFFT之后或在两者之间分割)。在该示例中,您正在查看原始(未规范化的)幅度,这就是它们如此大的原因。