我是Matlab的新手,正在尝试执行一些基本功能。我有一个小的声音文件,我在我的电脑的扬声器上播放,另一个声音文件包含录制的音频,包含我播放第一个音频文件的时间。将每个文件作为数组加载到Matlab后,我在两个文件上使用xcorr并将值存储为c。我想要做的是获取c数组中的索引,该索引对应于播放小声音文件的大致时间。这是我的代码。
[tone,fs] = audioread('Tone1.wav');
[recording,fs] = audioread('recording1.wav');
c = xcorr(tone, recording);
以上是c的情节。我觉得应该非常直接地在数组c中找到该模式开始的索引,但我不知道语法。提前谢谢。
答案 0 :(得分:0)
尝试使用find(C)
功能。
它将返回C中任何不等于零的元素的索引。然后你应该能够使用返回的第一个索引(从你的C图的外观,我们只能说这是4.5 x 10 ^ 4)。
然后你可以通过将4.5 x 10 ^ 4除以采样频率来计算信号播放的时间(通常为44000 Hz)。
当然,只有当第一个~4.4 x 10 ^ 4个样本都等于零时才会有效。如果不是这种情况,那么您可以使用数组C上的条件创建二进制数组,然后在该二进制数组上调用find()。
以下示例将为您提供信号超过某个阈值的索引(在本例中为0.5)。
binArray = C > 0.5;
nonZeroIndx = find(binArray);
firstExceedingThreshInC = nonZeroIndx(1);
答案 1 :(得分:0)
该位置由最大互相关决定。但是,使用xcorr
进行此操作可能会非常棘手,因为根据其doc,最短信号(tone
)将被填零,因此其长度将被更改。
我建议您使用conv
(卷积)代替xcorr
。如果您时间反转tone
,则卷积的结果是相同的,并且使用conv
的优势在于它允许valid
选项(请参阅其doc),这可以避免零填充因此允许您直接读取最大值的时间位置。
示例:
>> tone = sin(2*pi*linspace(1,8,1000));
>> recording = [zeros(1,1e4) tone zeros(1,5e4) ];
>> c = conv(recording, tone(end:-1:1), 'valid');
>> [~, pos] = max(c)
pos =
10001