【信号去噪】基于卡尔曼滤波实现信号去噪附matlab代码

 1 内容介绍

1.1 卡尔曼滤波理论的背景及意义 

信号是信息的载体。一般可以分为两类,分别为确定性信号与随机信号。服从 某种固定函数的关系的信号,就是确定性信号,它的变化是遵循一定规律的,具有 确定的频谱特性,比如说正余弦信号、阶跃信号、脉宽固定的矩形脉冲信号等。若 信号在每个时刻的取值是随机变量,则称之为随机信号,它不能表示为一个确定的 时间函数或空间函数。这种信号即使在初始条件和环境条件相同的情况下,每次信 号的实现结果也不一样,比如说海浪、陀螺漂移、惯性导航系统的导航误差、全球 定位系统(Global Position System, GPS)的选择可用性(Selective Availability, SA)误差 等,尽管随机信号没有确定的频谱特性,但是在实际应用中,可以利用它的统计特 性来进行计算,即随机信号具有确定的功率谱[1]1-5。 在信号采集与传输的过程中,必然会受到周围环境与内部噪声的干扰,所以我 们就要对信号进行正确的处理,排除干扰的影响,尽量获取的是所需的信号,这就 需要对接收信号进行滤波。滤波,就是从含噪的观测数据中提取信号的过程。根据 信号的特征不同,使用的滤波方法也不一样。对于确定性信号来说,由于其频谱特 性是确定的,就可以根据各信号在频带上的不同分布,设置与其频率特性相对应的 滤波器,如高通滤波器、带通滤波器、低通滤波器及带阻滤波器等,使所需的有用 信号无衰减地通过,而抑制干扰信号。这类滤波器可以用硬件方法来实现,即我们 通常所说的模拟滤波器,也可以用软件方法来实现,即数字滤波器。对确定性信号 进行的滤波我们通常将之称为常规滤波。 随机信号的频谱特性虽然不确定,但其功率谱特性是一定的,设计滤波器可依 据所需有用信号和干扰信号的功率谱来进行。美国学者维纳(N.Wiener)等人提出了 Wiener滤波,通过对功率谱分解来设计滤波器,与常规滤波相似的是要对信号做抑 制和选通处理[2,3]。在频域对信号进行Wiener滤波器的设计时,要求解维纳-霍普方 程,计算量很大,并且还需要大量的存储空间,在一定程度上妨碍了Wiener滤波的 广泛应用。 1960年卡尔曼(R.E.Kalman)发表了对于离散数据利用递归方法来解决其线性滤 波问题的论文[4]。在这篇文章里,提出了卡尔曼滤波(Kalman Filter),一种新的且克 服了Wiener滤波缺点的滤波方法。卡尔曼在随机估计理论中引入了状态空间的概念, 将信号看做是白噪声激励下的一个线性系统的输出,这种输入-输出关系通过状态方 程的形式来描述,滤波算法是在估计过程中利用系统状态方程、观测方程、系统噪声和观测噪声的统计特性形成的,因为所用的信号信息都是时域的,所以不仅可以 估计一维的平稳的随机过程,也可以估计多维的、非平稳随机过程。这就克服了在 频域内Wiener滤波设计时遇到的种种限制,适用范围比较广泛。Kalman滤波的理论基础就是估计问题。从信号处理观点看,估计问题讲的是如 何从受噪声污染的观测量中恢复信号或逼近信号或推出一组参数值的问题。在数学 上,估计问题属于统计学的范畴。在估计问题中,观测空间是唯一的信息源,只有 观测值才能提供估计所需要的信息[5]17-24。可问题在于这些观测值中含有误差。传播 误差、设备误差、计算误差以及人为误差等都是产生这些误差的主要来源[6]。在估 计问题中,误主要指随机误差。因此,将估计问题可以归纳为:在给定观测值 

【信号去噪】基于卡尔曼滤波实现信号去噪附matlab代码_第1张图片

2 仿真代码​​​​​​​

addpath('./filters');
addpath('./IP_raytracing');
%% 模拟一条运动轨迹,然后加上高斯观察噪声,作为观测位置轨迹。然后使用卡尔曼滤波得到滤波后的结果。
% 速度为均值0.6m标准差0.05的高斯分布
% 观测噪声标准差为2

%% 画出实际的真实路径
roomLength = 1000;
roomWidth = 1000;
t = 500;
trace_real = get_random_trace(roomLength, roomWidth, t);
figure; 
subplot(1, 3, 1); plot(trace_real(:, 1), trace_real(:, 2), '.');
title('实际的真实路径');

%% 有观测噪声时的路径
noise = 2; %2m的位置波动噪声
trace = trace_real + normrnd(0, noise, size(trace_real));
subplot(1, 3, 2); plot(trace(:, 1), trace(:, 2), '.');
title('有噪声时的路径');
fprintf('卡尔曼滤波之前的定位精度: %f m\n', accuracy(trace, trace_real));

%% 对有噪声的路径进行卡尔曼滤波
kf_params_record = zeros(size(trace, 1), 4);
for i = 1 : t
    if i == 1
        kf_params = kf_init(trace(i, 1), trace(i, 2), 0, 0); % 初始化
    else
        kf_params.z = trace(i, 1:2)'; %设置当前时刻的观测位置
        kf_params = kf_update(kf_params); % 卡尔曼滤波
    end
    kf_params_record(i, :) = kf_params.x';
end
kf_trace = kf_params_record(:, 1:2);
subplot(1, 3, 3); plot(kf_trace(:, 1), kf_trace(:, 2), '.');
title('卡尔曼滤波后的效果');
fprintf('卡尔曼滤波之后的定位精度: %f m\n', accuracy(kf_trace, trace_real));
 

3 运行结果

【信号去噪】基于卡尔曼滤波实现信号去噪附matlab代码_第2张图片

4 参考文献

[1]侯亚培. 基于卡尔曼滤波的脑电信号去噪方法研究[D]. 燕山大学.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

你可能感兴趣的:(信号处理,matlab,开发语言)