什么是MATLAB的Python等价物';s斯戈莱(k,f)?

什么是MATLAB的Python等价物';s斯戈莱(k,f)?,python,matlab,scipy,Python,Matlab,Scipy,我在MATLAB中有一个函数 [b,g] = sgolay(k, f); 它输出一个f×f矩阵 当我在Python中对相同的k和f值运行相同的函数时,使用: scipy.signal.savgol_coeffs(f, k) 它只输出一个完全不同的f元素数组 考虑的价值是: k=4,f=21 savol\u filter()接受三个参数,包括数组,而sgolay()只接受两个参数。此外,savo_系数没有生成所需的矩阵 在matlab中,获取sgolay(k,f)生成的矩阵的Python等价物

我在MATLAB中有一个函数

[b,g] = sgolay(k, f);
它输出一个f×f矩阵

当我在Python中对相同的k和f值运行相同的函数时,使用:

scipy.signal.savgol_coeffs(f, k)
它只输出一个完全不同的f元素数组

考虑的价值是:

k=4,f=21

savol\u filter()
接受三个参数,包括数组,而
sgolay()
只接受两个参数。此外,
savo_系数
没有生成所需的矩阵


在matlab中,获取sgolay(k,f)生成的矩阵的Python等价物是什么?

如果您检查matlab函数返回的矩阵
b
,您将看到中心行与SciPy的
savgol\u coefs
返回的一维数组相同。
b
的上半部分和下半部分,每个部分中有
(framelen-1)/2行
,是应用于信号端部的Savitzky-Golay滤波器的系数,其中滤波器是不对称的。也就是说,对于信号每一端的
(framelen-1)/2
值,使用不同的系数集计算每个滤波值

您可以使用
savgol_coefs
通过迭代
pos
参数来生成
b
。下面的ipython会话显示了一个示例

In [74]: import numpy as np

In [75]: from scipy.signal import savgol_coeffs

In [76]: np.set_printoptions(precision=11, linewidth=90)

In [77]: order = 3

In [78]: windowlen = 5
这些是对称(即居中)Savitzky-Golay滤波器的系数。一维数组应与sgolay返回的矩阵的中心行匹配:

In [79]: savgol_coeffs(windowlen, order)
Out[79]: array([-0.08571428571,  0.34285714286,  0.48571428571,  0.34285714286, -0.08571428571])
In [80]: savgol_coeffs(windowlen, order, pos=windowlen-1)
Out[80]: array([ 0.98571428571,  0.05714285714, -0.08571428571,  0.05714285714, -0.01428571429])
In [81]: savgol_coeffs(windowlen, order, pos=0)
Out[81]: array([-0.01428571429,  0.05714285714, -0.08571428571,  0.05714285714,  0.98571428571])
In [82]: b = np.array([savgol_coeffs(windowlen, order, pos=p) for p in range(windowlen-1, -1, -1)])

In [83]: b
Out[83]: 
array([[ 0.98571428571,  0.05714285714, -0.08571428571,  0.05714285714, -0.01428571429],
       [ 0.05714285714,  0.77142857143,  0.34285714286, -0.22857142857,  0.05714285714],
       [-0.08571428571,  0.34285714286,  0.48571428571,  0.34285714286, -0.08571428571],
       [ 0.05714285714, -0.22857142857,  0.34285714286,  0.77142857143,  0.05714285714],
       [-0.01428571429,  0.05714285714, -0.08571428571,  0.05714285714,  0.98571428571]])
如果我们设置
pos=windowlen-1
,我们将得到设计用于在窗口一端评估滤波器的系数。它们应该与
sgolay
返回的数组的第一行匹配:

In [79]: savgol_coeffs(windowlen, order)
Out[79]: array([-0.08571428571,  0.34285714286,  0.48571428571,  0.34285714286, -0.08571428571])
In [80]: savgol_coeffs(windowlen, order, pos=windowlen-1)
Out[80]: array([ 0.98571428571,  0.05714285714, -0.08571428571,  0.05714285714, -0.01428571429])
In [81]: savgol_coeffs(windowlen, order, pos=0)
Out[81]: array([-0.01428571429,  0.05714285714, -0.08571428571,  0.05714285714,  0.98571428571])
In [82]: b = np.array([savgol_coeffs(windowlen, order, pos=p) for p in range(windowlen-1, -1, -1)])

In [83]: b
Out[83]: 
array([[ 0.98571428571,  0.05714285714, -0.08571428571,  0.05714285714, -0.01428571429],
       [ 0.05714285714,  0.77142857143,  0.34285714286, -0.22857142857,  0.05714285714],
       [-0.08571428571,  0.34285714286,  0.48571428571,  0.34285714286, -0.08571428571],
       [ 0.05714285714, -0.22857142857,  0.34285714286,  0.77142857143,  0.05714285714],
       [-0.01428571429,  0.05714285714, -0.08571428571,  0.05714285714,  0.98571428571]])
