限幅滤波算法详解及matlab代码
目录
限幅滤波的基本原理
限幅滤波是一种简单的数字滤波方法,通过限制相邻采样值之间的最大允许偏差来消除异常数据。其核心思想是设定一个阈值,若当前采样值与前一有效值的差值超过阈值,则视为干扰信号并剔除,用前一有效值代替;否则保留当前采样值。适用于数据波动较小但偶发脉冲干扰的场景。
算法描述
根据经验判断,确定两次采样允许的最大偏差值(设为 A)
每次检测到新值时判断:
如果本次值与上次值之差 <=A, 则本次值有效
如果本次值与上次值之差 > A, 则本次值无效, 放弃本次值, 用上次值代替本次值
实现步骤
1. 设定阈值
根据信号特性确定最大允许偏差(阈值Δ)。例如,温度传感器数据波动范围通常较小,Δ可选为实际物理量变化速率的合理上限。
2. 初始化变量
记录前一次的有效采样值 prev_value,首次运行时初始化为第一个采样值。
3. 滤波逻辑
对每个新采样值 current_value,计算其与 prev_value 的绝对差值:
- 若
|current_value - prev_value| ≤ Δ,接受current_value并更新prev_value; - 否则,丢弃
current_value,输出prev_value。
优点
能有效克服因偶然因素引起的脉冲干扰,对脉冲干扰、传感器偶尔的跳变等异常值有较好的抑制作用,避免数据突变只需比较当前采样值与前一采样值的差值,无需复杂计算,适合嵌入式系统或实时性要求高的场景

示例代码:
% MATLAB 示例
clc;
clear;
close all;
% 1. 生成测试信号
fs = 1000; % 采样频率 (Hz)
t = 0:1/fs:1; % 时间向量 (1秒)
f = 5; % 信号频率 (Hz)
signal = sin(2*pi*f*t); % 原始信号
% 添加噪声和脉冲干扰
noise = 0.1 * randn(size(t)); % 高斯噪声
impulses = zeros(size(t)); % 脉冲干扰
impulses(randperm(length(t), 20)) = 0.8*(rand(1,20)-0.5); % 随机脉冲
noisy_signal = signal + noise + impulses;
% 2. 应用限幅滤波
threshold = 0.04; % 限幅阈值
filtered_signal = limit_amplitude_filter(noisy_signal, threshold);
% 3. 结果可视化
figure('Name', '限幅滤波效果', 'NumberTitle', 'off');
subplot(3,1,1);
plot(t, signal, 'b', 'LineWidth', 1.5);
title('原始纯净信号');
xlabel('时间 (s)');
ylabel('幅值');
grid on;
subplot(3,1,2);
plot(t, noisy_signal, 'r', 'LineWidth', 1);
title('加噪信号 (含高斯噪声和脉冲干扰)');
xlabel('时间 (s)');
ylabel('幅值');
grid on;
subplot(3,1,3);
plot(t, filtered_signal, 'g', 'LineWidth', 1.5);
hold on;
plot(t, signal, 'b--', 'LineWidth', 1);
title('限幅滤波后信号 (绿色) vs 原始信号 (蓝色虚线)');
xlabel('时间 (s)');
ylabel('幅值');
legend('滤波后', '原始');
grid on;
% 4. 计算并显示滤波性能
mse = mean((signal - filtered_signal).^2);
fprintf('限幅滤波性能:\n');
fprintf('均方误差 (MSE): %.4f\n', mse);
% 限幅滤波函数定义 (必须放在文件末尾)
function filtered = limit_amplitude_filter(input, threshold)
filtered = zeros(size(input));
filtered(1) = input(1); % 第一个值保持不变
for i = 2:length(input)
delta = input(i) - filtered(i-1);
if abs(delta) > threshold
% 超过阈值,进行限幅
filtered(i) = filtered(i-1) + sign(delta) * threshold;
else
% 未超过阈值,保持不变
filtered(i) = input(i);
end
end
end
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)