MATLAB实现EEMD信号去噪:原理、流程与参数调优实战
2026/9/4 3:23:39 网站建设 项目流程

简介:本资源是一套面向本科及硕士阶段信号处理教学与科研实践的EEMD(集合经验模态分解)信号去噪完整实现方案,聚焦非平稳、非线性信号中噪声抑制这一典型问题,适用于数字信号处理课程设计、毕业设计及基础科研建模场景。压缩包共6个文件,含3个MATLAB主程序文件(.m)——涵盖核心EEMD分解、极值点检测与主程序调用逻辑,以及3张关键结果可视化图(.png),直观展示原始含噪信号、EEMD分解分量及去噪后重构效果,便于理解算法流程与性能评估。资源体积精简,仅58KB,开箱即用,适配MATLAB 2019a环境,已通过实际运行验证。目前已有1576人学习下载,配套代码结构清晰、注释完整,包含参数设置说明与典型调用范例,可直接用于算法复现、对比实验或作为EEMD原理教学的辅助实例。

1. 项目背景与EEMD算法核心思想

信号去噪是信号处理领域一个经典且永恒的话题,无论是处理生物医学信号里的心电、脑电,还是分析机械振动信号、金融时间序列,我们总希望从被噪声污染的观测数据中,提取出干净、有用的原始信号。传统方法,比如傅里叶变换配合各种滤波器(低通、高通、带通),或者小波变换,大家应该都用过。它们各有优势,但面对非平稳、非线性的信号时,往往力不从心,要么滤不干净,要么把有用信号也一起滤掉了。这就好比用一把固定大小的筛子去筛一堆形状各异的豆子,总有些豆子要么漏不下去,要么不该漏的也漏下去了。

今天要聊的EEMD(Ensemble Empirical Mode Decomposition,集合经验模态分解),就是为解决这类问题而生的一个“聪明”工具。它脱胎于更基础的EMD算法。EMD的核心思想很直观:它认为任何复杂信号都是由一系列简单的、频率由高到低的“本征模态函数”(IMF)和一个残余趋势项叠加而成的。EMD就像一个自动化的“筛分”过程,能把信号一层层剥开,得到这些IMF。这个想法很棒,但EMD有个致命的“模态混叠”问题:信号中不同时间尺度的成分可能会混在同一个IMF里,或者同一个时间尺度的成分被分到了不同的IMF里。这就像筛豆子时,大小豆子混在了一个格子里,后续处理就麻烦了。

EEMD的提出,就是为了抑制这种模态混叠。它的策略非常巧妙,借鉴了统计学里“多次实验取平均以消除随机误差”的思想。EEMD并不直接对原始信号做分解,而是先往信号里加入许多次微小的、不同分布的白噪声。然后,对每一个“加噪”后的信号独立进行EMD分解。由于每次加入的噪声是随机的,它对信号造成的扰动也是随机的。最后,将所有这些独立分解结果中,对应阶次的IMF取平均值。理论表明,加入的噪声在多次平均后会相互抵消,而信号本身的稳定结构则会被保留并凸显出来。这样一来,由信号间歇性或不连续性引发的模态混叠问题,就被大大缓解了。你可以把它想象成,我们不是用一把筛子筛一次,而是用很多把略有不同的筛子(加入不同噪声)各筛一次,然后把所有结果平均,这样得到的分层结果就稳定、准确多了。

基于这个特性,EEMD在信号去噪上就有了天然的优势。噪声通常表现为高频、随机、不稳定的成分,在EEMD分解后,它们会主要集中在前几个IMF中。我们只需要识别并剔除这些“噪声主导”的IMF,然后用剩下的IMF和残余项重构信号,就能达到去噪的目的。这种方法是一种“自适应”的滤波,因为它完全由数据本身驱动,不需要预先设定基函数(如小波基)或截止频率,特别适合处理我们事先不太了解其特性的复杂信号。

