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

时间:2012-07-06 10:39:25

标签: matlab signals signal-processing

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

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

2 个答案:

答案 0 :(得分:4)

回答原始问题:
要查找完全子向量,您可以使用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

答案 1 :(得分:4)

正如您所说,您需要使用某种成本或可能性函数。这是一个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);