Я думаю, что это может быть потенциальная ошибка в finddelay
. Обратите внимание на этот отрывок из документации (выделено мной):
X
и Y
не обязательно должны быть точными задержанными копиями друг друга, поскольку finddelay(X,Y)
возвращает оценку задержки посредством взаимной корреляции. Однако эта предполагаемая задержка имеет полезное значение только в том случае, если существует достаточная корреляция между задержанными версиями X
и Y
. Также, если возможны несколько задержек, как в случае периодических сигналов, возвращается задержка с наименьшим абсолютным значением. В случае, если и положительная, и отрицательная задержка с одинаковым абсолютным значением возможно, возвращается положительная задержка.
Казалось бы, это означает, что finddelay(y, x)
должно возвращать 2
, тогда как на самом деле оно возвращает -4
.
РЕДАКТИРОВАТЬ:
Похоже, это проблема, связанная с ошибками с плавающей запятой, вызванными xcorr
, как я описываю в мой ответ на этот связанный вопрос. Если вы наберете type finddelay
в командном окне, вы увидите, что finddelay
использует xcorr
внутри. Даже когда входными данными для xcorr
являются целые значения, результаты (которые, как вы ожидаете, также должны быть целыми значениями) могут в конечном итоге содержать ошибки с плавающей запятой, из-за которых они будут немного больше или меньше целочисленного значения. Затем это может изменить индексы, в которых будут расположены максимумы. Решение состоит в том, чтобы округлить вывод от xcorr
, когда вы знаете, что все ваши входные данные являются целыми значениями.
Лучшей реализацией finddelay
для целочисленных значений может быть что-то вроде этого, что фактически вернет задержку с наименьшим абсолютным значением:
function delay = finddelay_int(x, y)
[d, lags] = xcorr(x, y);
d = round(d);
lags = -lags(d == max(d));
[~, index] = min(abs(lags));
delay = lags(index);
end
Однако в своем вопросе вы просите вернуть положительные задержки, которые не обязательно будут наименьшими по абсолютному значению. Вот другая реализация finddelay
, которая правильно работает для целочисленных значений и отдает предпочтение положительным задержкам:
function delay = finddelay_pos(x, y)
[d, lags] = xcorr(x, y);
d = round(d);
lags = -lags(d == max(d));
index = (lags <= 0);
if all(index)
delay = lags(1);
else
delay = lags(find(index, 1)-1);
end
end
И вот различные результаты для вашего тестового примера:
>> x = [0 0 1 2 2 2 0 0 0 0];
>> y = [1 2 2 2 0 0 1 2 2 2];
>> [finddelay(x, y) finddelay(y, x)] % The default behavior, which fails to find
% the delays with smallest absolute value
ans =
4 -4
>> [finddelay_int(x, y) finddelay_int(y, x)] % Correctly finds the delays with the
% smallest absolute value
ans =
-2 2
>> [finddelay_pos(x, y) finddelay_pos(y, x)] % Finds the smallest positive delays
ans =
4 2
person
gnovice
schedule
20.11.2017
2
, сравнивая задержку междуy
иx
...? если вы сделаете+2
для каждого индексаy
, вы не получитеx
- person Dadep   schedule 20.11.2017