2. EEMD去噪流程的完整拆解与MATLAB实现要点

理解了EEMD的思想,我们来看看如何用MATLAB一步步实现基于EEMD的信号去噪。这个过程可以清晰地分为几个阶段:数据准备、EEMD分解、噪声IMF识别与阈值处理、信号重构。下面我结合代码和实际经验,详细拆解每个环节。

2.1 数据准备与EEMD核心参数设置

首先,我们需要一个待处理的信号。为了演示,我们可以合成一个包含真实成分和噪声的信号。比如,一个由两个不同频率的正弦波叠加,再加上高斯白噪声。

% 1. 合成仿真信号 fs = 1000; % 采样频率 1000 Hz t = 0:1/fs:1; % 1秒时间向量 f1 = 5; % 低频成分 5 Hz f2 = 50; % 高频成分 50 Hz signal_clean = sin(2*pi*f1*t) + 0.5*sin(2*pi*f2*t); % 干净信号 noise = 0.8 * randn(size(t)); % 高斯白噪声,强度0.8 signal_noisy = signal_clean + noise; % 含噪信号 % 绘制原始信号与含噪信号 figure; subplot(2,1,1); plot(t, signal_clean); title('原始干净信号'); xlabel('时间 (s)'); ylabel('幅值'); subplot(2,1,2); plot(t, signal_noisy); title('添加噪声后的信号'); xlabel('时间 (s)'); ylabel('幅值');

接下来是EEMD的核心参数。EEMD算法有几个关键参数需要设置,它们直接影响分解效果和计算效率:

  1. 噪声标准差 (Nstd):这是添加到原始信号中的白噪声的标准差。通常设置为原始信号标准差的一个较小比例,比如0.1到0.4倍。噪声太小,抑制模态混叠的效果不明显;噪声太大,可能会污染信号本身。经验上,可以从0.2开始尝试。
  2. 集合次数 (NE):即进行多少次“加噪-EMD-平均”的循环。次数越多,平均效果越好,噪声抵消越充分,结果越稳定,但计算量也线性增加。对于一般信号,100-200次通常能取得不错的效果。如果信号非常复杂或对精度要求极高,可以增加到500次甚至更多。
  3. EMD的最大迭代次数与停止准则:这部分通常封装在EMD函数内部,但需要了解。EMD在提取每个IMF时是一个迭代筛分过程,需要有停止准则(如SD值,连续两个筛选结果的标准差小于某个阈值)来防止无限循环或过度筛选。MATLAB内置的emd函数或一些开源EEMD代码会处理这些。

假设我们使用一个名为eemd的函数(需要自行实现或从社区获取,例如来自MATLAB Central File Exchange的EEMD代码),调用可能如下:

% 2. 设置EEMD参数并分解 Nstd = 0.2; % 噪声标准差设为原始信号标准差的0.2倍 NE = 100; % 集合次数100次 max_imf = 10; % 最大分解IMF数量,防止过度分解 % 调用EEMD函数(假设函数名为eemd,返回IMF矩阵和残余项) [imfs, residual] = eemd(signal_noisy, Nstd, NE, max_imf); % 绘制所有IMF和残余项 figure; for i = 1:size(imfs, 1) subplot(size(imfs,1)+1, 1, i); plot(t, imfs(i, :)); ylabel(['IMF', num2str(i)]); if i==1, title('EEMD分解结果 (各IMF)'); end end subplot(size(imfs,1)+1, 1, size(imfs,1)+1); plot(t, residual); ylabel('Residual'); xlabel('时间 (s)');

注意:MATLAB官方并没有内置eemd函数。你需要从可靠的第三方资源获取,例如MATLAB File Exchange上由Jean-Baptiste Wills等人维护的HHT(Hilbert-Huang Transform)工具包中就包含了eemd的实现。下载后将其添加到MATLAB路径中。务必检查函数对输入输出参数的定义,不同版本的实现可能有细微差别。

