如何规范化音频文件,使数据的长度(行)相等?

时间:2018-03-13 04:40:54

标签: matlab signal-processing

我想用2个音频文件(每个音频文件说“ba a ta”)与matlab中的现有函数(称为动态时间扭曲(DTW))进行比较。在进行动态时间扭曲之前,我从matlab中提供的快速傅里叶变换(FFT)函数中得到一个数组/向量,到目前为止我的代码(我的matlab文件名:test.m):

fftRecording1 = fft(audioread('C:\Users\handy\Documents\MATLAB\my_recording_1.wav'));
fftRecording2 = fft(audioread('C:\Users\handy\Documents\MATLAB\fajar.wav'));
dist = dtw(fftRecording1, fftRecording2);

当我尝试DTW函数时,会出现错误,因为数组/向量2文件的长度(行)不同。错误讯息:

Error using dtw (line 82)
The number of rows between X and Y must be equal when X and Y are matrices

Error in test (line 3)
dist = dtw(fftRecording1, fftRecording2);

fftRecording1和fftRecording2变量的内容 variables fftRecording1 and fftRecording2

total row on fftRecording1

total row on fftRecording2

我的问题是:在进行FFT和DTW之前,如何逐步规范化以使长度(行)2个音频文件相等?还是有其他方法可以使数据长度(行)2个音频文件相等?

3 个答案:

答案 0 :(得分:1)

动态时间扭曲不需要输入序列具有相同的长度。 DTW实际上用于找到两个不同时间对齐序列之间的相似性。

答案 1 :(得分:1)

根据dtw's documentation

  

要拉伸输入,dtw会根据需要多次重复x和y的每个元素。如果x和y是矩阵,则dist通过重复它们的列来拉伸它们。在这种情况下,x和y必须具有相同的行数。

在您的情况下,您的列代表音频通道,行代表要对齐的数量(即dtw所期望的相反)。要根据dtw期望的内容设置输入,只需转置输入:

dist = dtw(transpose(fftRecording1), transpose(fftRecording2));

答案 2 :(得分:1)

不,他们不需要在时间相关的意义上具有相同的长度。它们需要具有相同数量的维度(2D信号,3D信号......),这相当于它们的数量或行数。 DTW的整个想法是匹配可能被拉伸到不同长度的类似内容 - 因此要求输入具有相同的长度绝对没有意义。

与您的问题相关:只需通过转换信号来调用dtw,您就会得到正确的结果。

dtw(signal1’, signal2’);

您应该在原始信号而不是傅里叶变换上应用DTW。 FFT将信号从时域转移到频域。因此,为了匹配signal2,不是为了使signal1变形,而是在DTW之前使用FFT时使频率变形。傅立叶变换的幅度取决于所考虑的FFT时间窗口中的点数。从我的观点来看,将DTW应用于傅立叶变换绝对毫无意义。