找到两个信号之间的差异

Kyl*_*yle 3 matlab signal-processing

我有两个信号,我们称之为'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));
Run Code Online (Sandbox Code Playgroud)

然而,该函数的结果是周期波,而不是随机噪声,因此滞后必须仍然是关闭的.我会发布情节的图像,但imgur目前还没有合作.

除了互相关之外,还有更准确的方法来计算滞后,还是有办法改善互相关的结果?

Eit*_*n T 7

互相关通常是确定两个信号之间时滞的最简单方法.峰值的位置表示两个信号最相似的时间偏移.

%// 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
Run Code Online (Sandbox Code Playgroud)

请注意,必须首先将两个信号归一化到相同的能量水平,以便结果不会有偏差.

顺便说一句,不要diff用作变量的名称.MATLAB中已经有一个同名的内置函数.