import numpy as np import matplotlib.pyplot as plt # ================== 解决中文显示 ================== plt.rcParams["font.family"] = ["SimHei", "Microsoft YaHei", "Arial Unicode MS"] plt.rcParams["axes.unicode_minus"] = False # 解决负号显示 # 生成一维带噪声轮廓数据 N = 500 x = np.linspace(0, 10, N) y_raw = np.sin(x) + 0.3 * np.sin(20 * x) + 0.15 * np.random.randn(N) # 一维开放高斯滤波函数 def open_gaussian_filter(sig, sigma=3): n = len(sig) kernel_size = int(6 * sigma) if kernel_size % 2 == 0: kernel_size += 1 half = kernel_size // 2 axis = np.arange(-half, half + 1) gauss_kernel = np.exp(-(axis ** 2) / (2 * sigma ** 2)) gauss_kernel /= np.sum(gauss_kernel) res = np.zeros_like(sig) for i in range(n): left = max(0, i - half) right = min(n, i + half + 1) k_left = half - (i - left) k_right = half + (right - i) res[i] = np.sum(sig[left:right] * gauss_kernel[k_left:k_right]) return res # ================== 执行滤波 ================== sigma_val = 1.5 # 你可以随便改 y_filtered = open_gaussian_filter(y_raw, sigma=sigma_val) # ================== 绘图 ================== plt.figure(figsize=(10, 5), dpi=110) plt.plot(x, y_raw, color='green', linewidth=1, label='原始信号') plt.plot(x, y_filtered, color='red', linewidth=1.6, label=f'开放高斯滤波 σ={sigma_val}') plt.xlabel('坐标') plt.ylabel('幅值') # 标题自动显示 sigma plt.title(f'开放高斯滤波效果演示(σ = {sigma_val},边界无延拓)') plt.legend() plt.grid(alpha=0.3) plt.show()
![]()
![]()