2.2 噪声主导IMF的识别:从观察统计量到自动阈值

EEMD分解后,我们得到了一组IMF(imf1, imf2, ...)和一个残余项(residual)。去噪的关键一步,就是判断哪些IMF主要是噪声,哪些主要是信号。

最直观的方法是观察法:绘制所有IMF的图形,通常前几个IMF振荡剧烈、频率高、看起来杂乱无章,这些就是噪声主导的;后面的IMF则更加平滑、有规律,是信号成分。但这种方法主观性强,不适合自动化处理。

更可靠的方法是基于统计特性的自动识别。一个常用且有效的准则是计算每个IMF与原始含噪信号的互相关系数。噪声与原始信号的相关系数通常较低,而信号成分的相关系数较高。我们可以设定一个阈值,比如0.1或0.15,认为相关系数低于该阈值的IMF是噪声。

% 3. 计算各IMF与原始含噪信号的互相关系数,辅助判断噪声IMF num_imfs = size(imfs, 1); corr_coefs = zeros(1, num_imfs); for i = 1:num_imfs R = corrcoef(signal_noisy, imfs(i, :)); corr_coefs(i) = R(1,2); % 取相关系数矩阵的非对角线元素 end % 绘制相关系数图 figure; bar(corr_coefs); xlabel('IMF 序号'); ylabel('相关系数'); title('各IMF与含噪信号的互相关系数'); grid on; hold on; % 画一条参考阈值线,例如0.15 threshold_corr = 0.15; plot(xlim, [threshold_corr threshold_corr], 'r--', 'LineWidth', 1.5); legend('相关系数', ['阈值 = ', num2str(threshold_corr)]); hold off;

另一种方法是分析IMF的能量或方差分布。噪声的能量通常集中在高频(前几个IMF),其能量衰减模式与信号成分不同。可以计算每个IMF的能量(幅值的平方和),观察其随IMF序号的衰减曲线,在曲线出现明显“拐点”或“平台”的地方,可能就是噪声与信号的分界。

% 计算各IMF的能量 energy_imfs = sum(imfs.^2, 2); % 对每一行(每个IMF)求平方和 figure; plot(1:num_imfs, energy_imfs, 'o-', 'LineWidth', 1.5); xlabel('IMF 序号'); ylabel('能量'); title('各IMF能量分布'); grid on;

在实际操作中,我通常会将观察法、相关系数法和能量法结合起来看。例如,先看相关系数图,找到第一个相关系数显著高于阈值的IMF(比如IMF_k),再回头去看IMF_(k-1)和IMF_k的波形,确认分界点是否合理。有时,对于非常微弱的信号或特定类型的噪声(如脉冲噪声),可能需要更复杂的判据,比如基于IMF包络线特性或信息熵的方法。

2.3 阈值处理与信号重构:细节决定成败

确定了噪声IMF(假设是前k-1个)后,最简单的去噪方法就是直接丢弃这些IMF,用剩下的IMF(第k个到最后)加上残余项来重构信号。

% 4. 假设通过分析,判定前2个IMF为噪声主导 noise_imf_index = 2; % 前2个IMF是噪声 signal_denoised_eemd = sum(imfs(noise_imf_index+1:end, :), 1) + residual;

但是,直接丢弃可能过于“粗暴”。因为被判定为“噪声主导”的IMF里,可能仍然包含少量有用的高频信号成分(比如信号的边缘或瞬态特征)。一种更精细的做法是对噪声IMF进行阈值处理,而不是直接归零。这类似于小波阈值去噪的思想:对每个噪声IMF的每个数据点,如果其幅值小于某个阈值,就将其置零或收缩;如果大于阈值,则予以保留或衰减。这样可以更好地保留信号中的奇异性或突变点。

阈值的选择是个技术活。常用的有通用阈值(Universal Threshold)、SureShrink阈值等。在EEMD的语境下,可以对每个噪声IMF单独计算阈值,例如基于该IMF的噪声标准差估计(常用中位数绝对偏差MAD来估计)。

