在另一个信号中查找子信号



假设我们有一个信号,例如:

x = [1 2 9 16 18 19 18 16 9 7 4 2 1 1 0 0];

我们想找到信号的位置:

y = [10 8 4 3 1];

接近[9 7 4 2 1],在本例中为 n = 9 .

你怎么能去找n

回答原始问题:
要找到确切的子向量,您可以使用findstr

n = findstr(y, x)

对修订后的问题的答复:
要找到最接近匹配的子信号,可以使用conv2

M = conv2(A(:), flipud(B(:)), 'valid');
NA = conv2(A(:) .^ 2, ones(size(B(:))), 'valid');
NB = round(norm(B(:)) ^ 2);
D1 = abs(NA - NB);
D2 = abs(M .^ 2 - NA * NB);
idx = find(D1 == min(D1));
n = idx(find(D2(idx) == min(D2(idx)), 1))

这依赖于一个经验指标,该指标同时考虑了振幅和能量相关性。
在大多数情况下,它的工作原理非常准确。在此示例中,它正确生成:

n =
    9

正如你所说,你需要使用某种成本或似然函数。这是一个 for 循环开始,我会让你自己找到成本函数:

x = [1 2 9 16 18 19 18 16 9 7 4 2 1 1 0 0];
y = [10 7 4 3 1];
cor = 9999;
n=0;
for i=1:(length(x)-length(y))
    % Complete this line to check if x matches y at this point
    score = SomeFunctionChecking( x(i : (i+length(y)-1) ),  y ));
    if (score < cor)
        cor = score;
        n = i;
    end
end
display(n);

最新更新