Вы можете реализовать подвыборку вручную, я просто набросаю 1d для простоты. Предположим, вы хотите отбирать s = d * f на регулярной подсерии с интервалом k. Тогда ваш n-й образец будет s_nk = sum_i = 0^10 f_i d_nk-i. Здесь нужно заметить, что индексы f и d всегда суммируются с кратным k. Это предполагает разбиение его на субавы s_nk = sum_j = 0^k-1 sum_i = 0^10/k f_j + ik d_-j + (n-i) k. Итак, что вам нужно сделать: subample d и f на сетках с интервалом k при всех смещениях 0, ..., k-1. Сверните все пары подвыборных d и f, смещения которых суммируются до 0 или k и добавляют результаты.
Вот код для 1d. Это примерно реализует вышеизложенное, только сетки расположены немного по-другому, чтобы упростить управление индексами. Вторая функция делает это глупо, т. Е. Вычисляет полную свертку и затем уничтожает. Он предназначен для тестирования первой функции.
import numpy as np
from scipy import signal
def ss_conv(d1, d2, decimate):
n = (len(d1) + len(d2) - 1) // decimate
out = np.zeros((n,))
for i in range(decimate):
d1d = d1[i::decimate]
d2d = d2[decimate-i-1::decimate]
cv = signal.convolve(d1d, d2d, 'full')
out[:len(cv)] += cv
return out
def conv_ss(d1, d2, decimate):
return signal.convolve(d1, d2, 'full')[decimate-1::decimate]
Edit: 2d версия:
import numpy as np
from scipy import signal
def ss_conv_2d(d1, d2, decy, decx):
ny = (d1.shape[0] + d2.shape[0] - 1) // decy
nx = (d1.shape[1] + d2.shape[1] - 1) // decx
out = np.zeros((ny, nx))
for i in range(decy):
for j in range(decx):
d1d = d1[i::decy, j::decx]
d2d = d2[decy-i-1::decy, decx-j-1::decx]
cv = signal.convolve2d(d1d, d2d, 'full')
out[:cv.shape[0], :cv.shape[1]] += cv
return out
def conv_ss_2d(d1, d2, decy, decx):
return signal.convolve2d(d1, d2, 'full')[decy-1::decy, decx-1::decx]
Ваш фильтр будет расти с образами? В этом случае вы можете попробовать и посмотреть в [fftconovolve] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.fftconvolve.html), потому что IIRC в отличие от многих других программ для численных вычислений scipy doesn ' t используйте значение fft по умолчанию. Конечно, если ваш фильтр останется в 10x10, это не принесет вам многого, если вообще что-нибудь. –
Мой фильтр останется прежним. Я действительно переехал в fftconvolve. И это действительно быстро (2X для моих целей). Однако у него тоже нет опции для подвыборки – GKS
Я добавил некоторый код в A. Только 1d, я боюсь, но должен быть простым для обобщения. Взгляни. –