【发布时间】:2011-02-28 07:38:02
【问题描述】:
使用这个网站,我尝试制作一个节拍检测引擎。 http://www.gamedev.net/reference/articles/article1952.asp
{
ALfloat energy = 0;
ALfloat aEnergy = 0;
ALint beats = 0;
bool init = false;
ALfloat Ei[42];
ALfloat V = 0;
ALfloat C = 0;
ALshort *hold;
hold = new ALshort[[myDat length]/2];
[myDat getBytes:hold length:[myDat length]];
ALuint uiNumSamples;
uiNumSamples = [myDat length]/4;
if(alDatal == NULL)
alDatal = (ALshort *) malloc(uiNumSamples*2);
if(alDatar == NULL)
alDatar = (ALshort *) malloc(uiNumSamples*2);
for (int i = 0; i < uiNumSamples; i++)
{
alDatal[i] = hold[i*2];
alDatar[i] = hold[i*2+1];
}
energy = 0;
for(int start = 0; start<(22050*10); start+=512){
for(int i = start; i<(start+512); i++){
energy+= ((alDatal[i]*alDatal[i]) + (alDatal[i]*alDatar[i]));
}
aEnergy = 0;
for(int i = 41; i>=0; i--){
if(i ==0){
Ei[0] = energy;
}
else {
Ei[i] = Ei[i-1];
}
if(start >= 21504){
aEnergy+=Ei[i];
}
}
aEnergy = aEnergy/43.f;
if (start >= 21504) {
for(int i = 0; i<42; i++){
V += (Ei[i]-aEnergy);
}
V = V/43.f;
C = (-0.0025714*V)+1.5142857;
init = true;
if(energy >(C*aEnergy)) beats++;
}
}
}
alDatal 和 alDatar 是 (short*) 类型;
myDat 是 NSdata,它保存格式化为的 wav 文件的实际音频数据 22050 khz 和 16 位立体声。
这似乎无法正常工作。如果有人能帮助我,那就太棒了。我已经坚持了 3 天了。
所需的结果是在处理完 10 秒的数据后,我应该能够将其乘以 6 并估算出每分钟的节拍数。
我目前的结果是每 10 秒 389 拍,2334 BPM 我知道的歌曲大约是 120 BPM。
【问题讨论】:
-
[A code sn-p] + ["这似乎无法正常工作。"] = [您没有尽职尽责地描述您的预期结果以及三天的结果如何工作偏离了预期。]
-
对不起。我更新了我原来的问题。
标签: iphone objective-c audio-processing