使用mfcc进行声音分类和动态时间规整(dtw)

时间:2012-07-17 10:46:51

标签: mfcc

我的目标是对我在java中使用mfcc和dtw的非语音信号进行分类。但是我被困在中间。我将不胜感激任何帮助。 我已经为每个帧评估了13个mfcc值但是有些值是负数,我很困惑我所关注的过程是对还是错。目前我正在使用JAudio提供的代码。我也尝试了其他代码,它们也给了我负值。

其次,每帧得到13个系数,考虑到一定长度的样本157帧,我得到157组13 mfccs。我很难如何使用DTW中的所有系数,因为dtw仅给出两个时间信号之间的最近距离。我有DTW代码来比较两个时间信号。我不确定如何使用信号的所有mfccs值作为特征。

我缺少一些关键的分类步骤吗?请帮帮我。

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

假设第一个信号有N1组13个MFCC,第二个信号有N2组MFCC。 您应该计算第一个信号中每个 set 的距离和第二个信号中的每个 set 之间的距离(您可以使用Euclidian Distance表示两个之间的距离13-大小的数组)

这将为您留下一个N1xN2二维数组,您现在应该应用DTW。

答案 2 :(得分:0)

使用DTW假设您要验证2个音频序列。因此,对于要验证的序列,您将具有矩阵M1xN,对于查询M2xN。这意味着您的成本矩阵将为M1xM2。

要构建成本矩阵,您必须在序列之间应用距离/成本度量,因为cost(i,j)= your_chosen_multidimension_metric(M1 [i,:],M2 [j,:])

结果成本矩阵为2D,您可以轻松应用DTW。

我为基于MFCC的DTW编写了类似的代码。下面是Python的实现,它可以还原DTW得分; x和y是语音序列的MFCC矩阵,尺寸为M1xN和M2xN:

def my_dtw (x, y):
    cost_matrix = cdist(x, y,metric='seuclidean')
    m,n = np.shape(cost_matrix)
    for i in range(m):
        for j in range(n):
            if ((i==0) & (j==0)):
                cost_matrix[i,j] = cost_matrix[i,j]

            elif (i==0):
                cost_matrix[i,j] = cost_matrix[i,j] + cost_matrix[i,j-1]

            elif (j==0):
                cost_matrix[i,j] = cost_matrix[i,j] + cost_matrix[i-1,j]

            else:
                min_local_dist = cost_matrix[i-1,j]

                if min_local_dist > cost_matrix[i,j-1]:
                    min_local_dist = cost_matrix[i,j-1]

                if min_local_dist > cost_matrix[i-1,j-1]:
                    min_local_dist = cost_matrix[i-1,j-1]

                cost_matrix[i,j] = cost_matrix[i,j] + min_local_dist
    return cost_matrix[m-1,n-1]