使用经验模态分解(EMD)处理振动信号,并结合样本熵进行特征提取

使用经验模态分解(EMD)处理振动信号,并结合样本熵进行特征提取,是机械故障诊断等领域非常有效的方法。从信号分解 → 阈值去噪 → 特征提取的完整流程

技术路线总览

从原始振动信号到最终特征向量的完整处理流程:
"原始振动信号"
"EMD分解

获得若干IMF分量"
"选择需要处理的IMF"
"阈值去噪处理

(关键步骤)"
"直接计算样本熵"
"计算去噪后IMF的样本熵"
"形成特征向量"

核心步骤详解与MATLAB实现

1. EMD分解振动信号

EMD能将复杂的振动信号自适应地分解为一系列本征模函数(IMF),这是处理非线性、非平稳振动信号的关键。

matlab 复制代码
% 假设已有振动信号 data, 采样频率 fs
[imf, residue] = emd(data, 'Interpolation', 'pchip', 'Display', 0); 
% imf: 分解得到的各阶IMF分量(每一行是一个IMF)
% residue: 残余分量

2. 关键难点:阈值的确定

这是处理中的核心挑战,主要用于从IMF中分离有效成分与噪声。以下是几种实用方法:

方法 核心思想 适用场景与MATLAB关键步骤
基于能量占比法 认为前几个能量高的IMF 主要包含有效信号,后续IMF主要为噪声。 最常用,适用于大多数旋转机械振动信号 。 计算各IMF能量:energy = sum(imf.^2, 2); 设定累积能量阈值(如85%),选择能量占比达到阈值的前k个IMF。
基于统计特性的固定阈值 每个IMF,计算其标准差,设定一个乘数(如2~3倍)作为阈值。 适合噪声特性相对稳定的场景threshold = k * std(imf(i,:)); 对小波阈值函数(如wthresh)也可调整使用。
基于排列熵的自适应阈值 排列熵能衡量序列的随机性,值越大越可能是噪声。 适合噪声复杂或信号非平稳性强的场景 。 计算各IMF排列熵,设定熵阈值(如0.6),高于阈值的IMF被视为需处理的噪声主导IMF。

3. 样本熵的提取

样本熵用于量化时间序列的复杂性和规律性,非常适合描述振动信号的复杂度特征。

matlab 复制代码
function SampEnVal = compute_sampen(data, m, r)
    % 计算样本熵
    % data: 输入时间序列(如某个IMF)
    % m: 嵌入维度,通常取1或2
    % r: 相似容限,通常取0.1~0.25倍的标准差(std)
    
    N = length(data);
    lastrun = zeros(1, N);
    run = zeros(1, N);
    A = 0; B = 0;
    p = zeros(1, N);
    e = zeros(1, N);
    
    % 计算向量匹配个数
    for i = 1:N-m
        for j = i+1:N-m
            if max(abs(data(i:i+m-1) - data(j:j+m-1))) < r
                run(j) = lastrun(j) + 1;
                A = A + run(j);
                B = B + 1;
            else
                run(j) = 0;
            end
            lastrun(j) = run(j);
        end
        for j = 1:N
            lastrun(j) = 0;
            run(j) = 0;
        end
    end
    
    if A==0 || B==0
        SampEnVal = -log(1/((N-m)*(N-m-1)));
    else
        SampEnVal = -log(A/B);
    end
end

% 对选定的IMF计算样本熵
m = 2; % 嵌入维度
r = 0.2 * std(imf_selected); % 容限
sampen_value = compute_sampen(imf_selected, m, r);

完整MATLAB处理流程示例

将上述步骤整合,形成可直接运行或修改的完整流程:

matlab 复制代码
%% 完整流程:振动信号EMD处理与样本熵特征提取
clear; clc; close all;

% 1. 加载或生成振动信号(示例:含噪声的调频调幅信号)
fs = 1000; % 采样频率
t = 0:1/fs:2-1/fs;
data = 2*sin(2*pi*20*t) .* (1+0.5*sin(2*pi*5*t)) + 0.8*sin(2*pi*80*t) + 0.5*randn(size(t));

