平滑窗口去抖动

目录

pinghua.py

moving_average函数说明:

3d点平滑,3个轴分别平滑


pinghua.py

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 生成示例数据(含噪声的正弦波)
np.random.seed(42)
x = np.linspace(0, 10, 200)
y = np.sin(x) + np.random.normal(0, 0.1, 200)

# 简单移动平均函数
def moving_average(data, window_size):
    return pd.Series(data).rolling(window_size, center=True).mean().values
window_size = 9
sma = moving_average(y, window_size)

# 可视化
plt.figure(figsize=(12, 6))
plt.plot(x, y, label='Original', alpha=0.5)
plt.plot(x, sma, label=f'SMA (window={window_size})', color='red')
plt.legend()
plt.title('Simple Moving Average')
plt.show()


def median_filter(data, window_size):
    return pd.Series(data).rolling(window_size, center=True).median().values


median = median_filter(y, window_size)

plt.figure(figsize=(12, 6))
plt.plot(x, y, label='Original', alpha=0.5)
plt.plot(x, median, label=f'Median Filter (window={window_size})', color='purple')
plt.legend()
plt.title('Median Filter')
plt.show()
from scipy.signal import savgol_filter

def savitzky_golay(data, window_size, poly_order=2):
    return savgol_filter(data, window_size, poly_order)

poly_order = 3    # 多项式阶数
savgol = savitzky_golay(y, window_size, poly_order)

plt.figure(figsize=(12, 6))
plt.plot(x, y, label='Original', alpha=0.5)
plt.plot(x, savgol, label=f'Savitzky-Golay (window={window_size}, order={poly_order})', color='orange')
plt.legend()
plt.title('Savitzky-Golay Filter')
plt.show()

plt.figure(figsize=(14, 8))
plt.plot(x, y, label='Original', alpha=0.3, linewidth=2)
plt.plot(x, sma, label='Moving Average', linestyle='--')
plt.plot(x, median, label='Median Filter', linestyle=':')
plt.plot(x, savgol, label='Savitzky-Golay')

plt.legend()
plt.title('Smoothing Methods Comparison')
plt.xlabel('Time')
plt.ylabel('Value')
plt.grid(True)
plt.show()

moving_average函数说明

处理一维数据,使用Pandas的rolling方法计算移动平均。参数center=True确保窗口居中,min_periods=1允许在数据不足时使用可用数据进行计算,避免结果中出现NaN。

3d点平滑,3个轴分别平滑

import numpy as np
import pandas as pd

def moving_average_3d(points, window_size):
    """3D点序列滑动平均
    :param points: (n,3)形状的numpy数组
    :param window_size: 窗口大小(奇数)
    """
    df = pd.DataFrame(points, columns=['x', 'y', 'z'])
    # 各轴独立滑动平均(居中窗口)
    smoothed = df.rolling(window=window_size, center=True, min_periods=1).mean()
    return smoothed.values

# 示例数据:随机3D轨迹
np.random.seed(42)
n = 50
raw_points = np.cumsum(np.random.randn(n,3)*0.5, axis=0)  # 含噪声的随机游走

# 应用滑动平均
window = 5  # 窗口大小(建议使用奇数)
smoothed_points = moving_average_3d(raw_points, window)