当然,有许多其他平滑算法,可以用于信号处理和数据平滑。高斯滤波(Gaussian Filter)是其中一种非常流行的方法,此外还有中值滤波(Median Filter)等。下面是一些相关算法的介绍和示例代码。
1. 高斯滤波(Gaussian Filter)
高斯滤波是一种线性平滑滤波器,使用高斯分布的权重进行加权平均。它能够有效地平滑数据,同时保留边缘信息。
import numpy as np
from scipy.ndimage import gaussian_filter1d
# 示例数据,假设从硬件设备采集的数据
data = np.array([10, 12, 15, 14, 13, 16, 18, 20, 21, 19, 17, 15])
# 应用高斯滤波
sigma = 1 # 高斯分布的标准差
smoothed_data = gaussian_filter1d(data, sigma)
print("原始数据: ", data)
print("平滑后数据: ", smoothed_data)
2. 中值滤波(Median Filter)
中值滤波是一种非线性滤波器,使用窗口内的中值代替中心值。它对去除脉冲噪声非常有效。
import numpy as np
from scipy.ndimage import median_filter
# 示例数据,假设从硬件设备采集的数据
data = np.array([10, 12, 15, 14, 13, 16, 18, 20, 21, 19, 17, 15])
# 应用中值滤波
size = 3 # 滤波窗口的大小
smoothed_data = median_filter(data, size)
print("原始数据: ", data)
print("平滑后数据: ", smoothed_data)
3. Savitzky-Golay 滤波器(Savitzky-Golay Filter)
Savitzky-Golay 滤波器通过多项式拟合进行平滑,适用于保留信号的高阶导数信息。
import numpy as np
from scipy.signal import savgol_filter
# 示例数据,假设从硬件设备采集的数据
data = np.array([10, 12, 15, 14, 13, 16, 18, 20, 21, 19, 17, 15])
# 应用 Savitzky-Golay 滤波器
window_size = 5 # 滑动窗口大小
poly_order = 2 # 多项式阶数
smoothed_data = savgol_filter(data, window_size, poly_order)
print("原始数据: ", data)
print("平滑后数据: ", smoothed_data)
4. 洛伦兹滤波(Lowess Filter)
洛伦兹滤波是一种局部加权回归方法,适用于平滑数据并保留局部趋势。
import numpy as np
import statsmodels.api as sm
# 示例数据,假设从硬件设备采集的数据
data = np.array([10, 12, 15, 14, 13, 16, 18, 20, 21, 19, 17, 15])
# 应用 Lowess 滤波
fraction = 0.3 # 使用的数据点比例
smoothed_data = sm.nonparametric.lowess(data, np.arange(len(data)), frac=fraction)[:, 1]
print("原始数据: ", data)
print("平滑后数据: ", smoothed_data)
比较这些算法
- 高斯滤波:适用于平滑噪声,同时保留边缘信息,适合于多种信号处理任务。
- 中值滤波:特别适合于去除脉冲噪声,对信号中的孤立异常值非常有效。
- Savitzky-Golay 滤波器:适用于需要保留信号高阶导数信息的场景,能够更好地保留数据的细节。
- 洛伦兹滤波:适用于保留数据的局部趋势,尤其是非线性数据的平滑。
这些算法各有优缺点,可以根据具体的应用场景选择合适的平滑方法。
标签:python,数据,平滑,滤波,smoothed,print,data,信号处理 From: https://www.cnblogs.com/cinemaparadiso/p/18251732