% 5. 对噪声IMF进行软阈值处理示例 denoised_imfs = imfs; % 复制一份进行处理 for i = 1:noise_imf_index current_imf = imfs(i, :); % 估计该IMF的噪声水平(基于MAD,对高斯噪声鲁棒) sigma = median(abs(current_imf - median(current_imf))) / 0.6745; % 计算通用阈值,lambda = sigma * sqrt(2*log(N)), N为信号长度 lambda = sigma * sqrt(2 * log(length(current_imf))); % 应用软阈值函数 denoised_imfs(i, :) = sign(current_imf) .* max(abs(current_imf) - lambda, 0); end % 用处理后的所有IMF和残余项重构信号 signal_denoised_threshold = sum(denoised_imfs, 1) + residual;

实操心得:是否使用阈值处理,取决于你的信号和噪声特性。如果噪声是典型的高斯白噪声,且你关心信号的细节特征,阈值处理通常比直接丢弃效果更好,信噪比提升更明显。但如果噪声非常强,或者信号本身很平滑,直接丢弃前几个IMF可能更简单有效。我的建议是,两种方法都试试,用评价指标(如下文的SNR、RMSE)和视觉观察来对比。

最后,绘制去噪前后的对比图,并计算一些定量指标来评价去噪效果。

% 6. 结果可视化与评价 figure; subplot(3,1,1); plot(t, signal_clean); title('原始干净信号'); ylabel('幅值'); grid on; subplot(3,1,2); plot(t, signal_noisy); title('含噪信号'); ylabel('幅值'); grid on; subplot(3,1,3); plot(t, signal_denoised_eemd); title('EEMD去噪后信号'); xlabel('时间 (s)'); ylabel('幅值'); grid on; legend('直接丢弃噪声IMF重构'); % 计算评价指标:信噪比(SNR)和均方根误差(RMSE) function snr_val = calculate_snr(clean, noisy) Ps = sum(clean.^2); Pn = sum((noisy - clean).^2); snr_val = 10 * log10(Ps / Pn); end function rmse_val = calculate_rmse(clean, estimated) rmse_val = sqrt(mean((clean - estimated).^2)); end snr_input = calculate_snr(signal_clean, signal_noisy); snr_output = calculate_snr(signal_clean, signal_denoised_eemd); rmse_output = calculate_rmse(signal_clean, signal_denoised_eemd); fprintf('输入信噪比(SNR): %.2f dB\n', snr_input); fprintf('输出信噪比(SNR): %.2f dB\n', snr_output); fprintf('均方根误差(RMSE): %.4f\n', rmse_output);

3. 参数调优与实战中的关键陷阱

EEMD去噪的效果很大程度上依赖于参数的合理设置。此外,在实际应用中,有几个“坑”如果不注意,很容易导致结果不理想甚至程序出错。

3.1 核心参数Nstd与NE的权衡艺术

噪声标准差 (Nstd)集合次数 (NE)是EEMD最重要的两个旋钮。

  • Nstd的选择:如前所述,通常取0.1~0.4倍信号标准差。一个实用的技巧是,可以先取一个较小的值(如0.1)和一个较大的值(如0.4)分别运行一次,观察分解出的前几个IMF。如果Nstd太小,不同次EMD分解得到的IMF可能仍然存在较大差异(模态混叠抑制不足),表现为IMF曲线看起来不太稳定。如果Nstd太大,虽然平均后稳定,但加入的噪声本身可能开始扭曲信号的固有模态,尤其是在信号幅值较小的区域。对于初学者,从0.2开始是一个安全的起点。
  • NE的选择:更多的NE意味着更好的统计平均效果和更平滑、稳定的IMF,但代价是计算时间成倍增加。这里有一个“收益递减”的规律:当NE从10增加到100时,效果改善非常明显;但从100增加到500,改善可能就微乎其微了,而计算时间却增加了5倍。我的经验是:对于初步探索和大多数应用,NE=100足以提供可靠的结果。如果信号非常短或者对实时性有要求,可以降到50甚至20,但需要接受结果可能有些许波动。如果是在做严格的学术研究或处理极其关键的信号,可以尝试NE=200或500,并在论文中说明此选择。