% 2. EMD分解
[imf, residue] = emd(data, 'Interpolation', 'pchip', 'Display', 0);
num_imf = size(imf, 1);

% 3. 阈值确定(以能量占比法为例)
energy = sum(imf.^2, 2);
total_energy = sum(energy);
cum_energy_ratio = cumsum(energy) / total_energy;
threshold_ratio = 0.85; % 能量阈值设为85%
k = find(cum_energy_ratio >= threshold_ratio, 1); % 选取前k个主要IMF
imf_primary = imf(1:k, :); % 有效成分
imf_noise = imf(k+1:end, :); % 视为噪声为主的分量(可选后续处理)

% 4. 对每个主要IMF计算样本熵
m = 2; % 嵌入维度
feature_vector = zeros(1, k); % 初始化特征向量
for i = 1:k
    r = 0.2 * std(imf_primary(i, :)); % 容限
    feature_vector(i) = compute_sampen(imf_primary(i, :), m, r);
end

% 5. 可视化
figure('Position', [100, 100, 1200, 800]);
% 5.1 原始信号与IMF
subplot(3, 1, 1);
plot(t, data); title('原始振动信号'); xlabel('时间 (s)'); ylabel('幅值');
subplot(3, 1, 2);
plot(t, imf_primary'); title('主要IMF分量'); xlabel('时间 (s)'); ylabel('幅值');
% 5.2 样本熵特征
subplot(3, 1, 3);
bar(1:k, feature_vector);
title('各主要IMF的样本熵特征值'); xlabel('IMF序号'); ylabel('样本熵');
grid on;

参考代码 emd进行振动信号处理,阀值的确定,样本熵的提取 www.youwenfan.com/contentcsq/54949.html

关键参数选择与物理意义

  • EMD参数 :MATLAB内置emd函数通常默认设置即可。若出现过度分解,可调整'MaxNumIMF'
  • 样本熵参数
    • 嵌入维度 m:通常取1或2,表示比较向量的长度。
    • 容限 r :通常取0.1到0.25倍 时间序列的标准差。r值过小会估计偏差大,过大则会丢失有效信息 。建议对同类信号固定r,以保证特征可比性。
  • 物理意义 :在故障诊断中,样本熵值降低 可能意味着信号复杂度下降,规律性增强,有时对应于早期故障引起的周期性冲击成分增多
相关推荐
hhl_483841042 天前
上海域格4G模块信号说明
linux·功能测试·物联网·信号处理·tcp
北京青翼科技2 天前
青翼科技基于XCVU13P FPGA的4路FMC接口高性能信号处理平台丨嵌入式智能平台 · 通用嵌入式平台丨FPGA信号处理板
fpga开发·信号处理·信号处理板·图形处理板卡·pcie数据处理板·fpga板卡
代码中介商3 天前
Linux 信号处理与进程控制深度解析
linux·运维·信号处理
声光界3 天前
《信号处理赋能智能体音感知》
人工智能·音频·信号处理·声学
扣脑壳的FPGAer5 天前
傅里叶级数、傅里叶变换、Z变换、数字滤波器
fpga开发·信号处理
以太浮标8 天前
华为eNSP模拟器综合实验之- 华为设备 LLDP(Link Layer Discovery Protocol)解析
运维·服务器·网络·网络协议·华为·信息与通信·信号处理
逻辑诗篇9 天前
基于AMD XC7K325T的信号处理板
信号处理
阿尔泰科技官方9 天前
精准捕捉・高速传输 —— 24位采集+千兆以太网,全场景动态信号采集优选方案!
自动化测试·科技·自动化·信号处理·数据采集卡
stars-he9 天前
数字信号处理实验(1)-抗混叠滤波器
学习·信号处理·dsp开发
I_belong_to_jesus9 天前
信号处理新书推荐-MATLAB信号处理从入门到精通
开发语言·matlab·信号处理