Корреляция и согласованная фильтрация

Учимся находить известный образ внутри сигнала — основа радара, GPS и распознавания.

Корреляция измеряет похожесть двух сигналов при разных сдвигах. Согласованный фильтр — оптимальный способ обнаружить известную форму (шаблон) в зашумлённом сигнале.

Как радар находит самолёт? Как GPS-приёмник ловит спутник в шуме в миллионы раз сильнее сигнала? Как найти повтор в музыке или период в пульсе? Везде работает одна идея — корреляция: «сдвигаем шаблон вдоль сигнала и смотрим, где он лучше всего совпал». Это мощнейший детектор образов.

Взаимная корреляция: ищем шаблон

Взаимная корреляция скользит шаблоном t по сигналу и в каждой позиции считает «оценку совпадения» (сумму произведений). Где оценка максимальна — там шаблон нашёлся.

def cross_correlate(sig, t):
    out = []
    for i in range(len(sig) - len(t) + 1):
        score = sum(sig[i + j] * t[j] for j in range(len(t)))
        out.append(score)
    return out

signal = [0, 0, 1, 2, 3, 0, 0, 1, 2, 3, 0]   # шаблон [1,2,3] встречается дважды
template = [1, 2, 3]
scores = cross_correlate(signal, template)
print("Оценки совпадения:", scores)
print("Лучшее совпадение на индексе:", scores.index(max(scores)))

Вывод:

Оценки совпадения: [3, 8, 14, 8, 3, 3, 8, 14, 8]
Лучшее совпадение на индексе: 2

Максимальная оценка 14 — на индексах 2 и 7, ровно там, где в сигнале сидит шаблон [1,2,3]. Корреляция нашла образ, несмотря на нули и повторы вокруг.

Автокорреляция: ищем период

Автокорреляция — это корреляция сигнала с самим собой при разных сдвигах (лагах). Она выявляет скрытую периодичность: на лаге, равном периоду, сигнал «совпадает с собой» и даёт пик. Так находят высоту голоса (pitch) и периоды в данных.

import math

sig = [math.sin(2 * math.pi * n / 8) for n in range(32)]   # период = 8

def autocorr(x, lag):
    return round(sum(x[n] * x[n + lag] for n in range(len(x) - lag)), 2)

acs = [autocorr(sig, lag) for lag in range(10)]
print("Автокорреляция по лагам 0..9:", acs)
# первый положительный пик после лага 0
best = max(range(1, 10), key=lambda l: autocorr(sig, l))
print("Период сигнала:", best)

Вывод:

Автокорреляция по лагам 0..9: [16.0, 11.31, 0.5, -9.9, -14.0, -9.9, -0.5, 8.49, 12.0, 8.49]
Период сигнала: 8

На лаге 0 максимум (сигнал всегда совпадает с собой). Затем спад в минус (противофаза на лаге 4 — половина периода), и снова рост к пику на лаге 8 — это и есть период. Автокорреляция «нащупала» периодичность 8.

Согласованный фильтр

Согласованный (matched) фильтр — это и есть корреляция с шаблоном, оформленная как фильтр: его ядро — это перевёрнутый шаблон. Теория доказывает, что он даёт максимально возможное отношение сигнал/шум при обнаружении известной формы. Поэтому радар коррелирует эхо с излучённым импульсом, а GPS — принятый шум с известным кодом спутника. Даже если сигнал утонул в шуме, в точке совпадения корреляция даёт чёткий пик.

Как работает под капотом

Корреляция почти тождественна свёртке: corr(x, t) равна conv(x, перевёрнутый t). Разница лишь в развороте шаблона. Поэтому всё, что мы знаем о свёртке (включая быстрый расчёт через БПФ), применимо и к корреляции — длинные корреляции считают в частотной области за O(N log N). Почему согласованный фильтр оптимален? Он «концентрирует» всю энергию шаблона в один отсчёт выхода (в точке совпадения фазы складываются), тогда как случайный шум, не совпадающий с формой шаблона, складывается вразнобой и частично гасится. Чем длиннее и «уникальнее» шаблон, тем выше пик относительно шума — поэтому GPS использует длинные псевдослучайные коды: они дают острый, ни с чем не путаемый пик корреляции.

Частые ошибки

  • Не нормировать корреляцию. Сырая оценка растёт с амплитудой сигнала; для честного сравнения используют нормированную корреляцию (коэффициент от -1 до 1).
  • Путать корреляцию и свёртку. В корреляции шаблон НЕ переворачивается; для несимметричных шаблонов результат другой.
  • Брать слишком короткий шаблон. Короткий образ часто «случайно» совпадает с шумом; длинный уникальный шаблон даёт надёжный пик.

Итог

  • Корреляция измеряет похожесть сигналов при сдвигах; пик указывает на совпадение.
  • Автокорреляция выявляет период сигнала (пик на лаге, равном периоду).
  • Согласованный фильтр (корреляция с шаблоном) оптимально обнаруживает форму в шуме.
  • Корреляция = свёртка с перевёрнутым шаблоном, поэтому ускоряется через БПФ.
Проверьте себя
1. Что измеряет взаимная корреляция двух сигналов?
AИх сумму
BИх похожесть при разных взаимных сдвигах
CИх частоту
DИх длину
2. Что выявляет автокорреляция сигнала?
AАмплитуду
BСкрытый период (пик на лаге, равном периоду)
CФазу шума
DЧастоту дискретизации
3. Чем согласованный (matched) фильтр выделяется среди детекторов?
AОн самый быстрый
BОн даёт максимальное отношение сигнал/шум при обнаружении известной формы
CОн не требует шаблона
DОн работает только без шума
4. Как корреляция связана со свёрткой?
AЭто совершенно разные операции
BКорреляция = свёртка с перевёрнутым шаблоном
CКорреляция — это ДПФ свёртки
DСвязи нет