-1

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

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

4

2 回答 2

5

回答原始问题:
要找到确切的子向量,您可以使用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
于 2012-07-06T10:55:19.833 回答
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);
于 2012-07-06T11:08:30.570 回答