You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:57:01