当前位置: 首页 >> 程序设计 >> 音乐识别轻度不匹配的解决办法和源代码
 

音乐识别轻度不匹配的解决办法和源代码

作者:      来源:http://blog.csdn.net/gantleman     发表时间:2007-04-30     浏览次数:      字号:    

今天晚上对音乐识别码作了调整,发现采样的时间不能太短,但想达到快速匹配就要尽量压短时间,理论上采样点越多每个点的权值就越低,容错度就越高结果的精确度就高。 

还是昨天的结果

0x0000110001111111
0x0000100001111112
0x0000100001111111

三个不同的格式不同采样的歌曲还是在个别地方有很大的不同不过我想到了一个简单的解决办法

100010000000000000001000100010001000100010001
100000000000000000001000100010001000100010010==2
100000000000000000001000100010001000100010001==1

转换成2进制作按位与 & 。然后统计结果中1的个数,算出最亲近的识别码。这点计算量对服务器来说微不足道。

下面是识别码产生的主要代码贴到wmaPlay例子里就可以用了。

#define FREQUENCY 5

BOOL CWavePlayer::Play(BYTE * inData, DWORD inLength, QWORD inSampleTime)
{
 int begin = 0;
 if (mLoop < 12) {
  for (UINT32 loop = 0; loop < inLength; loop++ ){
   if (mWaveFormat->nChannels == 1) { 
    if (mWaveFormat->wBitsPerSample == 8) { 
     mSum  += abs(inData[loop]);
     mCount++;
    }
    if (mWaveFormat->wBitsPerSample == 16) {
     if ((loop + 1) % 2 == 1) {
      short tdata;
      memcpy(&tdata, (inData + loop), 2);
      mSum  += abs(tdata);
      mCount++;
     }
    }
   }else{
    if (mWaveFormat->wBitsPerSample == 8) {
     if ((loop + 1) % 2 == 1) {
      short tdata;
      mSum  += abs(inData[loop]);
      mCount++;
     }
    }
    if (mWaveFormat->wBitsPerSample == 16) {
     if ((loop + 1) % 4 == 1) {
      short tdata;
      memcpy(&tdata, (inData + loop), 2);
      mSum  += abs(tdata);
      mCount++;
     }
    }
   }
   // sur.sun[4/29/2007] 划分为8份
   if ((mCount * (mWaveFormat->wBitsPerSample / 8) * mWaveFormat->nChannels) == mWaveFormat->nAvgBytesPerSec * FREQUENCY) {
    
    double coef;
    if (mWaveFormat->wBitsPerSample == 8) {
     coef = 16.00;
    }
    if (mWaveFormat->wBitsPerSample == 16) {
     coef = 4096.00;
    }
    
    double temp = mSum / (mCount * coef);
    mSum = 0;
    mCount = 0;

    if (abs(temp) == 0) {
     if (mLoop == 0) {
      begin ++;
      loop = (mWaveFormat->nSamplesPerSec * FREQUENCY / 8 - 1) * begin;
      continue;
     }
     
    }
    mLoop++;
    mAvg = mAvg << 4;
    mAvg += abs(temp);//sur.sun[4/29/2007]产生的识别码在mAvg里面
   }
  }
 }else{
// sur.sun[4/29/2007]
 }

工作算告一段落了,理论上是解决了这个问题,但没有做大规模测试估计结果也没什么商业意义。

代码可以使用,但要是你用于商业目的请先征求我的同意

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •