MFCC实施

时间:2011-07-15 01:36:07

标签: signal-processing dct 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.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类中提供的对数,所以任何人都知道为什么我会得到这个奇怪的结果?或者它们应该是这样的?

0 个答案:

没有答案