Если скользящее окно будет работать, вы, вероятно, делаете взаимную корреляцию , и в этом случае вы можете использовать FFT , чтобы решить вашу проблему быстрее с коэффициентом O ((n / log (n)).
Так что, если у вас есть вектор V и корпус из C других векторов, и все векторы имеют размер N, тогда решение скользящего окна будет принимать O (N ^ 2 *В) времяИспользуя БПФ, вы можете уменьшить одно скользящее окно с O (N ^ 2) до O (N log N), поэтому общее время будет равно O (CN log N).
Если вы не знакомыс БПФ тогда вам, вероятно, придется прочитать их перед использованием, но общая идея такова:
# If you forget to take the complex conjugate of V you'll be doing a
# convolution instead of a correlation
V' := Fft(Conjugate(V))
for each vector W in C:
W' := Fft(W)
P := W' * V' # Multiplication here is the dot product
R := inverse_Fft(P)
# Check through the vector R for any spikes, a large value at
# R[i] indicates that if you shift W' by i then it will
# correlate strongly with W
Предостережения:
1) Если вы вообще делаете корреляциивам нужно нормализовать свои векторы или, по крайней мере, сделать что-то, чтобы убедиться, что вы не получите ложных срабатываний от векторов, значения которых просто больше и более положительны, чем другие векторы.Если у вас типичный случай поиска сигнала в шуме, то все в порядке.
2) БПФ коррелируют в предположении, что все эти сигналы являются круговыми.Если вы не хотите обращаться с ними как с круглыми, то вам нужно добавить буфер 0 в конец каждого вектора, чтобы удвоить его длину.