Вам нужно будет интерполировать сигнал 125 Гц, чтобы получить 500 Гц. Это зависит от того, какое качество интерполяции вам нужно. Для линейной интерполяции scipy.signal.interp1d
в режиме линейной интерполяции немного медленнее, O (log n) для n точек данных, потому что он выполняет поиск пополам для каждой оценки. Время вычисления резко возрастает, если вы попросите его выполнить плавную интерполяцию на большом наборе данных, потому что это включает решение системы из 3n уравнений с 3n неизвестными.
Если ваши частоты дискретизации имеют целочисленное отношение ваш пример), вы можете выполнять линейную интерполяцию более эффективно следующим образом:
# interpolate a125 to a500
n = len(a125)
a500 = np.zeros((n-1)*4+1)
a500[0::4] = a125
a500[1::4] = 0.75*a125[:-1] + 0.25*a125[1:]
a500[2::4] = 0.5*a125[:-1] + 0.5*a125[1:]
a500[3::4] = 0.25*a125[:-1] + 0.75*a125[1:]
Если вам нужна плавная интерполяция, используйте scipy.signal.resample
. Этот метод Фурье потребует тщательной обработки конечных точек вашего временного ряда; вам нужно дополнить его данными, которые делают постепенный переход от конечной точки обратно к начальной точке:
from scipy.signal import resample
m = n//8
padding = np.linspace(a125[-1], a125[0], m)
a125_pad = np.concatenate([a125, padding])
a500b = resample(a125_pad, (n+m)*4)[:4*n]
В зависимости от характера ваших данных, может быть лучше иметь непрерывную производную в конечные точки.
Обратите внимание, что БПФ, которое используется для повторной выборки, предпочитает иметь размер массива, который является произведением небольших простых чисел (2, 3, 5, 7). Выбирайте размер отступа (m
) с умом.