Внедрение MFCC - PullRequest
       37

Внедрение MFCC

0 голосов
/ 15 июля 2011

Я застрял с реализацией mfcc, я уже применил треугольные окна к своим кадрам, чтобы сгруппировать их по частоте, до сих пор, пока все идет хорошо, у меня также есть реализация спектрограммы с использованием шкалы коры,и если я «построю» оба они выглядят очень похоже, то следующим будет получение натурального логарифма каждого значения, если я «построю» в этой точке, я думаю, что все идет не так, но кто-то сказал мне, что на этом этапе все ещехорошо, но когда я добираюсь до дискретного косинусного преобразования, все идет к черту, потому что я получаю действительно огромное значение на первом фильтре каждого кадра, а на других действительно низкие значения, некоторые значения равны

Frame1:

160.20196974214088
-3.9793329108445104
-0.4708345275794219
-0.16011250934517918
-0.28128350722885287
0.12737821170221864
-0.23083735077866585
-0.5972053463198126
-0.5965350929063948
-0.4144317398212207
-0.28141331491159516
-0.20884717775171513
-0.16555542805069567
0.03120244742083278
-0.0052608390364583535
0.036265742995973405

frame 2

166.75224098668716
-4.12097424879887
-0.5413060686856817
0.07208275193476865
0.24290929767376923
0.40593014510101355
-0.04768656907328328
-0.5017739662912337
-0.14551831905933188
0.13207078992014942
-0.049166743816071445
0.047301040659050386
0.11165924793703397
0.21650100135239958
0.22792121431771495
0.158700602174
38664
...

Таким образом, я всегда получаю действительно большое первое значение фильтра и делаю «неважными» другие значения, поэтому, если я построю график на этому меня только большая черная полоса внизу графика, а наверху - тусклые, мой код для DCT довольно прост, вот этот

    public static double[] DCT(double[] data){
    int i=0;
    int j=0;
    double[] ctr=new double[data.length];
    while(i<data.length){
        while(j<data.length){
            ctr[i]+=data[j]*Math.cos(i*(Math.PI/data.length)*((j+1)-0.5));
            j++;
        }           
        System.out.println(ctr[i]);
        j=0;
        i++;
    }
    System.out.println("______________________");
    return ctr;
}

Я использую (j+1), потому что первый фильтр находится на позиции j = 0 в массиве, поэтому m=1 на самом деле на позиции j=0, поэтому j=1 на самом деле m=2 и так далее..., и хорошо, вы все знаете формулу для DCT , я не думаю, что проблема в любой другой части кода, так как «изображения» выглядят хорошо после группировки их с треугольными фильтрамии натуральный логарифм, который я использую, представлен в классе Math, так что у кого-нибудь есть представление о том, почему я получаю такие странные результаты?Или они должны получиться такими?

...