2013-07-29 10 views
0

당신의 도움이 필요합니다. 나는 sphinx3에서 생성 된 두 개의 mfc 파일의 각 값 사이의 유클리드 거리를 찾고 싶다. 내 문제는 b.wav가 a.wav의 하위 부분 인 a.wav와 b.wav와 같은 두 개의 wav 파일을 전달해야한다는 것입니다. 나는 텍스트 형식으로 .mfc 생성하고이값 사이의 유클리드 거리를 찾으십시오

11.143 1.3739 -0.18189 -0.46588 0.081962 -0.053194 -0.039629 -0.19989 -0.28369 -0.41381 -0.38511 -0.25862 -0.017158 
11.013 1.2289 -0.28845 -0.51773 -0.049813 -0.0025347 -0.10207 -0.23056 -0.33524 -0.27521 -0.37585 -0.36463 -0.06067 
10.999 1.2356 -0.1489 -0.39382 -0.029506 0.054779 0.12997 -0.11465 -0.27684 -0.40508 -0.4854 -0.31248 -0.19142 
10.977 1.235 -0.18344 -0.61799 -0.12633 -0.049641 0.039414 -0.16939 -0.1884 -0.34448 -0.27235 -0.20559 -0.23409 
10.987 1.2966 -0.12835 -0.4269 -0.14144 -0.14519 -0.06445 -0.19406 -0.19799 -0.29742 -0.41959 -0.17827 -0.029767 
11.035 1.4875 -0.23199 -0.51662 -0.045337 -0.024595 -0.079227 -0.20181 -0.25853 -0.43788 -0.47611 -0.33845 -0.082532 

지금 내가 a.mfc 및 b.mfc의 각 값 사이의 유클리드 거리를 계산하려는처럼입니다. 이것은 Matlab에서 가능하지만 너무 많은 시간이 걸립니다. 나는 이것을 C 언어로하고 싶다. 어떤 도움이라도 대단히 감사하겠습니다.

감사합니다.

+0

C로 .mfc 파일을 읽을 수 있습니까? a.mfc와 b.mfc는 같은 수의 값을 가지고 있습니까? 그렇다면 두 파일을 두 개의 별도 배열로 읽고 Eculidean 거리 계산을 할 수 있습니다. – Thanushan

+0

mfc는 sphinx3_decode를 사용하여 텍스트 형식으로 sphinx3에서 생성되며 위에서 언급 한 것과 같은 일부 값을 포함합니다. 이 텍스트 파일의 값 수가 다릅니다. 이제는이 두 텍스트 파일의 각 요소 사이의 유클리드 거리를 계산하여 배열에 저장하려고합니다. – savi

+0

sphinx3에서 mfcc의 프레임 사이에 유클리드 거리를 계산하는 방법이 있는지 알려주십시오.이 작업을 수행 할 수있는 sphinx3_decode, sphinx3_astar와 같은 실행 파일이 있습니까? 고맙습니다. – savi

답변

2

귀하의 질문은 특별히 잘 작성되어 있지 않습니다. AFAIK mfc 파일에는 13 개의 요소가있는 벡터가 들어 있습니다. 일부 테스트되지 않은 코드는 다음과 같습니다.

#include <stdio.h> 
#include <math.h> 

#define VECSIZE 13 

void readvec(char* s, float* v) { 
    // read one vector from s into v 
    char* h; 
    h = strtok(s, " "); 
    int i = 0; 
    while (h != NULL && i < VECSIZE) { 
    v[i++] = atof(h); 
    h = strtok(NULL, " "); 
    } 
    while (i < VECSIZE) 
    v[i++] = .0; 
} 

bool compareFiles() { 
    FILE* a = fopen("a.wav", "r"); 
    FILE* b = fopen("b.wav", "r"); 
    FILE* res = fopen("res.wav", "w"); // results file 

    if (a == NULL || b == NULL || res == NULL) 
    return false; 

    char* sa[1024]; 
    char* sb[1024]; 
    float va[VECSIZE]; 
    float vb[VECSIZE]; 
    while (!feof(a) && !feof(b)) { 
    fgets(sa, 1024, a); 
    readvec(sa, va); 
    fgets(sb, 1024, b); 
    readvec(sb, vb); 
    float diff =.0; 
    for (int i = 0; i < VECSIZE; i++) 
     diff += pow(va[i] - vb[i], 2); 
    diff = sqrt(diff); 
    fprintf(res, "%f\n", diff); 
    } 
    fclose(a); 
    fclose(b); 
    fclose(res); 
    return true; 
} 
+0

mfc는 sphinx3_decode를 사용하여 텍스트 형식으로 sphinx3에서 생성되며 위에서 언급 한 것과 같은 일부 값을 포함합니다. 이 텍스트 파일의 값 수가 다릅니다. 이제는이 두 텍스트 파일의 각 요소 사이의 유클리드 거리를 계산하여 배열에 저장하려고합니다. – savi

+0

sphinx3에서 mfcc의 프레임 사이에 유클리드 거리를 계산하는 방법이 있는지 알려주십시오 ....이 작업을 수행 할 수있는 sphinx3_decode, sphinx3_astar와 같은 실행 파일이 있습니까? 고마워요 – savi

+0

글쎄, 스핑크스에 대해 전혀 모른다 .3. 위의 코드는 유클리드 거리를 파일 (res.wav)에 씁니다. 배열에 쉽게 저장할 수 있습니다. 불행히도 나는 여기에 C 코스를 줄 수는 없다 ... :) – Batox

관련 문제