Arrays 在Matlab数组中查找图案开头的索引
我是Matlab新手,正在尝试执行一些基本功能。我有一个通过电脑扬声器播放的小声音文件和另一个包含录制音频的声音文件,其中包含我播放第一个音频文件的时间。在将每个文件作为数组加载到Matlab中之后,我对这两个文件使用xcorr,并将值存储为c。我想做的是得到c数组中的索引,它对应于播放小声音文件的大致时间。这是我的密码Arrays 在Matlab数组中查找图案开头的索引,arrays,matlab,audio,pattern-matching,Arrays,Matlab,Audio,Pattern Matching,我是Matlab新手,正在尝试执行一些基本功能。我有一个通过电脑扬声器播放的小声音文件和另一个包含录制音频的声音文件,其中包含我播放第一个音频文件的时间。在将每个文件作为数组加载到Matlab中之后,我对这两个文件使用xcorr,并将值存储为c。我想做的是得到c数组中的索引,它对应于播放小声音文件的大致时间。这是我的密码 [tone,fs] = audioread('Tone1.wav'); [recording,fs] = audioread('recording1.wav'); c = xc
[tone,fs] = audioread('Tone1.wav');
[recording,fs] = audioread('recording1.wav');
c = xcorr(tone, recording);
上面是c。我觉得在这个模式开始的数组c中查找索引应该非常简单,但我不知道语法。提前感谢。尝试使用find(C)
功能
它将返回C中不等于零的任何元素的索引。然后,您应该能够使用返回的第一个索引(从C绘图的外观来看,假设这是4.5 x 10^4)
然后,您可以通过将采样频率(通常为44000 Hz)除以4.5 x 10^4来计算信号播放的时间
当然,只有当第一个~4.4 x 10^4个样本都等于零时,这才有效。如果不是这样,那么可以使用数组C上的条件创建一个二进制数组,然后对该二进制数组调用find()
以下示例将给出信号超过某个阈值(本例中为0.5)的索引
位置由最大互相关确定。但是,使用
xcorr
可能会很棘手,因为根据its,最短信号(音调
)将被零填充,因此其长度将被改变
我建议您使用conv
(卷积)而不是xcorr
。如果时间反转音调
,卷积的结果是相同的,并且使用conv
的优点是它允许有效
选项(参见its),这避免了零填充,因此允许您直接读取最大值的时间位置
例如:
>> 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
>> 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