一个简单的参数敏感性测试代码如下,可以帮助你直观感受影响:

% 参数敏感性测试示例(比较不同Nstd下第一个IMF的差异) nstd_list = [0.1, 0.2, 0.4]; ne = 100; figure; for idx = 1:length(nstd_list) [imfs_test, ~] = eemd(signal_noisy, nstd_list(idx), ne, max_imf); subplot(length(nstd_list), 1, idx); plot(t, imfs_test(1, :)); title(['Nstd = ', num2str(nstd_list(idx)), ' 时的 IMF1']); ylabel('幅值'); if idx == length(nstd_list), xlabel('时间 (s)'); end end

3.2 端点效应与边界处理:不可忽视的细节

EMD/EEMD算法在处理信号时,一个著名的难题是“端点效应”。由于筛分过程在信号的起点和终点缺乏足够的数据来定义极值点,会导致分解出的IMF在两端出现严重的失真,表现为异常的摆动或幅值发散。这种失真会随着分解过程向低频IMF传播,污染整个结果。

在MATLAB中实现或调用EEMD时,必须关注其是否包含了端点效应抑制策略。常见的处理方法有:

  1. 镜像延拓:在信号两端对称地镜像反射一部分数据,作为虚拟的极值点来源,分解完成后再截取中间原始部分。
  2. 极值点延拓:使用多项式拟合或其它预测方法,在边界外推极值点的位置。
  3. 使用具备端点处理功能的EMD代码:许多成熟的第三方EMD实现(如上面提到的HHT工具包中的emd)已经内置了端点处理。确保你使用的eemd函数底层调用的EMD是处理过端点的。

即使底层函数处理了,在去噪重构后,观察重构信号的两端是否平滑、是否与原始信号趋势衔接良好,仍然是一个必要的检查步骤。如果发现端点有畸变,可以考虑在原始信号前后多采集一些数据(哪怕只是用于缓冲),分解后再只取中间有效段。

3.3 计算效率与大规模数据处理的优化

EEMD的计算成本主要来自NE次独立的EMD运算。对于长序列信号(比如数十万甚至上百万个数据点),NE=100次的EMD计算可能会非常耗时。

优化策略

  1. 降低NE:在可接受的结果精度下,使用最小的NE。
  2. 数据分段:对于超长信号,可以考虑将其分成有重叠的段,分别进行EEMD去噪,然后拼接。需要注意重叠区的平滑处理(如使用窗函数加权平均),以避免接缝处的不连续。
  3. 并行计算:EEMD的每次集合成员分解是独立的,这是天然的并行任务。如果你的MATLAB版本支持并行计算工具箱(Parallel Computing Toolbox),可以很容易地用parfor循环替代普通的for循环来加速。这是提升效率最有效的手段之一。
% 使用parfor并行计算EEMD的示例(需要Parallel Computing Toolbox) % 注意:这要求你的eemd函数内部或你写的循环支持并行 NE = 100; imfs_ensemble = cell(1, NE); % 预分配单元数组存储每次结果 parfor ens = 1:NE % 将 for 改为 parfor % 为每次循环生成不同的随机噪声种子,确保噪声独立性 rng(ens); % 设置不同的随机数种子 current_noise = Nstd * randn(size(signal_noisy)); noisy_signal = signal_noisy + current_noise; % 执行EMD分解(假设有一个函数 my_emd) imfs_ensemble{ens} = my_emd(noisy_signal, max_imf); end % 后续再将所有imfs_ensemble中对应阶次的IMF取平均

