Алгоритм сопоставления зависимых от времени (1D) сигналов

Мне было интересно, может ли кто-нибудь указать мне на алгоритм/метод, который используется для сравнения сигналов, зависящих от времени. В идеале этот гипотетический алгоритм будет принимать в качестве входных сигналов 2 сигнала и возвращать число, которое будет представлять собой процентное сходство между сигналами (0 состоит в том, что 2 сигнала статистически несвязаны, а 1 - то, что они идеально подходят).

Конечно, я понимаю, что есть проблемы с моим запросом, а именно, что я не уверен, как правильно определить "сходство" в контексте сравнения этих двух сигналов, поэтому, если кто-то может указать мне в правильном направлении (в отношении того, что я должен искать/знать и т.д.), я был бы признателен также.

Ответ 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, означает, что один сигнал является фильтрованной версией другой.

Ответ 2

Общее решение: вы можете скомпоновать данные на гистограммах и использовать тест с квадратным квадратом или тест Коломогорова.

Оба явно предназначены для оценки шансов, что два распределения представляют собой случайные выборки из одного и того же распределения подкласса (то есть: имеют ту же форму в пределах статистики).

Я не знаю, как скомплектовывается реализация, но ROOT обеспечивает реализацию на С++ обоих:

Я считаю, что документы также указывают на некоторые документы.


Я думаю, что CERNLIB предоставляет оба алгоритма в fortran77, которые вы можете связать с c. Перевод кода ROOT может быть проще.

Ответ 3

Вы можете попробовать Быстрое преобразование Фурье (искать БПФ в Википедии, есть библиотеки с открытым исходным кодом для выполнения преобразований).

БПФ преобразуют ваши данные из временной области (т.е. импульс в 1 с, 2 с, 3 с, 4 с...) в данные в частотной области (т.е. импульс каждую секунду).

Затем вы можете легче сравнивать частоты и их относительные силы. Это должен быть шаг в правильном направлении для вас.

Ответ 4

Dynamic Time Warping - это подход, который вы можете использовать, если сигналы должны соответствовать ускорению и замедлению времени на разных позициях.

Ответ 5

Я не знаю обработки сигнала, так что это предположение..:

Является ли ваш сигнал эффективным списком упорядоченных пар (x,y), где x - это время и y амплитуда? Если это так, то, возможно, вы можете отбросить временную координату - например:

Signal 1: [(x0,y0), (x1,y1), (x2,y2), (x3,y3), ...]
Signal 2: [(x0,z0), (x1,z1), (x2,z1), (x3,z3), ...]

Время отбрасывания:

Signal 1: [y0, y1, y2, y3, ...]
Signal 2: [z0, z1, z2, z3, ...]

Затем вы можете сравнить амплитуды друг с другом, возможно, выбрав correlation. Возможно, вы могли бы построить y против z:

Comparing: [(y0,z0), (y1,z1), (y2,z2), (y3,z3), ...]

Или вычислить один из различных коэффициентов корреляции.

Ответ 6

Вы не говорите очень много о том, что такое сигналы, и какая мера "идентичности" была бы значимой для вас. Но если сигналы синфазны (т.е. Вы хотите сравнить два сигнала мгновенно, и не будет никакой задержки времени, чтобы рассмотреть), то я бы предложил вам посмотреть на коррелятор Пирсона. Это дает вам значение 1, если два сигнала идентичны, значение 0, если они совершенно разные, и что-то среднее между ними, если они похожи на рифму. В качестве дополнительного преимущества Пирсону все равно, если сигналы усиливаются по-разному (за исключением того, что один сигнал является обратным для другого, он дает результат -1).

Это похоже на то, что вы ищете?

http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient