目录

限幅滤波的基本原理

算法描述

实现步骤

优点


限幅滤波的基本原理

限幅滤波是一种简单的数字滤波方法,通过限制相邻采样值之间的最大允许偏差来消除异常数据。其核心思想是设定一个阈值,若当前采样值与前一有效值的差值超过阈值,则视为干扰信号并剔除,用前一有效值代替;否则保留当前采样值。适用于数据波动较小但偶发脉冲干扰的场景。

算法描述

根据经验判断,确定两次采样允许的最大偏差值(设为 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
 

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