在Matlab数组中找到模式开始的索引

时间:2013-11-24 23:59:10

标签: arrays matlab audio pattern-matching

我是Matlab的新手,正在尝试执行一些基本功能。我有一个小的声音文件,我在我的电脑的扬声器上播放,另一个声音文件包含录制的音频,包含我播放第一个音频文件的时间。将每个文件作为数组加载到Matlab后,我在两个文件上使用xcorr并将值存储为c。我想要做的是获取c数组中的索引,该索引对应于播放小声音文件的大致时间。这是我的代码。

[tone,fs] = audioread('Tone1.wav');
[recording,fs] = audioread('recording1.wav');
c = xcorr(tone, recording);

enter image description here

以上是c的情节。我觉得应该非常直接地在数组c中找到该模式开始的索引,但我不知道语法。提前谢谢。

2 个答案:

答案 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