自适应Savitzky–Golay filter代码改进python编写
时间: 2024-03-11 14:22:36 浏览: 168
Savitzky-Golay滤波器是一种平滑和拟合离散数据的方法,它可以在一段时间内对数据进行平滑处理,而不会导致数据的相对位置移动。这种滤波器最初是由A. Savitzky和M. J. E. Golay在1964年提出的。
以下是一个改进的Python代码,可以实现自适应Savitzky-Golay滤波器:
```python
import numpy as np
from scipy.signal import savgol_filter
def adaptive_savgol_filter(y, window_size, polyorder, deriv=0, delta=1.0, mode='interp', delta_threshold=0.1):
"""
自适应Savitzky-Golay滤波器,通过调整窗口大小实现数据平滑。
参数:
y : array_like
一维数组,需要进行平滑处理的数据。
window_size : int
初始窗口大小。
polyorder : int
多项式拟合的阶数。
deriv : int, optional
多项式拟合的导数的阶数(默认为0)。
delta : float, optional
如果delta_threshold大于0,则在两个连续窗口之间调整窗口大小时使用的步长(默认为1.0)。
mode : str, optional
在窗口之外的值的处理方式,可以是'interp'或'nearest'(默认为'interp')。
delta_threshold : float, optional
用于调整窗口大小的阈值(默认为0.1)。
返回值:
ndarray
平滑后的数据。
"""
# 初始化
ys = np.copy(y)
window_sizes = [window_size]
# 通过阈值调整窗口大小
for i in range(1, len(y)):
d = np.abs(ys[i] - ys[i-1])
if d > delta_threshold:
window_sizes.append(window_sizes[-1] + delta)
else:
window_sizes.append(window_sizes[-1])
# 使用Savitzky-Golay滤波器平滑数据
ys_smooth = savgol_filter(ys, window_sizes[0], polyorder, deriv=deriv, mode=mode)
for i in range(1, len(window_sizes)):
if window_sizes[i] != window_sizes[i-1]:
ys_smooth[i:] = savgol_filter(ys[i:], window_sizes[i], polyorder, deriv=deriv, mode=mode)
return ys_smooth
```
这个函数的输入是一个一维数组,以及初始的窗口大小、多项式拟合的阶数、导数的阶数、窗口之外值的处理方式、调整窗口大小的步长和阈值等参数。函数的输出是平滑后的一维数组。在函数内部,首先使用阈值来调整窗口大小,然后使用Savitzky-Golay滤波器平滑数据。
使用这个函数的示例代码如下:
```python
import matplotlib.pyplot as plt
# 生成一些测试数据
x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x) + np.random.normal(0, 0.1, 100)
# 对数据进行平滑处理
y_smooth = adaptive_savgol_filter(y, window_size=11, polyorder=3, delta_threshold=0.1)
# 绘制原始数据和平滑后的数据
plt.plot(x, y, label='Original data')
plt.plot(x, y_smooth, label='Smoothed data')
plt.legend()
plt.show()
```
这段代码生成一个包含100个元素的一维数组,并且在这个数组上添加了一些噪声。然后使用adaptive_savgol_filter函数对数据进行平滑处理,并将原始数据和平滑后的数据绘制在同一张图上。
阅读全文