注意:并行化时,要确保每次循环中加入的噪声是独立的(通过设置不同的随机数种子rng(ens))。另外,并行计算会占用大量内存,如果单次EMD分解产生的数据量很大(很多个IMF),需要预评估内存是否足够。

4. EEMD去噪的进阶应用与效果对比

掌握了基础流程后,我们可以看看EEMD去噪在一些典型场景下的表现,并与其他传统方法做个对比,理解其优劣。

4.1 典型应用场景效果展示

  1. 生物医学信号(如ECG心电信号):心电信号常受到工频干扰(50/60Hz)、肌电噪声和基线漂移的影响。EEMD可以很好地分离出这些成分。通常,工频干扰和肌电噪声会落在前几个IMF中,基线漂移则体现在最后的残余项或最后几个低频IMF中。通过有选择地重构,可以同时实现去噪和基线校正。
  2. 机械振动信号:用于故障诊断的振动信号中,早期微弱的故障特征频率往往被强烈的背景振动和随机噪声淹没。EEMD能够自适应地提取出不同频带的成分,故障特征可能出现在某个特定的IMF中(不一定是第一个),通过分析该IMF的包络谱或频谱,可以更容易地检测到故障。
  3. 金融时间序列:金融数据具有非平稳、非线性的特点。EEMD可以将其分解为不同时间尺度的波动(高频IMF代表短期波动/噪声,低频IMF和残余项代表长期趋势),有助于分别分析和预测。

为了更直观,我们可以用一段实际采集的(或更复杂的仿真)信号来演示。例如,一个叠加了趋势项、不同频率正弦波和脉冲噪声的信号。

% 生成更复杂的测试信号 t = 0:0.001:1; % 1秒,1kHz采样 trend = 0.5 * t; % 线性趋势项 s1 = 2 * sin(2*pi*5*t); % 5Hz低频信号 s2 = 1 * sin(2*pi*100*t); % 100Hz高频信号 % 添加脉冲噪声(随机位置出现大幅值脉冲) impulse_noise = zeros(size(t)); impulse_idx = randi(length(t), 1, 10); % 随机10个位置 impulse_noise(impulse_idx) = 5 * randn(1,10); % 脉冲幅值 gaussian_noise = 0.8 * randn(size(t)); % 高斯白噪声 signal_complex = trend + s1 + s2; signal_noisy_complex = signal_complex + impulse_noise + gaussian_noise; % 应用EEMD去噪 [imfs_c, res_c] = eemd(signal_noisy_complex, 0.2, 100, 10); % 假设通过观察和相关系数,判定IMF1-3为噪声(包含脉冲和高斯噪声) signal_denoised_complex = sum(imfs_c(4:end, :), 1) + res_c; % 对比传统滤波(如滑动平均或中值滤波去脉冲+低通滤波) % 中值滤波去除脉冲 signal_median = medfilt1(signal_noisy_complex, 5); % 窗长为5的中值滤波 % 设计一个低通滤波器滤除高频高斯噪声 lpFilt = designfilt('lowpassiir', 'FilterOrder', 6, ... 'HalfPowerFrequency', 80/(1000/2), ... % 截止频率80Hz 'DesignMethod', 'butter'); signal_lp = filtfilt(lpFilt, signal_median); % 使用零相位滤波 % 绘图对比 figure; subplot(4,1,1); plot(t, signal_complex); title('原始复杂信号(含趋势)'); grid on; subplot(4,1,2); plot(t, signal_noisy_complex); title('添加脉冲和高斯噪声后的信号'); grid on; subplot(4,1,3); plot(t, signal_denoised_complex); title('EEMD去噪结果'); grid on; subplot(4,1,4); plot(t, signal_lp); title('传统中值+低通滤波结果'); xlabel('时间 (s)'); grid on;

通过这样的对比图,你可以清晰地看到EEMD方法在去除脉冲噪声(表现为尖峰)的同时,能更好地保留原始信号的边缘和趋势,而传统线性滤波方法在滤除脉冲时可能会使信号平滑过度或产生畸变。

