我的目标是对我在java中使用mfcc和dtw的非语音信号进行分类。但是我被困在中间。我将不胜感激任何帮助。 我已经为每个帧评估了13个mfcc值但是有些值是负数,我很困惑我所关注的过程是对还是错。目前我正在使用JAudio提供的代码。我也尝试了其他代码,它们也给了我负值。
其次,每帧得到13个系数,考虑到一定长度的样本157帧,我得到157组13 mfccs。我很难如何使用DTW中的所有系数,因为dtw仅给出两个时间信号之间的最近距离。我有DTW代码来比较两个时间信号。我不确定如何使用信号的所有mfccs值作为特征。
我缺少一些关键的分类步骤吗?请帮帮我。
答案 0 :(得分:0)
结帐:http://code.google.com/p/aquila/ 具体来说:http://code.google.com/p/aquila/source/browse/trunk/examples/dtw_distance/main.cpp具有dtw distace计算的示例代码。
答案 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]