
基于加速度梯度检测和平滑误差反馈的自适应互补滤波(Gradient-based Adaptive Complementary Filter, GACF),MATLAB例程,与滤波前、标准互补滤波进行对比
程序简介
程序实现:基于加速度梯度检测和平滑误差反馈的自适应互补滤波(Gradient-based Adaptive Complementary Filter, GACF),并与标准互补滤波器进行性能对比。
算法用于融合加速度计与陀螺仪数据,以估计目标角度,重点在于在存在外部加速度干扰和陀螺仪漂移的情况下,提升姿态估计的稳健性与动态响应性能。
算法原理
传统互补滤波采用固定权重系数 ( \alpha ):
θ
e
s
t
(
t
)
=
α
[
θ
e
s
t
(
t
−
Δ
t
)
+
ω
g
Δ
t
]
+
(
1
−
α
)
θ
a
\theta_{est}(t) = \alpha [\theta_{est}(t-\Delta t) + \omega_g \Delta t] + (1-\alpha)\theta_a
θest(t)=α[θest(t−Δt)+ωgΔt]+(1−α)θa
其中陀螺仪积分部分响应快但易漂移,加速度计部分长期稳定但易受外加线加速度影响。固定权重无法同时兼顾两者特性。
改进的 GACF 引入信号梯度检测与误差反馈调节机制,动态调整滤波权重:
α
t
=
α
0
+
k
1
∣
Δ
θ
a
∣
+
k
2
∣
θ
a
−
θ
e
s
t
∣
\alpha_t = \alpha_0 + k_1|\Delta \theta_a| + k_2|\theta_a - \theta_{est}|
αt=α0+k1∣Δθa∣+k2∣θa−θest∣
α
(
t
)
=
α
(
t
−
1
)
+
β
[
α
t
−
α
(
t
−
1
)
]
\alpha(t) = \alpha(t-1) + \beta [\alpha_t - \alpha(t-1)]
α(t)=α(t−1)+β[αt−α(t−1)]
其中:
- ∣ Δ θ a ∣ |\Delta \theta_a| ∣Δθa∣:加速度角度的变化率(检测外加加速度强度);
- ∣ θ a − θ e s t ∣ |\theta_a - \theta_{est}| ∣θa−θest∣:融合误差;
- k 1 , k 2 k_1, k_2 k1,k2:敏感系数;
- β \beta β:平滑更新速率。
当系统处于平稳状态时,
Δ
θ
a
\Delta \theta_a
Δθa 较小,算法自动降低陀螺权重以减小漂移;
当检测到剧烈运动或外加干扰时,
Δ
θ
a
\Delta \theta_a
Δθa变大,算法会增大陀螺权重,增强动态跟踪能力。
程序功能模块
-
仿真信号生成
生成包含漂移、噪声及外部加速度干扰的陀螺仪与加速度计数据。 -
标准互补滤波实现
采用固定权重 α=0.98 的传统互补滤波,作为基准。 -
改进的梯度检测自适应滤波
实时检测加速度变化率并结合误差反馈,平滑更新 α,实现动态权重调整。 -
结果可视化与误差分析
输出角度估计曲线、误差曲线及 RMSE 对比,直观展示改进效果。
运行结果
各方法得到的角度曲线对比:

各方法得到的角度误差曲线对比:

误差特性输出:

程序结构:

MATLAB源代码
完整代码如下:
%% 基于梯度检测自适应的互补滤波器方法与标准互补滤波对比
% 作者:matlabfilter
% 2025-10-26/Ver1
clear; close all; clc;
rng(0);
%% 生成仿真数据
dt = 0.01; % 采样时间
t = 0:dt:10; % 时间向量
N = length(t);
% 真实角度 (正弦运动)
true_angle = 30*sin(2*pi*0.2*t);
true_angular_vel = 30*2*pi*0.2*cos(2*pi*0.2*t);
...
完整代码参见专栏文章:
https://blog.youkuaiyun.com/callmeup/article/details/153930148?spm=1011.2415.3001.5331
如需单独下载,链接如下:
https://download.youkuaiyun.com/download/callmeup/92205859
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者
361

被折叠的 条评论
为什么被折叠?



