MATLAB多尺度散布熵(MDE)简明实现与应用

MATLAB多尺度散布熵(MDE)简明实现与应用

一、核心原理

多尺度散布熵(Multiscale Dispersion Entropy, MDE)通过多尺度粗粒化散布熵(DE) 分析时间序列复杂度,步骤如下:

  1. 多尺度粗粒化:对原始信号用不同尺度因子s(窗口大小)进行滑动平均,得到降采样序列;
  2. 单尺度散布熵(DE):对粗粒化序列,通过嵌入映射、模式量化、概率统计计算熵值,量化信号随机性。

二、MATLAB核心代码实现

1. 单尺度散布熵(DE)计算

function de = dispersionEntropy(x, m, c, tau)
    % 输入:x(序列), m(嵌入维度), c(类别数), tau(延迟时间,默认1)
    % 输出:de(散布熵值)
    x = x(:)'; N = length(x);
    if N < m*tau, error('序列过短!'); end
    
    % 1. 嵌入映射(m维向量)
    Y = zeros(N - (m-1)*tau, m);
    for i = 1:m
        Y(:,i) = x(1 + (i-1)*tau : N - (m-i)*tau);
    end
    
    % 2. 散布模式量化(映射到1~c类)
    ymin = min(x); ymax = max(x);
    if ymax == ymin, de = 0; return; end  % 常数序列熵为0
    Z = ceil(c*(Y - ymin)/(ymax - ymin));  % 量化到[1,c]
    Z(Z>c) = c; Z(Z<1) = 1;  % 边界修正
    
    % 3. 统计模式概率(字符串编码模式)
    patterns = cell(1, size(Z,1));
    for i = 1:size(Z,1)
        patterns{i} = sprintf('%d', Z(i,:));  % 如[1,3,2]→"132"(紧凑编码)
    end
    [unique_pats, ~, ic] = unique(patterns);
    prob = histcounts(ic, 1:length(unique_pats)+1)/length(patterns);  % 概率分布
    
    % 4. 计算熵值(避免log(0))
    de = -sum(prob .* log(prob + eps));  % eps防数值溢出
end

2. 多尺度粗粒化

function y = coarseGrain(x, s)
    % 输入:x(原始序列), s(尺度因子)
    % 输出:y(粗粒化序列,窗口平均)
    x = x(:)'; N = length(x);
    y = zeros(1, floor(N/s));  % 粗粒化后长度
    for k = 1:floor(N/s)
        y(k) = mean(x((k-1)*s + 1 : k*s));  % 窗口[s(k-1)+1, sk]平均
    end
end

3. 多尺度散布熵(MDE)主函数

function mde = multiscaleDE(x, s_max, m, c, tau)
    % 输入:x(原始序列), s_max(最大尺度), m(嵌入维度), c(类别数), tau(延迟时间)
    % 输出:mde(1×s_max向量,mde(s)为尺度s的DE值)
    mde = zeros(1, s_max);
    for s = 1:s_max
        xs = s==1 ? x : coarseGrain(x, s);  % s=1为原始序列,否则粗粒化
        mde(s) = dispersionEntropy(xs, m, c, tau);
    end
end

三、应用示例:合成信号分析

1. 生成测试信号(低频趋势+正弦波+噪声)

fs = 1000; t = 0:1/fs:10; N = length(t);  % 10秒,1000Hz采样
x = 0.5*t + 2*sin(2*pi*2*t) + 0.8*randn(1,N);  % 趋势+2Hz正弦+噪声

2. 计算MDE并可视化

% 参数设置
s_max = 10;  % 最大尺度(1~10)
m = 2;       % 嵌入维度(模式长度)
c = 5;       % 散布类别数(1~5)
tau = 1;     % 延迟时间

% 计算MDE
mde = multiscaleDE(x, s_max, m, c, tau);

% 可视化
figure;
subplot(2,1,1); plot(t, x); 
xlabel('时间(s)'); ylabel('幅值'); title('原始信号(趋势+正弦+噪声)');
subplot(2,1,2); plot(1:s_max, mde, 'ro-', 'LineWidth', 1.5);
xlabel('尺度s'); ylabel('MDE值'); title('多尺度散布熵曲线');
grid on;

参考代码 matlab多尺度散布熵 www.youwenfan.com/contentcss/51172.html

四、结果解读

五、参数选择建议

参数 推荐取值 说明
嵌入维度m 2~5 m过大增加计算量,过小丢失信息
类别数c 3,5,7(奇数) 类别过多抗噪差,过少分辨率低
尺度s_max floor(N/10)(N为序列长) 避免粗粒化后序列过短(至少含m个点)
延迟τ 1(默认) 非均匀采样时可调整(如τ=2)

六、工程应用注意事项

  1. 抗噪处理:信号含强噪声时,先小波去噪或中值滤波;
  2. 常数序列:若序列为常数(ymax=ymin),DE=0(无需计算);
  3. 实时性:序列较长时,用histcounts替代unique+strcmp加速统计。

专注于matlab/simulink,电子电路,编程