使用Bass库将libmfcc移植到C#
本文关键字:libmfcc Bass 库将 使用 | 更新日期: 2023-09-27 18:24:06
我目前正在使用用于音频分析的低音库,该库可以计算FFT并将其作为数组返回,libmfcc使用此数据来计算我需要的MFCC系数的值。(信息:MFCC就像一个音频频谱,但它更适合人类听觉和频率缩放的工作方式)Bass Library将0到1之间的值作为FFT值返回。
现在我遇到了几个问题:
- 他们的FFT示例数据似乎有不同的格式,值非常高,8192个FFT值的总和为10739.24,这怎么可能呢?[/li]
- 在他们的示例应用程序中,他们调用函数如下。如果他们只加载了8192个值,为什么要使用128作为FFT数组大小
- 使用他们的MFCC类,我复制并编辑了一些以匹配C#语法/函数,我得到了一些系数的负值,我认为不应该是这样
有人能帮我弄清楚为什么它会返回负值,或者我做错了什么吗?我做了一个简单的例子Ready-to-Try程序,它完成了上面描述的操作,对调试很有用。
链接:http://www.xup.in/dl,17603935/MFCC_Test.rar/
我的C#应用程序的输出(很可能不正确)
系数16=0017919318626506系数17=-0155580763009355系数18=-076072865841987系数19=0108961510335727系数20=0819025783804398系数21=-0660508603974514系数22=-0951623924906163系数23=0424922129906254系数24=0012972700913168系数25=-0388796833267654系数26=0270839393161931系数27=-013855788828431系数28=-0454837674981149 Coeff 29=-0448629344922371 Coeff 30=-011908663618393 Coeff 31=0237500036702818 Coeff 32=0114874386870208 Coeff 33=-0100822381384326 Coeff 34=0144242143551012系数35=0209338502838453系数36=0247588420953066 Coeff 37=-0451654204112441 Coeff 38=00346927542067229 Coeff 39=0180816031061584
他们的示例FFT数据(不同格式?)
14.52450638.17606310.6738603.7050762.1023981.4615851.1456160.9741080.8780790.8253040.7989590.7890670.7899140.7971020.8085760.8220480.8365920.8511010.8648690.8776250.8887800.8978520.9050330.9100540.9122140.9124140.9095930.904497
我可以回答第一部分:示例代码明确指出,输入数据是使用FFTW计算的,这会产生未规范化的结果。您需要除以sqrt(n)来获得规范化的值,我怀疑这就是BASS返回的值。
也许将输入乘以sqrt(n)会得到更好的结果。
MFCC例程返回倒谱系数(mel幅度对数的DCT),而不是mel幅度值。倒谱系数可以是负的。我相信示例代码中的值128确实是作者的一个错误。为了保持信号能量,FFT需要在某个点进行归一化(在FFT、iFFT之后或在两者之间进行分割)。在这个例子中,你看到的是原始的(未规范化的)星等,这就是它们如此大的原因。