【问题标题】:Find the index of the start of a pattern in Matlab array在 Matlab 数组中查找模式开始的索引
【发布时间】:2013-11-25 19:54:21
【问题描述】:

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

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

上面是c的图。我觉得在数组 c 中找到该模式开始的索引应该非常简单,但我不知道语法。提前致谢。

【问题讨论】:

    标签: arrays matlab audio pattern-matching


    【解决方案1】:

    位置由最大互相关确定。但是,使用 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
    

    【讨论】:

      【解决方案2】:

      尝试使用find(C) 函数。

      它将返回 C 中任何不等于 0 的元素的索引。然后,您应该能够使用返回的第一个索引(从 C 图中的外观来看,可以说这是 4.5 x 10^4)。

      然后您可以通过将 4.5 x 10^4 除以采样频率(通常为 44000 Hz)来计算信号播放的时间。

      当然,这仅在前 ~4.4 x 10^4 样本都等于 0 时才有效。如果不是这种情况,那么您可以使用数组 C 的条件创建一个二进制数组,然后对该二进制数组调用 find()。

      以下示例将为您提供信号超过某个阈值(在本例中为 0.5)的索引。

      binArray = C > 0.5;
      nonZeroIndx = find(binArray);
      firstExceedingThreshInC = nonZeroIndx(1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-08
        相关资源
        最近更新 更多