Могучие умы, осветите мне тропинку.
Дано:
— Затухающая синусоида *(t)
— Задержка tau
Получить:
— Затухающую синусоиду y(t), задержанную на tau
— Рассчитать кросс–корреляцию между * и y
— Найти задержку из функции кросс–корреляции
Я вообще в математике не силен, а, откровенно говоря, почти ноль.
Нашел на hackchina.com нужный скрипт.
Разбираюсь в матлабе:
%Частота дискретизации:
fs=5000;
%Несущая частота:
fo=200;
%Шкала времени:
t=0:1/fs:1–1/fs;
%Затухающая синусоида:
*=sin(2*pi*fo*t).*exp(–20*t);
%Задержка:
tau = 400;
%Синусоида, задержанная на tau:
y=[zeros(1,tau) *(1:length(*)–tau)];
%Кросс–корреляция двух функций
xc=xcorr(*,y);
%Расчет задержки:
[a,delay]=max(xc);
delay = delay — fs
%Отрисовка графиков
subplot(311),plot(*)
subplot(312),plot(y)
subplot(313),plot(xc(1:fs))
При таком подходе получаю абсолютно верное значение задержки delay.
Но хоть убейте, не могу понять, почему, для получения верного значения задержки, мне надо из максимального значения кросс–корреляции вычитать частоту дискретизации.
В чем, вообще, соль?
loading...
Видать специфика матлаба он выдает вектор, в котором первый компонент кросскорреляция с максимальным сдвигом влево, а последний кросскорреляция с максимальным сдвигом вправо.
В твоем случае максимальный сдвиг в точности равен частоте fs (но это просто потому что векторы такой длины получились).
Поэтому xc(fs) это кросскорреляция со сдвигом 0, а xc(fs+delay) кросскорреляция с правильным сдвигом.
Попробовал в Scilab, в нем аналогичная функция corr работает подругому и не надо было бы ничего вычитать.
потому что delay это не значение а индекс максимального значения xc. вычитая fs ты вычитаешь одну секунду(единицу времени). Функция max выдает два значения a максимальное значение кросскорреляции, и delay индекс этого максимального значения.
похоже, что мне становится ясна глубина непонимания этих процессов )
корректно вообще при таком раскалде называть fs частотой дискретизации?
функции заданы на интервале [0,1), а матлаб рисует график от 0 до 5000. почему так?
пардонте.. со вторым вопрос понятно, это никакие не функции, а просто векторы.
с первым пока нет
к примеру у тебя есть датчик который 5000 раз в секунду пишет положение какой нибудь фигни. Чистота дискретизации 5 кГц или 5000. За секунду пишется 5000 значений. Делэй 400 это 400/5000 = 0.08 секунд.
теперь ясно, спасибо! буду дальше двигаться
спрашивай