类似地,
pos=0
给出窗口另一端的系数。这些应与
sgolay
返回的矩阵的最后一行匹配:

In [79]: savgol_coeffs(windowlen, order)
Out[79]: array([-0.08571428571,  0.34285714286,  0.48571428571,  0.34285714286, -0.08571428571])
In [80]: savgol_coeffs(windowlen, order, pos=windowlen-1)
Out[80]: array([ 0.98571428571,  0.05714285714, -0.08571428571,  0.05714285714, -0.01428571429])
In [81]: savgol_coeffs(windowlen, order, pos=0)
Out[81]: array([-0.01428571429,  0.05714285714, -0.08571428571,  0.05714285714,  0.98571428571])
In [82]: b = np.array([savgol_coeffs(windowlen, order, pos=p) for p in range(windowlen-1, -1, -1)])

In [83]: b
Out[83]: 
array([[ 0.98571428571,  0.05714285714, -0.08571428571,  0.05714285714, -0.01428571429],
       [ 0.05714285714,  0.77142857143,  0.34285714286, -0.22857142857,  0.05714285714],
       [-0.08571428571,  0.34285714286,  0.48571428571,  0.34285714286, -0.08571428571],
       [ 0.05714285714, -0.22857142857,  0.34285714286,  0.77142857143,  0.05714285714],
       [-0.01428571429,  0.05714285714, -0.08571428571,  0.05714285714,  0.98571428571]])
下面是与Matlab的
sgolay
返回值匹配的完整数组:

In [79]: savgol_coeffs(windowlen, order)
Out[79]: array([-0.08571428571,  0.34285714286,  0.48571428571,  0.34285714286, -0.08571428571])
In [80]: savgol_coeffs(windowlen, order, pos=windowlen-1)
Out[80]: array([ 0.98571428571,  0.05714285714, -0.08571428571,  0.05714285714, -0.01428571429])
In [81]: savgol_coeffs(windowlen, order, pos=0)
Out[81]: array([-0.01428571429,  0.05714285714, -0.08571428571,  0.05714285714,  0.98571428571])
In [82]: b = np.array([savgol_coeffs(windowlen, order, pos=p) for p in range(windowlen-1, -1, -1)])

In [83]: b
Out[83]: 
array([[ 0.98571428571,  0.05714285714, -0.08571428571,  0.05714285714, -0.01428571429],
       [ 0.05714285714,  0.77142857143,  0.34285714286, -0.22857142857,  0.05714285714],
       [-0.08571428571,  0.34285714286,  0.48571428571,  0.34285714286, -0.08571428571],
       [ 0.05714285714, -0.22857142857,  0.34285714286,  0.77142857143,  0.05714285714],
       [-0.01428571429,  0.05714285714, -0.08571428571,  0.05714285714,  0.98571428571]])
如果您将其与Matlab中的
b=sgolay(3,5)
的结果进行比较,您会发现它们是相同的

要获得由
sgolay
返回的
g
矩阵,您必须调用
savgol_coefs
,将
deriv
设置为
范围(顺序+1)
中的值,反转和转置数组,并按导数顺序的阶乘进行缩放。要反转系数,可以使用格式
:-1
,也可以使用
savgol_coefs
use
选项

这里有一种方法可以使用
savgol_coefs
生成
g
矩阵,其中
order=3
windowlen=5

In [12]: import numpy as np

In [13]: from scipy.signal import savgol_coeffs

In [14]: from scipy.special import factorial

In [15]: np.set_printoptions(precision=11, linewidth=90, suppress=True)

In [16]: order = 3

In [17]: windowlen = 5

In [18]: g = np.array([savgol_coeffs(windowlen, order, deriv=d, use='dot') for d in range(order+1)]).T / factorial(np.arange(order+1))

In [19]: g
Out[19]: 
array([[-0.08571428571,  0.08333333333,  0.14285714286, -0.08333333333],
       [ 0.34285714286, -0.66666666667, -0.07142857143,  0.16666666667],
       [ 0.48571428571,  0.           , -0.14285714286,  0.           ],
       [ 0.34285714286,  0.66666666667, -0.07142857143, -0.16666666667],
       [-0.08571428571, -0.08333333333,  0.14285714286,  0.08333333333]]) 

您不会说为什么需要Python中的完整
windowlen
x
windowlen
数组。您不需要它来使用
savgol\u过滤器

此问题的可能重复项不是的重复项。它特别询问如何生成Matlab的
sgolay
函数返回的平方矩阵,这在链接的问题中没有提到。谢谢。这帮了大忙。另一个问题。MATLAB函数生成的g矩阵怎么样?是
a=savgol\u系数(窗口长度,多序,deriv=1)
等于MATLAB中g的
g(:,1)
。我用一个例子更新了答案,说明了如何计算
g