云计算百科
云计算领域专业知识百科平台

【MATLAB代码】滑动窗口滤波代码示例,用于计算量小、存储成本低的场景。附完整代码

在这里插入图片描述

在大规模数据处理或高频采样系统中,传统滤波器(如卡尔曼滤波)面临:数据量过大,计算负担重;滤波矩阵维度膨胀,存储成本高;实时性下降。这些问题可由本文所述的滑动窗口滤波来解决。 订阅专栏后,可直接查看源代码,粘贴到MATLAB空脚本中即可直接运行、得到结果【本文限时免费试读,专栏内还有更多滤波代码】

文章目录

  • 运行结果
  • MATLAB源代码
  • 程序详解
    • 数据生成
    • 滤波处理
    • 误差分析
    • 扩展建议

运行结果

滤波前后信号值的曲线如图: 在这里插入图片描述 滤波前后的误差对比如下: 在这里插入图片描述

命令行输出: 在这里插入图片描述

MATLAB源代码

完整代码如下:

% 滑动滤波例程,用固定的滑动窗口进行平均滤波
% author:Evand(VX:matlabfilter)
% 2025-08-06/Ver1
clc;clear;close all;
rng(0);
%% 数据生成
% 生成模拟原始信号与噪声、观测信号
n = 1000;
true_signal = sin((1:n) * 0.05); % 原始信号
noise = 0.5 * randn(1, n); % 噪声
z = true_signal + noise; % 带噪观测

% 滑动窗口平均滤波
window_size = 5;
filtered = zeros(1, n);

for k = window_size:n
filtered(k) = mean(z(kwindow_size+1:k)); % 均值滤波
end
%% 后处理
% 误差计算
err_z = z true_signal;
err_filtered = filtered true_signal;

% 绘图对比
figure;
plot(1:n, z, 'k:');
hold on;
plot(1:n, filtered, 'r', 'LineWidth', 1);
plot(1:n, true_signal, 'b–', 'LineWidth', 1);
legend('观测值(带噪)', '滑动窗口滤波后结果', '真实信号');
title('滑动窗口平均滤波效果');
xlabel('时间');ylabel('信号值对比');

% 误差对比
figure;
plot(err_z, 'k:');
hold on;
plot(err_filtered, 'r', 'LineWidth', 1);
legend('观测误差(带噪)', '滑动窗口滤波后的误差');
title('滑动窗口平均滤波效果');
xlabel('时间');ylabel('误差对比');

fprintf('观测误差绝对值的最大值 :%.2f、平均值:%.2f\\n',max(abs(err_z)),mean(abs(err_z)));
fprintf('滤波后误差绝对值的最大值:%.2f、平均值:%.2f\\n',max(abs(err_filtered)),mean(abs(err_filtered)));

fprintf('滤波使误差最大值降低了:%.2f%%\\n',(max(abs(err_z))max(abs(err_filtered)))/max(abs(err_z))*100);
fprintf('滤波使误差平均值降低了:%.2f%%\\n',(mean(abs(err_z))mean(abs(err_filtered)))/mean(abs(err_z))*100);

程序详解

本例程演示了如何在一维信号中应用固定长度滑动窗口的平均滤波方法,以实现对高频噪声的抑制和信号平滑处理。 优点:

  • 降低内存需求;
  • 实时更新快;
  • 更适用于非平稳系统。

程序的结构如下:

数据生成

程序首先生成长度为 1000 的正弦信号作为真实信号,同时叠加均值为 0、标准差为 0.5 的高斯白噪声构成带噪观测信号:

true_signal = sin((1:n) * 0.05); % 模拟信号
noise = 0.5 * randn(1, n); % 高斯噪声
z = true_signal + noise; % 带噪观测

滤波处理

采用固定窗口大小 window_size = 5,对观测数据进行滑动平均滤波处理:

for k = window_size:n
filtered(k) = mean(z(kwindow_size+1:k)); % 局部平均
end

避免使用全部历史数据,计算量恒定,适合实时处理。

误差分析

程序将滤波前后的信号与真实信号进行误差对比分析,包括最大误差、平均误差,并计算滤波带来的改善百分比:

err_z = z true_signal;
err_filtered = filtered true_signal;

% 输出误差统计
fprintf();

扩展建议

  • 可将均值滤波替换为中值滤波等【参考:】以提高对异常点的鲁棒性;
  • 可扩展为加权滑动窗口滤波器、自适应滑动滤波器【参考】;

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【MATLAB代码】滑动窗口滤波代码示例,用于计算量小、存储成本低的场景。附完整代码
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!