发布一个可以检测一段音频数据BPM(拍每分)的库,可用于游戏(跳舞类等)、教学、音频分析、可视化音频等。
采用独创的多频段分析+时域拟合技术,最终BPM比GameDev发布的算法要精确的多。
大致分析流程:
首先将输入的音频数据经过FFT分解为256个子带,然后对每个子带进行节拍采样和分析,计算出每个频段的大致BPM,然后再分析整段音频数据(时域),得出时域近似BPM,再通过这些数据生成固定模拟BPM,最后进行固定模拟BPM和各频段近似BPM拟合,得出最终精确地BPM。
本库只需3到6秒有明显节奏的音频数据即可分析出较精确地BPM,10秒即可得出最精确的BPM!
下面为测试(从有明显节奏处开始计算):
歌曲名 时间 BPM
WAX-发困 2秒 122.75
WAX-发困 5秒 122.13
WAX-发困 9秒 121.56(经本人人工实际精确计算,此歌曲的BPM为121.70)
本库算法精妙,计算速度快,结果精确!
1.00版接口定义(API):
所有接口声明规范:
extern "C" __declspec(dllexport)
所有接口定义及说明:
//初始化BPM检测实例,成功返回0,失败返回1(参数1:声道数, 参数二:采样率, 参数三:私有数据)
int Init_BPMCheck_System(int nChannels, int nSampleRate, void **DataArea);
//向缓冲区写入数据,32位浮点数据(参数一:缓冲区地址, 参数二:样本数量, 参数三:私有数据)
void WriteSamplesToBuffer(float *ptrBuffer, int nSampleNum, void **DataArea);
//分析样本并返回BPM,返回-2.00f说明错误,返回-1.00f说明需要更多的样本(参数一:最小BPM,一般为80, 参数二:最大BPM,一般为160,参数三同上)
float AnalyseSamples(float MinBPM, float MaxBPM, void **DataArea);
//释放BPM检测实例,参数一同上
void UnInit_BPMCheck_System(void **DataArea);
//显示关于,参数一为父句柄(可以是NULL)
void ShowAbout(HWND MyParents);
以上接口中的void **DataArea即为同一个东西,实例私有数据!
所以再调用前,必须要为私有数据申请一块空间,例如:
void *MyData;
MyData = malloc(sizeof(void *));
Init_BPMCheck_System(2, 44100, &MyData);
WriteSamplesToBuffer(ptrBuffer, nSampleNum, &MyData);
AnalyseSamples(80, 160, &MyData);
UnInit_BPMCheck_System(&MyData);
free(MyData);
各接口调用顺序及依赖关系:
1、ShowAbout无任何依赖,可随时调用
2、WriteSamplesToBuffer, AnalyseSamples, UnInit_BPMCheck_System需要先创建一个BPM检测实例,然后才可调用(需要创建实例后返回的私有数据,即DataArea)
3、Init_BPMC
|