4.2 与传统去噪方法的对比分析

为了更系统地进行对比,我们可以从几个维度来审视EEMD去噪:

  • 适应性
    • EEMD:完全数据驱动,无需预先设定基函数或滤波器类型。对于非平稳、非线性信号适应性强。
    • 傅里叶滤波:需要预设截止频率,对非平稳信号效果差,容易导致吉布斯现象。
    • 小波去噪:需要选择合适的小波基和分解层数,选择不当会影响效果。但小波也有其优势,如计算效率通常高于EEMD。
  • 噪声类型
    • EEMD:对高斯白噪声、脉冲噪声等多种噪声均有较好效果,尤其擅长处理与信号频带重叠的噪声。
    • 中值滤波:对脉冲噪声特效,但对高斯噪声效果一般。
    • 维纳滤波:需要已知信号和噪声的功率谱,在实际中难以获得。
  • 计算复杂度
    • EEMD:计算量最大,因为涉及多次EMD。长信号+大NE时耗时显著。
    • 傅里叶/小波滤波:计算效率高,尤其是基于FFT的滤波。
  • 保真度
    • EEMD:通过自适应分解,在去噪的同时能较好地保留信号的局部特征(如突变点、边缘)。
    • 线性滤波:可能会平滑掉这些特征,导致信号失真。

选择建议

  • 如果你的信号是平稳的,噪声频带与信号频带分离明显,优先考虑传统的傅里叶滤波或小波去噪,它们更快、更成熟。
  • 如果你的信号是非平稳/非线性的,噪声复杂,并且你更关心信号的局部细节特征,EEMD是强有力的工具,尽管它更慢。
  • 不要神话EEMD。它同样有参数需要调整,端点效应需要处理,计算成本需要考虑。它是在传统方法力有不逮时的“特种武器”,而非“万能钥匙”。

4.3 效果定量评价与指标解读

除了肉眼观察,定量指标至关重要。最常用的有:

  1. 信噪比 (SNR):衡量噪声被抑制的程度。SNR提升越大,说明去噪效果越好。但要注意,如果去噪过程严重扭曲了信号,即使SNR高,也失去了意义。
  2. 均方根误差 (RMSE):衡量去噪后信号与真实干净信号之间的整体偏差。RMSE越小越好。
  3. 相关系数 (CC):衡量去噪后信号与真实信号在波形形状上的相似度。越接近1越好。

对于没有真实干净信号参考的情况(实际应用中最常见),评价会变得困难。可以借助一些无参考评价指标的估计,但可靠性会下降。更多时候,需要结合专业领域知识,从去噪后信号是否更符合物理规律、后续分析(如频谱分析、特征提取)是否更有效等角度进行判断。

% 定量对比EEMD与传统滤波的效果(在有真实信号的情况下) snr_input = calculate_snr(signal_complex, signal_noisy_complex); snr_eemd = calculate_snr(signal_complex, signal_denoised_complex); snr_traditional = calculate_snr(signal_complex, signal_lp); rmse_eemd = calculate_rmse(signal_complex, signal_denoised_complex); rmse_traditional = calculate_rmse(signal_complex, signal_lp); fprintf('========== 定量对比 ==========\n'); fprintf('输入SNR: %.2f dB\n', snr_input); fprintf('EEMD去噪后SNR: %.2f dB (提升: %.2f dB)\n', snr_eemd, snr_eemd-snr_input); fprintf('传统滤波后SNR: %.2f dB (提升: %.2f dB)\n', snr_traditional, snr_traditional-snr_input); fprintf('EEMD去噪RMSE: %.4f\n', rmse_eemd); fprintf('传统滤波RMSE: %.4f\n', rmse_traditional);

运行这段代码,你可以得到一个表格化的数值对比,从而客观地评估在特定信号上哪种方法更优。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询