У меня есть два сигнала, назовем их «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 не будет работать, потому что он начнется с сравнения сигнала1 с только частью сигнала2, который будет дополнен нулями (или может быть дополнен последним значением, но это по-прежнему не является хорошим способом сравнения двух сигналов). Вероятно, вам следует сравнить сегмент сигнала с более крупным сигналом, а затем определить, где вспомогательный сигнал лежит в большем сигнале. Кроме того, вы переписываете «длину» встроенную функцию и без необходимости формируете t и tx. – Justin
@jucestain Я не думаю, что это правильно. Единственное, что мы рассматриваем с помощью кросс-корреляции, это его макс, поэтому эти нули в начале не будут иметь эффекта. И я знаю, что эти функции прекрасно работают, когда сигнал используется против самого себя. –
Вы пробовали смотреть на всю корреляцию, а не на ее максимум? Если вы имеете дело с реальными шумовыми сигналами, существует вероятность того, что ваш сдвиг в реальном времени не даст максимальной корреляции. –