Ответ 1
Функция кросс-корреляции - это классическое решение для обработки сигналов. Если у вас есть доступ к Matlab, см. Функцию XCORR. max(abs(xcorr(Signal1, Signal2, 'coeff')))
даст вам именно то, что вы ищете, и эквивалент существует и на Python.
Кросс-корреляция предполагает, что "сходство", которое вы ищете, является мерой линейной зависимости между двумя сигналами. Определение для вещественных сигналов конечной длины с временным индексом n = 0..N-1
:
C[g] = sum{m = 0..N-1} (x1[m] * x2[g+m])
g
работает от -N..N
(вне этого диапазона произведение внутри суммы равно 0).
Хотя вы просили номер, функция довольно интересная. Область функций g
называется областью лага.
Если x1
и x2
связаны временным сдвигом, функция взаимной корреляции будет иметь свой пик при отставании, соответствующем сдвигу. Например, если бы у вас были x1 = sin[wn]
и x2 = sin[wn + phi]
, поэтому две синусоидальные волны на одной и той же частоте и в другой фазе, функция взаимной корреляции имела бы свой пик при запаздывании, соответствующем фазовому сдвигу.
Если x2
- масштабированная версия x1
, кросс-корреляция также будет масштабироваться. Вы можете нормализовать функцию до коэффициента корреляции, разделив ее на sqrt(sum(x1^2)*sum(x2^2))
и введя ее в 0..1
, взяв абсолютное значение (эта строка Matlab имеет эти операции).
В более общем плане ниже приведено краткое описание того, какая взаимная корреляция является хорошей/плохой.
Кросс-корреляция хорошо работает для определения того, является ли один сигнал линейно связан с другим, то есть, если x2(t) = sum{n = 0..K-1}(A_n * x1(t + phi_n))
где x1(t)
и x2(t)
- соответствующие сигналы, A_n
- коэффициенты масштабирования, а phi_n
- сдвиги во времени. Последствия этого:
- Если один сигнал является сдвинутым во времени вариантом другого
(phi_n <> 0 for some n)
, функция взаимной корреляции будет отличной от нуля. - Если один сигнал является масштабированной версией другого
(A_n <> 0 for some n)
, функция взаимной корреляции будет отличной от нуля. - Если один сигнал представляет собой комбинацию масштабированных и сдвинутых по времени версий другой (оба
A_n
иphi_n
не равны нулю для некоторого числа n), функция взаимной корреляции будет отличной от нуля. Обратите внимание, что это также определение линейного фильтра.
Чтобы получить более конкретный, предположим, что x1
является широкополосным случайным сигналом. Пусть x2=x1
. Теперь нормализованная функция взаимной корреляции будет ровно 1 при g = 0 и около 0 всюду. Пусть теперь x2
- (линейно) отфильтрованный вариант x1
. Функция взаимной корреляции будет отличной от нуля около g=0
. Ширина ненулевой части будет зависеть от ширины полосы фильтра.
Для периодического периодического случая x1
и x2
используется информация о фазовом сдвиге в исходной части ответа.
Если взаимная корреляция будет не помогать, если два сигнала не связаны линейно. Например, два периодических сигнала на разных частотах не связаны линейно. Также не два случайных сигнала, получаемых из широкополосного случайного процесса в разное время. Также нет двух сигналов, похожих по форме, но с разным индексом времени - это похоже на неравный основной случай частоты.
Во всех случаях, нормализуя функцию взаимной корреляции и глядя на максимальное значение, вы скажете, являются ли сигналы потенциально линейно связанными - если число мало, например, в 0,1, мне было бы удобно объявить их несвязанными. Это выше, и я изучал его более тщательно, рисуя как нормализованные, так и ненормализованные функции взаимной корреляции и глядя на структуру. Периодическая кросс-корреляция подразумевает, что оба сигнала являются периодическими, а функция взаимной корреляции, которая заметно выше около g=0
, означает, что один сигнал является фильтрованной версией другой.