ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

嵌入式开发必学:低通滤波与互补滤波原理及Python实战

嵌入式开发必学:低通滤波与互补滤波原理及Python实战 这次我们来看一个在嵌入式、机器人控制和传感器数据处理领域非常基础且关键的技术话题低通滤波与互补滤波。这听起来可能不像AI模型那样酷炫但它决定了你的传感器数据是否可靠你的控制系统是否稳定。无论是四轴飞行器的姿态解算还是智能小车的循迹避障甚至是工业设备的状态监测都离不开对原始信号的“净化”处理。简单来说低通滤波Low-Pass Filter, LPF就像一个“平滑器”它允许信号中的低频成分通过而抑制或衰减高频的噪声和干扰。互补滤波Complementary Filter则更像一个“聪明的裁判”它知道如何取长补短将两种或多种传感器的数据进行融合比如用加速度计来修正陀螺仪的长期漂移用磁力计来修正航向角的累积误差。它的核心思想是一个传感器擅长短期精度但会漂移另一个传感器长期稳定但响应慢或有噪声把它们“互补”一下就能得到一个既快又准的融合结果。这篇文章的重点不是推导复杂的数学公式而是让你能快速理解这两种滤波的核心思想、知道它们能解决什么问题、以及如何在你的项目中实际应用。我们会从最直观的一阶低通滤波开始逐步深入到互补滤波的设计与参数整定并通过模拟数据来验证效果。无论你是正在做课程设计的学生还是需要快速实现传感器数据稳定的工程师这篇文章都能提供一套可直接落地的思路和代码。1. 核心能力速览在深入细节之前我们先通过一个表格快速把握这两种滤波技术的核心特性和适用场景让你对它们有一个全局的认识。能力项低通滤波 (LPF)互补滤波 (Complementary Filter)核心目标抑制高频噪声平滑信号融合多传感器数据取长补短估计最优状态主要输入单个传感器的原始数据流通常为两个传感器一个高频响应好但会漂移如陀螺仪一个低频稳定但响应慢如加速度计关键参数截止频率 (fc) 或时间常数 (τ)、采样周期 (T)融合系数 (α) 或互补系数 (通常 α β 1)计算复杂度极低通常只需一次乘法和一次加法一阶低核心为加权平均略高于简单LPF硬件门槛无特殊要求任何MCU均可实时计算无特殊要求但需要多个传感器作为输入源典型应用场景去除ADC采样噪声、平滑电位器读数、电机速度滤波IMU惯性测量单元姿态解算如四轴飞行器、航位推算、多源信息融合优点实现简单计算量小能有效平滑毛刺结构简单性能稳定能有效抑制传感器各自的缺点无复杂迭代过程缺点会引入相位滞后过度平滑会损失有用高频信号融合系数需要根据传感器特性手动调整对传感器安装误差和标定较敏感输出结果平滑后的单路信号融合后的最优估计值如俯仰角、滚转角2. 适用场景与使用边界2.1 你什么时候需要低通滤波当你手头的传感器数据看起来“毛毛躁躁”充满了随机的小跳动但这些跳动并不是你真正关心的信息时低通滤波就是你的首选工具。例如模拟量采集通过MCU的ADC读取电位器、电压传感器、电流传感器的值通常会伴随电源纹波和电路噪声。编码器测速通过计算单位时间内编码器的脉冲数得到速度由于计数和定时的不确定性速度值可能会有波动。超声波测距在非理想环境下超声波模块返回的距离值可能存在偶然的跳变。用户输入去抖对按键或摇杆的输入进行平滑避免误触发。使用边界低通滤波会“拖慢”信号的响应。如果你的系统需要快速跟踪信号的变化例如快速响应的闭环控制系统过低的截止频率会导致系统不稳定。它也无法区分高频噪声和有用的高频信号可能会把两者一起滤掉。2.2 你什么时候需要互补滤波当你拥有多个传感器来测量同一个物理量但每个传感器都有其无法避免的缺陷时互补滤波提供了一个优雅的解决方案。最经典的例子就是惯性测量单元IMU的姿态估计陀螺仪Gyroscope通过积分角速度得到角度。短期精度高响应快但存在零偏Bias积分会随时间产生巨大的累积误差漂移。加速度计Accelerometer通过测量重力加速度分量来推算姿态角。长期稳定没有累积误差但极易受到机体线性加速度的干扰比如运动或振动动态响应差。单独使用任一个传感器都无法得到稳定可靠的角度。互补滤波的思想就是用加速度计的数据来修正陀螺仪积分产生的长期漂移用陀螺仪的数据来弥补加速度计在动态情况下的不可靠性。使用边界互补滤波假设两个传感器的误差是互补的一个高频好一个低频好。如果传感器误差特性不满足此假设效果会大打折扣。它通常用于融合两个传感器对于更复杂的多传感器融合如加入磁力计、GPS可能需要扩展为更复杂的算法如卡尔曼滤波。此外融合系数的选择对性能影响很大需要根据实际应用调试。3. 环境准备与前置条件实现滤波算法本身不依赖特定的操作系统或复杂的第三方库核心是理解原理并用代码实现。但为了测试和验证效果我们通常需要一个开发环境。3.1 软件与工具准备编程语言C/C用于嵌入式设备、Python用于算法仿真和快速验证、MATLAB/Simulink用于模型设计和模拟。本文示例将主要使用Python因其语法简洁便于理解且方便可视化。Python环境建议使用 Anaconda 或直接安装 Python 3.8。必要Python库numpy: 用于高效的数组和矩阵运算。matplotlib: 用于绘制信号波形直观对比滤波效果。可选scipy: 如果需要设计更复杂的滤波器或进行信号处理。 安装命令如下pip install numpy matplotlib3.2 硬件与数据准备对于仿真无需硬件。我们将使用代码生成模拟的“真实信号”并叠加噪声来验证滤波算法。对于实际部署微控制器如STM32, ESP32, Arduino。目标传感器如MPU6050陀螺仪加速度计模块。相应的传感器驱动库能稳定读取原始数据。3.3 核心概念准备在编码前必须理解两个关键参数采样周期 (T): 你的程序每隔多长时间读取一次传感器数据并执行一次滤波计算。单位是秒(s)。例如100Hz的采样频率对应 T 0.01s。这个值必须准确且稳定对于积分运算陀螺仪尤其重要。截止频率 (fc): 对于低通滤波允许通过的最高频率。高于此频率的成分将被衰减。单位是赫兹(Hz)。它决定了滤波器的“平滑程度”。时间常数 (τ): 与截止频率相关τ 1 / (2π * fc)。它反映了滤波器对阶跃输入的响应速度。τ越大响应越慢越平滑。融合系数 (α): 对于互补滤波这是一个介于0和1之间的权重值决定了你更信任哪一个传感器。通常α接近1表示更信任陀螺仪短期数据接近0表示更信任加速度计/磁力计长期参考。4. 从一阶低通滤波开始原理与实现一阶低通滤波是最简单、最常用的滤波形式其离散化公式是理解其他滤波算法的基础。4.1 算法公式一阶低通滤波在离散时间域的标准递推公式为y[n] α * x[n] (1 - α) * y[n-1]其中y[n]是本次滤波后的输出值。y[n-1]是上一次滤波后的输出值。x[n]是本次采样得到的原始输入值。α是滤波系数取值范围 (0, 1]。这个公式非常直观本次的输出是本次输入和上次输出的加权平均。α越大本次输入的权重越高滤波器跟踪新变化的能力越强但平滑效果越弱更“尖锐”。α越小历史输出的权重越高平滑效果越好但响应越迟缓更“迟钝”。4.2 α 与截止频率 fc 的关系α 不是一个随意设定的数它应该由你期望的截止频率fc和系统的采样周期T决定α 1 - exp(-T / τ) 1 - exp(-2π * fc * T)这个公式来源于一阶RC低通滤波器的模拟传递函数离散化后向差分法。在实际工程中更常用以下近似公式在fc * T较小时非常精确α ≈ 2π * fc * T举例假设你的采样频率是100HzT0.01s你希望滤除10Hz以上的噪声即截止频率 fc 10Hz。 那么 α ≈ 2 * 3.1416 * 10 * 0.01 ≈ 0.628。 你可以使用这个α值也可以使用精确公式计算α 1 - exp(-23.141610*0.01) ≈ 0.468。经验法则通常截止频率fc应设置为有用信号最高频率的1.5到2倍以上同时远小于采样频率的一半奈奎斯特频率。α通常设置在0.1到0.5之间较为常见。4.3 Python代码实现与测试让我们用代码来生成一个带噪声的信号并应用一阶低通滤波。import numpy as np import matplotlib.pyplot as plt # 参数设置 fs 100.0 # 采样频率 100 Hz T 1.0 / fs # 采样周期 fc 5.0 # 截止频率 5 Hz alpha 2 * np.pi * fc * T # 计算滤波系数 (近似公式) print(f滤波系数 alpha {alpha:.3f}) # 生成模拟信号1Hz正弦波 20Hz高频噪声 t np.arange(0, 3, T) # 3秒时长 signal_clean np.sin(2 * np.pi * 1 * t) # 1Hz 干净正弦波 noise 0.5 * np.sin(2 * np.pi * 20 * t) # 20Hz 高频噪声 signal_noisy signal_clean noise # 叠加噪声后的信号 # 一阶低通滤波函数 def low_pass_filter_one_order(new_value, last_value, alpha): return alpha * new_value (1 - alpha) * last_value # 应用滤波 filtered_signal np.zeros_like(signal_noisy) filtered_signal[0] signal_noisy[0] # 初始化第一个值 for i in range(1, len(signal_noisy)): filtered_signal[i] low_pass_filter_one_order(signal_noisy[i], filtered_signal[i-1], alpha) # 绘图 plt.figure(figsize(12, 8)) plt.subplot(3, 1, 1) plt.plot(t, signal_clean, b-, labelClean Signal (1Hz)) plt.title(Original Clean Signal) plt.legend() plt.grid(True) plt.subplot(3, 1, 2) plt.plot(t, signal_noisy, r-, labelNoisy Signal (1Hz20Hz)) plt.title(Noisy Signal) plt.legend() plt.grid(True) plt.subplot(3, 1, 3) plt.plot(t, signal_noisy, r-, alpha0.3, labelNoisy Signal) plt.plot(t, filtered_signal, g-, linewidth2, labelFiltered Signal (LPF)) plt.plot(t, signal_clean, b--, alpha0.8, labelClean Signal (Ground Truth)) plt.title(Low-Pass Filter Effect (fc5Hz)) plt.legend() plt.grid(True) plt.xlabel(Time [s]) plt.tight_layout() plt.show()运行这段代码你将看到三张图原始干净信号、叠加高频噪声后的信号、以及经过低通滤波后的信号。滤波后的信号绿线应该非常接近原始的干净正弦波蓝色虚线而20Hz的噪声被有效地抑制了。你可以尝试修改fc的值比如改为 2Hz 或 15Hz观察滤波效果的变化。5. 互补滤波实战以IMU姿态估计为例现在我们将低通滤波的思想扩展一下应用到两个传感器上这就是互补滤波。我们以最常见的融合陀螺仪和加速度计数据来估计俯仰角Pitch或滚转角Roll为例。5.1 算法原理与公式互补滤波的核心公式可以表示为当前角度估计 α * (上一时刻角度估计 陀螺仪角速度 * ΔT) (1 - α) * 加速度计计算的角度拆解开来陀螺仪路径对陀螺仪测得的角速度进行积分angle_gyro last_angle gyro * dt。这提供了角度变化的短期、高频信息但会漂移。加速度计路径从加速度计的三轴数据中反解出姿态角angle_acc atan2(accY, accZ)以俯仰角为例。这提供了绝对角度的长期、低频参考但动态响应差、易受振动干扰。融合将两者按权重α进行加权平均。current_angle α * angle_gyro (1 - α) * angle_acc。物理意义系数α实际上定义了一个截止频率。高于这个频率的动态变化我们更相信陀螺仪的积分结果因为加速度计跟不上低于这个频率的长期趋势我们更相信加速度计的测量结果用来修正陀螺仪的漂移。所以互补滤波器在频域上可以看作是将加速度计的低通特性和陀螺仪的高通特性结合在了一起。5.2 Python仿真模拟IMU数据与互补滤波我们模拟一个场景物体先静止然后突然有一个阶跃变化的角度最后保持新角度。陀螺仪数据有零偏加速度计数据有高频噪声。import numpy as np import matplotlib.pyplot as plt # 参数设置 fs 100.0 # 采样频率 100 Hz dt 1.0 / fs # 采样间隔 total_time 5.0 # 总时长5秒 n_samples int(total_time * fs) t np.arange(0, total_time, dt) # 1. 生成真实角度曲线地面真值 # 前2秒为0度后3秒为30度约0.524弧度 true_angle np.zeros(n_samples) true_angle[int(2*fs):] np.deg2rad(30) # 2秒时发生阶跃变化 # 2. 生成模拟陀螺仪数据角速度单位弧度/秒 # 真实角速度 真实角度的微分 零偏 true_gyro np.gradient(true_angle, dt) # 数值微分得到真实角速度 gyro_bias np.deg2rad(0.5) # 假设陀螺仪有一个固定的零偏0.5度/秒 gyro_noise_std np.deg2rad(0.1) # 陀螺仪测量噪声标准差 gyro_measured true_gyro gyro_bias np.random.randn(n_samples) * gyro_noise_std # 3. 生成模拟加速度计数据计算出的角度 # 假设加速度计测量的是重力矢量在机体轴上的分量 # 当俯仰角为theta时理想情况下accY -g * sin(theta), accZ g * cos(theta) # 所以theta_acc atan2(-accY, accZ) 注意符号取决于坐标系定义 g 9.81 # 生成理想的加速度分量 accY_ideal -g * np.sin(true_angle) accZ_ideal g * np.cos(true_angle) # 加入高频振动噪声模拟机体振动 vibration_freq 15.0 # Hz vibration_amp 0.2 * g # 振动幅度为0.2g accY_noise vibration_amp * np.sin(2 * np.pi * vibration_freq * t) accZ_noise vibration_amp * 0.5 * np.sin(2 * np.pi * vibration_freq * t 0.5) # 加入随机测量噪声 acc_noise_std 0.05 * g accY_measured accY_ideal accY_noise np.random.randn(n_samples) * acc_noise_std accZ_measured accZ_ideal accZ_noise np.random.randn(n_samples) * acc_noise_std # 从加速度计数据反解角度 angle_acc np.arctan2(-accY_measured, accZ_measured) # 注意坐标系这里使用常见定义 # 4. 互补滤波实现 def complementary_filter(gyro_data, acc_angle_data, dt, alpha): 互补滤波主函数 :param gyro_data: 陀螺仪角速度序列 (rad/s) :param acc_angle_data: 加速度计解算的角度序列 (rad) :param dt: 采样周期 (s) :param alpha: 融合系数 (信任陀螺仪的比例) :return: 滤波后的角度估计序列 n len(gyro_data) angle_est np.zeros(n) angle_est[0] acc_angle_data[0] # 用加速度计角度初始化 for i in range(1, n): # 陀螺仪积分得到角度预测 angle_gyro_pred angle_est[i-1] gyro_data[i] * dt # 互补融合 angle_est[i] alpha * angle_gyro_pred (1 - alpha) * acc_angle_data[i] return angle_est # 设置不同的融合系数进行测试 alpha_test [0.98, 0.95, 0.90] # 常见取值范围 estimates [] for alpha in alpha_test: est complementary_filter(gyro_measured, angle_acc, dt, alpha) estimates.append(est) # 5. 绘图比较 plt.figure(figsize(14, 10)) plt.subplot(3, 1, 1) plt.plot(t, np.rad2deg(true_angle), k-, linewidth3, labelGround Truth) plt.plot(t, np.rad2deg(angle_acc), r-, alpha0.6, labelAngle from Accel (Noisy)) plt.title(Sensor Data: True Angle vs. Accelerometer Angle) plt.ylabel(Angle [deg]) plt.legend() plt.grid(True) plt.subplot(3, 1, 2) plt.plot(t, np.rad2deg(true_gyro), k-, linewidth2, labelTrue Angular Velocity) plt.plot(t, np.rad2deg(gyro_measured), b-, alpha0.7, labelGyro Measured (with bias noise)) plt.title(Sensor Data: True vs. Measured Gyro) plt.ylabel(Angular Velocity [deg/s]) plt.legend() plt.grid(True) plt.subplot(3, 1, 3) plt.plot(t, np.rad2deg(true_angle), k-, linewidth3, labelGround Truth) colors [g, b, m] for i, (alpha, est) in enumerate(zip(alpha_test, estimates)): plt.plot(t, np.rad2deg(est), colors[i]-, linewidth1.5, labelfComp Filter (α{alpha})) plt.title(Complementary Filter Performance with Different Alpha) plt.xlabel(Time [s]) plt.ylabel(Angle [deg]) plt.legend() plt.grid(True) plt.tight_layout() plt.show()5.3 结果分析与参数整定运行仿真代码后观察第三张图红色线加速度计角度在静止阶段0-2秒虽然噪声很大但平均值在0度附近。在阶跃变化发生时2秒处它出现了剧烈的、振荡的响应这正是加速度计受线性加速度干扰的体现。之后2-5秒平均值稳定在30度附近但始终存在高频抖动。绿色/蓝色/洋红色线互补滤波结果α0.98绿色非常信任陀螺仪。在静态阶段由于陀螺仪零偏的存在输出角度会缓慢漂移仔细观察0-2秒的绿线它在缓慢下降。但在动态阶跃响应时它能快速跟踪且平滑了加速度计的振荡。α0.90洋红更信任加速度计。在静态阶段漂移被很好地抑制了几乎与真实值重合。但在动态阶跃响应时它会受到更多加速度计噪声和振荡的影响响应曲线出现了一些波动。α0.95蓝色一个折中的选择。兼顾了静态稳定性和动态跟踪性能。如何选择α这是一个权衡Trade-off。没有绝对的最优值需要根据你的具体应用调试系统动态性如果物体运动剧烈、快速如竞速无人机需要更相信陀螺仪α接近1如0.98-0.995以保证快速响应。静态稳定性要求如果物体需要长时间保持稳定姿态如摄影云台需要更相信加速度计α小一些如0.90-0.98以抑制陀螺仪漂移。传感器质量如果你的加速度计噪声特别大或者安装存在较大误差就应该增大α减少对它的依赖。经验法则通常从0.95或0.98开始尝试。在系统静止时观察角度是否漂移在快速运动时观察角度是否振荡或延迟过大然后微调α。6. 进阶话题二阶低通滤波与互补滤波变体6.1 二阶低通滤波一阶低通滤波有时衰减斜率不够陡峭-20dB/十倍频程对于某些需要更干净信号的应用可以使用二阶低通滤波。其传递函数更复杂但离散化后同样可以写成递推形式。一个常见的数字实现是“双线性变换”得到的二阶IIR滤波器。其系数计算稍复杂但很多嵌入式库如ARM的CMSIS-DSP或Python的scipy.signal都提供了直接的设计函数。何时使用二阶当你需要更陡的衰减更干净地滤除特定频带噪声时。但要注意二阶滤波器可能引入更大的相位滞后和非线性相位在控制系统中需谨慎使用。6.2 互补滤波的改进自适应互补滤波与PI补偿基本的互补滤波假设传感器误差特性是固定的。但在实际中加速度计的干扰程度是时变的静止时干扰小运动时干扰大。因此可以引入自适应机制让融合系数α根据当前的运动状态动态调整。例如通过计算加速度计数据的方差来判断机体是否处于剧烈振动状态如果是则临时增大α更信任陀螺仪。另一种常见改进是引入PI比例-积分补偿器。将加速度计与陀螺仪积分结果的偏差angle_acc - angle_gyro不仅按比例P还按积分I进行补偿然后将补偿量加到陀螺仪的角速度读数上再进行积分。这种结构本质上是一个简化版的卡尔曼滤波器能更有效地估计并消除陀螺仪的零偏。在开源飞控如Betaflight, ArduPilot中广泛使用。7. 资源占用与性能观察滤波算法本身计算量极低非常适合资源受限的嵌入式系统。计算量一阶低通滤波每次采样执行2次乘法1次加法1次减法。互补滤波基础版每次采样执行2次乘法2次加法1次减法1次积分加法。内存占用仅需存储几个状态变量如上一次输出值、积分角度。实时性在kHz级别的采样频率下在STM32等MCU上执行时间可忽略不计。性能观察要点相位滞后低通滤波会使输出信号相对输入信号产生延迟。在闭环控制中这个延迟可能降低系统稳定性甚至引发振荡。务必在系统设计中考虑此影响。稳态误差对于阶跃输入一阶低通滤波的输出会指数趋近于输入值理论上无稳态误差。互补滤波在静态时若加速度计无误差也应无稳态误差。数值溢出与饱和在嵌入式实现中注意变量范围。对于积分项陀螺仪角度需防止长时间积分导致溢出。可考虑定期用加速度计角度重置积分器或使用带限幅的积分。8. 常见问题与排查方法问题现象可能原因排查方式解决方案滤波后信号仍有高频毛刺截止频率fc设置过高或采样周期T不准确导致α计算错误。检查代码中fc和T的取值。用标准信号如方波测试观察响应。降低fc。确保T是稳定、精确的定时器中断周期。滤波后信号响应太慢跟不上变化截止频率fc设置过低或α值太小。同上。观察系统对阶跃输入的响应时间。提高fc。根据系统带宽要求重新设计。互补滤波角度输出持续漂移陀螺仪零偏未补偿且融合系数α过大。将系统静止放置观察角度是否缓慢变化。读取静止时的陀螺仪输出计算零偏。1. 上电后静止一段时间计算平均零偏并减去。2. 适当减小α增加加速度计权重。3. 实现PI补偿器来在线估计零偏。互补滤波在运动时角度剧烈跳动加速度计受线性加速度干扰严重且融合系数α过小。快速晃动传感器观察加速度计解算角度的波动。1. 适当增大α减少对加速度计的信任。2. 尝试自适应滤波根据振动强度动态调整α。3. 对加速度计数据进行额外的低通滤波截止频率需很低。角度在90度附近出现奇异或跳变使用atan2解算姿态角时在极点附近如俯仰角接近±90度存在万向节锁问题计算不稳定。观察当传感器倾斜到很大角度时输出是否跳变。1. 使用四元数进行姿态表示和更新从根本上避免奇异性。2. 限制系统的工作角度范围。算法在MCU上运行不稳定变量数据类型溢出如积分项或中断服务程序执行时间过长。检查变量范围使用调试器观察关键变量值。测量中断执行时间。1. 使用更大范围的数据类型如int32_t,float。2. 对积分项进行限幅或定期归零。3. 优化代码减少计算量。9. 最佳实践与使用建议从仿真开始在将算法烧录到硬件之前务必像本文一样用Python或MATLAB进行仿真。用模拟数据验证算法逻辑、观察参数影响能节省大量调试时间。准确测量采样周期T是滤波算法的基石。确保你的数据采样是定时的最好使用硬件定时器中断来触发采样和滤波计算。传感器校准是前提滤波无法纠正系统误差。在使用互补滤波前必须对陀螺仪和加速度计进行校准标定零偏和比例因子。参数整定流程 a.初始化将物体静止放置读取陀螺仪输出平均值作为零偏补偿值。 b.静态测试系统静止观察互补滤波输出是否漂移。如果漂移适当减小α。 c.动态测试给系统一个已知的、快速的姿态变化如翻转90度观察滤波输出的响应速度、超调量和稳态误差。如果响应慢或有振荡调整α。 d.折中与验证找到静态和动态性能都可接受的α值。考虑使用四元数对于全姿态三维空间估计欧拉角俯仰、滚转、偏航存在万向节锁问题。工业级和开源项目普遍采用四元数进行互补滤波或卡尔曼滤波稳定性更好。记录与可视化在嵌入式系统中开辟一段内存缓冲区实时记录关键数据原始传感器数据、滤波后角度等然后通过串口发送到上位机如使用Python的matplotlib绘图分析。这是调试滤波算法最有效的手段。理解算法的局限性互补滤波简单有效但它是一个线性、时不变的滤波器。对于非线性强、传感器误差模型复杂的情况扩展卡尔曼滤波EKF或无迹卡尔曼滤波UKF可能是更好的选择当然复杂度也更高。低通滤波和互补滤波是进入信号处理和传感器融合世界的两把钥匙。它们用最简洁的数学形式解决了工程中大量实际问题。掌握它们的关键不在于死记公式而在于理解其背后的思想根据频率特性分离信号与噪声根据时间特性融合不同传感器的优势。从一阶低通滤波的平滑到互补滤波的传感器融合这个思路可以延伸到更复杂的算法中。建议你动手运行本文的仿真代码改变参数观察波形变化这是理解它们最直接的方式。当你下次面对跳动的传感器数据时希望你能自信地选出合适的滤波器并快速调出稳定的结果。
返回列表