Обработка сигналов в Python. Найти сдвиг в данных серии

У меня есть такие данные:[1,3,3,....1] ~ 500 номеров.

Каждые 1 мс я получаю новый, но с некоторым сдвигом (5-10 баллов)+ небольшой шум.

E.g:
 [1 2 3 4 3 21 4 5...]
 [0 4 3 1 2  3 4 19 7 5 ...] 

В этом случае сдвиг равен 3.

Я хочу знать этот сдвиг. Как я могу получить это?

Путь Фурье заключается в замедлении.. Потому что у меня много строк в секунду. найти сдвиг во времени между двумя одинаковыми формами волны

Может быть, есть несколько быстрых способов? Или, может быть, я должен использовать Фурье только для части моих данных (потому что они смещаются примерно как целое). Большое спасибо.

1 ответ

Если вы знаете, что задержка составляет всего несколько выборок 5-10, то вы можете использовать автокорреляцию, чтобы найти ее. Это должно быть быстро, если вы рассчитываете это только для этого ограниченного небольшого диапазона лагов. Если вы рассчитаете его для всех возможных лагов, то, скорее всего, он будет очень медленным.

Вот пример, где использовался модифицированный алгоритм AMDF:

import numpy as np

def modified_amdf(x1, x2, steps):
    N = min(len(x1), len(x2))
    res = []
    for step in steps:
        sm = 0
        for n in range(0, N - step):
            sm += np.abs(x1[n] - x2[n + step])
        sm = sm * (1.0 / (N - step - 1))
        res.append(sm)
    return res

#x1 = [1, 2, 3, 4, 3, 21, 4, 5]
#x2 = [0, 4, 3, 1, 2, 3, 4, 19, 7, 5]
x1 = np.sin(np.linspace(0, 10*np.pi, 500))
x2 = np.r_[[0,0], x1]  # add two lag entries
penalties = modified_amdf(x1, x2, range(5))
print "Found lag:", np.argmin(penalties)

Вы можете немного улучшить скорость, если вы измените расчеты, чтобы они использовали только numpy, но это займет много времени, всего 500 выборок для нескольких лагов.

Другие вопросы по тегам