Проблема с MFCC

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

Кадр 1:

+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

кадр 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,15870060217438664

И так далее, так что я всегда получаю первое значение фильтра действительно большим и делаю "неважными" другие значения, поэтому, если я строю график в этой точке, я получаю только большую черную полосу внизу графика и действительно исчезаю приведенные выше, мой код для 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, я не думаю, что проблема в любой другой части кода, так как "изображения" выглядят хорошо после группировки их с треугольными фильтрами и натуральным логарифмом i Я использую только один провидад в классе Math, так что у кого-нибудь есть идея, почему я получаю такие странные результаты? или они должны быть такими? заранее спасибо

0 ответов

Другие вопросы по тегам