
本文给出滑动窗口均值滤波、中值滤波、最小值/最大值滤波对比。最小值和最大值仅在特定环境下可用,均值滤波和中值滤波具有普适性,可直接用
文章目录
- 例程介绍
-
- 📦 程序结构简介
- 🔄 四类滑动滤波器实现
- 📊 对比分析与可视化
- 运行结果
- MATLAB源代码
例程介绍
给出使用滑动窗口对信号进行:
- 均值滤波
- 中值滤波
- 最大值滤波
- 最小值滤波
并给出对比
📦 程序结构简介
1️⃣ 数据生成
- 构造了一个长度为
N = 1000
的模拟信号clean_signal
,包含 2 Hz 与 10 Hz 的正弦成分。 - 添加高斯白噪声构成
noisy_signal
。
2️⃣ 滤波器参数设置
- 设置滑动窗口大小
window_size = 15
,是后续滤波器缓冲区的核心参数。
🔄 四类滑动滤波器实现
✅ 均值滤波器(Moving Average)
- 通过一个循环缓冲区
mean_buffer
记录当前窗口内的数据; - 每步更新中仅用加减法维护窗口总和,避免重复计算均值;
- 时间复杂度:O(N)
✅ 中值滤波器(Median Filter)
- 同样维护一个缓冲区,每步对当前窗口进行
median()
运算; - 没有使用堆优化,适合中等窗口规模;
- 时间复杂度:O(N * log(W)),W为窗口大小
✅ 最大值 & 最小值滤波器
- 遍历窗口并使用
max()
/min()
函数; - 可用于边缘检测、包络提取等场景;
- 时间复杂度类似中值滤波器,待优化方向:使用单调队列
📊 对比分析与可视化
图形输出
- 逐一绘制每种滤波器的结果与真实信号、噪声信号对比;
- 提供子图方式直观展示效果差异;
- 最后一幅图将四种滤波器输出整体比较。
📉 性能评估
程序会输出:
- 每种方法的运行时间(以秒计)
- 均方误差(MSE)作为滤波精度评估
- 内存消耗估算(单位 KB)
- 相较于 MATLAB 内置
movmean
的处理效率对比
运行结果
信号真值与实际带噪声的值对比曲线:
各方法滤波对比图像:
窗口大小对处理时间的影响:
各滤波方法的RMSE对比:
MATLAB源代码
部分代码如下:
matlab
%% 高效滑动窗口滤波器 - 不使用任何自定义函数,直接运行
% author:Evand(matlabfilter)
% 2025-08-06/Ver1
clear; clc; close all;
rng(0);
%% 生成测试信号
N = 1000; % 信号长度
t = (0:N-1)' / 100; % 时间向量
% 原始信号:正弦波 + 噪声
clean_signal = sin(2*pi*2*t) + 0.5*sin(2*pi*10*t);
noise = 0.3 * randn(N, 1);
noisy_signal = clean_signal + noise;
fprintf('生成测试信号完成:%d个数据点\n', N);
%% 滤波器参数设置
window_size = 15; % 窗口大小
fprintf('窗口大小:%d\n\n', window_size);
%% 高效均值滤波器实现(增量计算)
fprintf('开始均值滤波处理...\n');
tic;
% 初始化均值滤波器变量
mean_buffer = zeros(1, window_size); % 循环缓冲区
mean_index = 1; % 当前索引
mean_sum = 0; % 当前窗口和
mean_count = 0; % 当前有效数据数
mean_filtered = zeros(N, 1); % 输出结果
% 逐点处理
for n = 1:N
% 获取要被替换的旧值
old_value = mean_buffer(mean_index);
完整代码的下载链接:https://download.csdn.net/download/callmeup/91603293
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者