什么是MATLAB的Python等价物';s斯戈莱(k,f)?
我在MATLAB中有一个函数什么是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等价物
[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
xwindowlen
数组。您不需要它来使用savgol\u过滤器
此问题的可能重复项不是的重复项。它特别询问如何生成Matlab的sgolay
函数返回的平方矩阵,这在链接的问题中没有提到。谢谢。这帮了大忙。另一个问题。MATLAB函数生成的g矩阵怎么样?是a=savgol\u系数(窗口长度,多序,deriv=1)
等于MATLAB中g的g(:,1)
。我用一个例子更新了答案,说明了如何计算g
。