Я вычисляю первую и вторую производные сигнала, а затем строю график. Я выбрал фильтр Савицкого-Голея, реализованный в SciPy (сигнальный модуль). Мне интересно, нужно ли масштабировать вывод - в реализации того же фильтра в Matlab указано, что требуется масштабирование на выходе фильтра:
savitzkyGolayFilt (X, N, DN, F) фильтрует сигнал X, используя (полиномиальный) фильтр Савицки-Голея. Порядок полиномов N должен быть меньше размера кадра F и F должен быть нечетным. DN определяет порядок дифференцирования (DN = 0 - сглаживание). Если DN больше нуля, вам придется масштабировать вывод на 1 / T ^ DN, чтобы получить сглаженную производную DN-го входа X, где T - интервал выборки.
Однако I не нашел ничего похожего в документации SciPy. Кто-нибудь пробовал и знает, правильный ли вывод в Python и не требует дальнейшего масштабирования? Строка кода, которую я использую для первой производной, следующая: first_deriv = signal.savgol_filter(spectra_signal,sigma=7,2, deriv=1, delta=3.1966)
Spectra_signal - это моя переменная "y", а дельта - это вариация переменной "x".
Кроме того, я попытался вычислить первую производную без использования savgol_filter, но вместо этого использовал np.diff
на сглаженном сигнале (на основе формулы производная = dy / dx). first_deriv_alternative = np.diff(signal.savgol_filter(spectra_signal, sigma=7,2))/3.1966
. И результаты разные.
Пример рабочего кода:
import numpy as np
from scipy import signal
x =[405.369888, 408.561553, 411.753217, 414.944882, 418.136547, 421.328212, 424.519877, 427.711541, 430.903206]
y =[5.001440644264221191e-01,
4.990128874778747559e-01,
4.994551539421081543e-01,
5.002806782722473145e-01,
5.027571320533752441e-01,
5.053851008415222168e-01,
5.082427263259887695e-01,
5.122825503349304199e-01,
5.167465806007385254e-01]
#variation of x variable, constant step
sampling_step = x[1]-x[0]
#Method 1: using savgol_filter
deriv1_method1 = signal.savgol_filter(y,5,2,deriv=1, delta=sampling_step)
#Method 2: using np.diff to compute the derivative of the filtered original data
dy=np.diff(signal.savgol_filter(y, 5,2))
dx=np.diff(x)
deriv1_method2=dy/dx
#Method 3: filtering the first derivative of the original data
deriv1_method3=signal.savgol_filter((np.diff(y)/np.diff(x)), 5,2)