【发布时间】:2013-03-12 20:35:19
【问题描述】:
我有两个信号,我们称它们为“a”和“b”。但是,它们都是几乎相同的信号(从相同的输入记录并包含相同的信息),因为我在两个不同的“b”处记录了它们,它们的时间偏移量未知。很明显,每个都有随机噪声。
目前,我正在使用互相关来计算时间偏移,但是,我仍然得到不正确的结果。
这是我用来计算时移的代码:
function [ diff ] = FindDiff( signal1, signal2 )
%FINDDIFF Finds the difference between two signals of equal frequency
%after an appropritate time shift is applied
% Calculates the time shift between two signals of equal frequency
% using cross correlation, shifts the second signal and subtracts the
% shifted signal from the first signal. This difference is returned.
length = size(signal1);
if (length ~= size(signal2))
error('Vectors must be equal size');
end
t = 1:length;
tx = (-length+1):length;
x = xcorr(signal1,signal2);
[mx,ix] = max(x);
lag = abs(tx(ix));
shifted_signal2 = timeshift(signal2,lag);
diff = signal1 - shifted_signal2;
end
function [ shifted ] = timeshift( input_signal, shift_amount )
input_size = size(input_signal);
shifted = (1:input_size)';
for i = 1:input_size
if i <= shift_amount
shifted(i) = 0;
else
shifted(i) = input_signal(i-shift_amount);
end
end
end
plot(FindDiff(a,b));
但是,该函数的结果是周期波,而不是随机噪声,因此滞后必须仍然关闭。我会发布剧情的图片,但 imgur 目前不合作。
除了互相关之外,有没有更准确的方法来计算滞后,或者有没有办法改善互相关的结果?
【问题讨论】:
-
实际上,如果您要比较两个大小相同的信号,xcorr 将不起作用,因为它将首先将 signal1 与 signal2 的一部分进行比较,该部分将用零填充(或者可能用最后一个值,但这仍然不是比较两个信号的好方法)。您可能应该将信号段与较大的信号进行比较,然后确定子信号在较大信号中的位置。此外,您正在覆盖“长度”内置函数并不必要地形成 t 和 tx。
-
@jucestain 我不认为这是正确的。我们在互相关中唯一看到的是它的最大值,所以开头的那些零不会产生影响。而且我知道当信号被用于自身时,这些函数可以完美地工作。
-
您是否尝试过查看整个相关性而不仅仅是其最大值?如果处理现实世界的噪声信号,您的实时偏移可能不会产生最大相关性
-
@KyleRogers 了解互相关的工作原理。这是一个滑动点产品。如果您正在比较两个相同大小的向量,您认为它们将如何在开始或结束时进行比较?其中一个向量将被填充一些东西。从简要查看 xcorr 输出来看,它看起来像是用零填充向量之一。此外,当您说“开头的那些零不会产生影响”时,将使用这些值计算相关系数,因此它们无疑会产生影响,特别是因为您的实现不使用标准化。
-
@jucestain 我的代码实际上是完全正确的。我得到我认为不正确的结果的原因与仪器产生周期性噪声有关,而不是高斯噪声。