使用Python对含噪x-y坐标数据滤波并拟合平滑曲线的咨询
方案1:Savitzky-Golay滤波(最适配周期性波形的平滑方案)
S-G滤波通过滑动窗口内的最小二乘多项式拟合实现平滑,相比普通移动平均可以更好保留周期性信号的峰值和谷值特征,不会出现波形过度失真的问题。
依赖scipy库实现,示例代码如下:
import numpy as np import matplotlib.pyplot as plt from scipy.signal import savgol_filter # 这里替换为你自己的完整x、y数据 x = [0.00, 0.10, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, 0.80, 0.90, 1.00, 1.10, 1.20, 1.30, 1.40, 1.50, 1.60, 1.70, 1.80, 1.90] y = [-5.39, -11.86, -14.46, -12.73, -12.74, -8.17, -3.00, -9.63, -6.86, -2.59, -7.98, -8.31, -6.62, -4.68, -7.23, -4.10, -5.43, -7.89, -7.23, -6.10] x = np.array(x) y = np.array(y) # 参数调整:window_length为滑动窗口大小,必须是奇数,越大平滑程度越高;polyorder为拟合多项式阶数,一般取2~3 y_smooth = savgol_filter(y, window_length=7, polyorder=2) # 绘图对比 fig, ax = plt.subplots(figsize=(10,5)) ax.plot(x, y, color='dodgerblue', linewidth=2, label='原始数据') ax.scatter(x, y, color='lime', s=25) ax.plot(x, y_smooth, color='red', linewidth=2, label='S-G平滑结果') ax.set(xlabel='x', ylabel='y') ax.legend() plt.show()
参数调整逻辑:如果平滑后还有明显噪声,就调大window_length;如果波形失真、峰谷被削,就降低窗口长度或者提高多项式阶数。
方案2:傅里叶级数拟合(适合提取周期性全局趋势)
如果你的数据是严格的周期信号,需要得到连续可导的全局拟合函数,用傅里叶级数拟合是最优选择,通过选择不同的谐波阶数控制拟合的精细程度。
示例代码如下:
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit # 定义傅里叶级数拟合函数,n为谐波阶数,可自行调整 def fourier_fit(x, *params): a0 = params[0] n = (len(params)-1)//2 res = a0 for i in range(1, n+1): a = params[2*i-1] b = params[2*i] res += a * np.cos(2*np.pi*i*x / period) + b * np.sin(2*np.pi*i*x / period) return res x = np.array(x) y = np.array(y) # 先根据数据预估周期,也可以通过频谱分析自动计算 period = 2 # 设置谐波阶数,阶数越高越贴合原始波动,越低越平滑 n_harmonic = 3 # 初始化参数 p0 = np.zeros(1 + 2*n_harmonic) popt, _ = curve_fit(fourier_fit, x, y, p0=p0) y_fit = fourier_fit(x, *popt) # 绘图对比 fig, ax = plt.subplots(figsize=(10,5)) ax.plot(x, y, color='dodgerblue', linewidth=2, label='原始数据') ax.scatter(x, y, color='lime', s=25) ax.plot(x, y_fit, color='red', linewidth=2, label='傅里叶拟合结果') ax.set(xlabel='x', ylabel='y') ax.legend() plt.show()
参数调整逻辑:如果拟合结果不够贴合,就调大n_harmonic;如果拟合结果保留了过多噪声,就降低谐波阶数。
补充可选方案
- 移动平均滤波:实现最简单,直接对滑动窗口内的y值取平均即可,适合快速验证,缺点是容易削平峰谷、相位出现偏移。
- 低通滤波:如果噪声频率远高于信号周期频率,也可以用巴特沃斯低通滤波滤除高频噪声,需要先做频谱分析确定截止频率。
内容的提问来源于stack exchange,提问作者cbontoiu
相关产品推荐
相关产品推荐

