Производные Савицкого-Голея, вычисленные с помощью SciPy signal.savgol_filter, нужно масштабировать? - PullRequest
3 голосов
/ 06 мая 2020

Я вычисляю первую и вторую производные сигнала, а затем строю график. Я выбрал фильтр Савицкого-Голея, реализованный в 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)

1 Ответ

1 голос
/ 06 мая 2020

Под капотом signal.savgol_filter использует signal.savgol_coeffs, если вы посмотрите исходный код , он говорит, что "Коэффициент, присвоенный y [производная], масштабирует результат, чтобы учесть порядок производной и расстояние между образцами ". Результаты могут быть масштабированы перед выполнением настройки и convolve1d. Таким образом, по умолчанию кажется, что результаты уже масштабированы с учетом порядка производных.

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

...