|
음성인식 공부 하신 분은 아시겠지만
DTW 알고리즘 입니다.
음성과는 직접적인 관련은 없는데요 '';
그냥 DTW 알고리즘 일 뿐입니다.
설명을 좀 드리자면, 두 숫자 사이에
최단 거리를 구하는게 DTW 알고리즘이죠.
두 숫자가 19 까지는 잘 작동 하는데
20 부터는 뻗어 버리는 특징이 있네요 '';
어디가 문제가 됬는지좀 알려주세요.
//---------------------------------------------------------------------------
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#define MAX_FLOAT 1e10
int Tx;
int Ty;
int no_path=3;
struct points{
int ix;
int iy;
} s_points[1000];
int no_step[3]={2,1,2};
int dx[3][2]={
{ -1, -2 },
{ -1, 0 },
{ 0, -1 }
};
int dy[3][2]={
{ 0, -1 },
{ -1, 0 },
{ -1, -2 }
};
int cnt;
float che[100000][3];
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
float calc_distance(int ix,int iy)
{
float f1,f2;
f1= sin(3.1416/Tx*ix);
f2= sin(3.1416/Ty*iy);
return (f2-f1)*(f2-f1);
}
//---------------------------------------------------------------------------
float dtw(int ix, int iy, int depth )
{
int i,j;
int ixp;
int iyp;
float val;
float min_val;
int min1,max1,min2,max2;
float d_local;
int flag;
int new_depth;
int buf;
if(ix==1 && iy==1) return 0;
min_val=MAX_FLOAT;
for(i=0;i<no_path;i++)
{
d_local=0;
flag=1;
for(j=0;j<no_step[i];j++)
{
ixp=ix+dx[i][j]; iyp=iy+dy[i][j];
min1=1+(ixp-1)/4;
max1=1+(ixp-1)*4;
min2=Ty+(ixp-Tx)*4;
max2=Ty+(ixp-Tx)/4;
if( iyp >= min1 && iyp <=max1 && iyp >= min2 && iyp <=max2 && ixp<= Tx && iyp <=Ty)
{
d_local += calc_distance(ixp,iyp);
}
else
{
d_local=MAX_FLOAT;
flag=0;
}
}
d_local=d_local/no_step[i];
new_depth=depth+1;
if(flag==1)
{
val = d_local+dtw(ixp,iyp,new_depth);
}
else
{
val=MAX_FLOAT;
}
if( val < min_val )
min_val=val;
}
return min_val;
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
float val;
Tx=StrToInt(Edit1->Text);
Ty=StrToInt(Edit2->Text);
val=dtw(Tx,Ty,0);
Memo1->Clear();
Memo1->Lines->Add(" min val= "+FloatToStr(val));
}
//---------------------------------------------------------------------------
|