我正在计算信号的第一和第二导数,然后绘制。我选择了在SciPy (信号模块)中实现的Savitzky-Golay滤波器。我想知道是否需要缩放输出--在相同过滤器的Matlab实现中,需要对过滤器的输出进行缩放:
savitzkyGolayFilt(X,N,DN,F)使用Savitzky-Golay (多项式)滤波器对信号X进行滤波.多项式阶N必须小于帧大小,F和F必须是奇数。DN指定微分顺序(DN=0是平滑的)。如果DN高于零,则必须将输出缩放1/T^DN,以获得输入X的DNth平滑导数,其中T是采样间隔。
然而,我在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)
发布于 2020-05-06 12:18:45
在signal.savgol_filter
下,使用signal.savgol_coeffs
,如果你看一个源代码,它表示“分配给yderiv的系数缩放结果,以考虑导数的顺序和样本间距”。结果在进行拟合和convolve1d
之前进行了hance标度。因此,在默认情况下,考虑到衍生品的顺序,结果似乎已经得到了调整。
我认为在计算Savitzky-Golay滤波器之后执行导数不会给出相同的结果,因为在本例中,您正在计算已经滤波的频谱上的导数,而在第一种情况下,在进行拟合和缩放之前执行导数。
https://stackoverflow.com/questions/61631978
复制相似问题