gpt4 book ai didi

matlab - 找出两个信号之间的差异

转载 作者:太空宇宙 更新时间:2023-11-03 20:11:09 25 4
gpt4 key购买 nike

我有两个信号,我们称它们为“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 目前不合作。

有没有比互相关更准确的计算滞后的方法,或者有没有办法改进互相关的结果?

最佳答案

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 作为变量的名称。已经有一个 built-in function在 MATLAB 中使用相同的名称。

关于matlab - 找出两个信号之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15371577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com