我有两个信号,我们称之为'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目前还没有合作。
除了互相关之外,还有更准确的方法来计算延迟,还是有办法改善互相关的结果?
答案 0 :(得分:7)
Cross-correlation通常是确定两个信号之间时滞的最简单方法。峰值位置表示两个信号最相似的时间偏移。
%// Normalize signals to zero mean and unit variance
s1 = (signal1 - mean(signal1)) / std(signal1);
s2 = (signal2 - mean(signal2)) / std(signal2);
%// Compute time lag between signals
c = xcorr(s1, s2); %// Cross correlation
lag = mod(find(c == max(c)), length(s2)) %// Find the position of the peak
请注意,必须首先将两个信号归一化到相同的能量水平,以便结果不会有偏差。
顺便说一句,不要使用diff
作为变量的名称。在MATLAB中已经有一个built-in function具有相同的名称。
答案 1 :(得分:3)
答案 2 :(得分:1)
corr在向量(v1, v2)
之间找到一个点积。如果它对你的信号有效,我会尽量减少差异的平方和(即abs(v1 - v2)
)。
signal = sin(1:100);
signal1 = [zeros(1, 10) signal];
signal2 = [signal zeros(1, 10)];
for i = 1:length(signal1)
signal1shifted = [signal1 zeros(1, i)];
signal2shifted = [zeros(1, i) signal2];
d2(i) = sum((signal1shifted - signal2shifted).^2);
end
[fval lag2] = min(d2);
lag2
计算上比使用FFT可以加速的交叉计算更糟糕。据我所知,你不能用欧氏距离做到这一点。
UPD。删除了与周期性信号互相关的错误观点
答案 3 :(得分:0)
您可以在频域中尝试匹配过滤
function [corr_output] = pc_corr_processor (target_signal, ref_signal)
L = length(ref_signal);
N = length(target_signal);
matched_filter = flipud(ref_signal')';
matched_filter_Res = fft(matched_filter,N);
corr_fft = matched_filter_Res.*fft(target_signal);
corr_out = abs(ifft(corr_fft));
上面corr_out的匹配滤波器最大索引的峰值应该为您提供滞后量。