假设我们有一个信号,例如:
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
?
假设我们有一个信号,例如:
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);