简介:针对传统VMD必须预设模态数量、难以适应复杂生理信号的痛点,SVMD信号分解工具包利用频谱紧凑性准则自动确定最优模态数,实现免设K值的全自动分解与自动收敛,面向信号处理与EEG/ECG分析等科研、工程场景。压缩包共10个文件、约745KB,包含MATLAB核心脚本与一键测试脚本、Python版本实现、真实EEG/ECG数据(mat格式)以及依赖列表和开源许可说明,兼容主流MATLAB版本。目前已有34人学习下载。内置的test_svmd.m脚本可直接加载自带实测数据验证分解效果;相比标准VMD,该实现计算开销更低、对中心频率初值不敏感,鲁棒性更强,并附有明确的开源许可条款,适合科研复现、算法对比及嵌入生理信号预处理流程。
1. 先别急着定K值:SVMD把变分模态分解的"玄学参数"拿掉了
用过VMD的人都有过这种经历:拿到一段EEG信号,先得猜里面大概有几个节律,K=3还是K=5,多试几次,每次跑出来的模态都不一样。SVMD信号分解工具包就是冲着这个痛点来的——它不要求你预设模态数,靠逐次提取加自动收敛把分解过程做完,同时还附带EEG和ECG实测数据,装上就能验证效果。这篇文章不是复读官方文档,我按自己折腾这类工具包的路径来讲:先搞懂它凭什么跟VMD对着干,再把最小调用跑通,然后逐个参数试一遍,最后把实测数据用起来,顺带把那些不收敛、模态重叠的翻车点一个一个排掉。适合正在做生理信号分析、故障诊断或振动信号处理的工程师,尤其是对模态分解感兴趣但被K值折磨过的人。
2. SVMD的核心逻辑:不是"一次拆K个"而是"一次剥一个"
2.1 逐次提取与自动停机的原理
VMD把信号一次性分解成K个窄带模态,K定错了,整锅汤味道都不对。SVMD(Successive Variational Mode Decomposition)走的是另一条路:每次只提取一个模态分量,然后把模态从信号里减掉,在残差上继续找下一个模态。关键在停机条件——它不靠人指定模态个数,而是监测残差里的可分解能量比例。如果残差只剩噪声或者能量已经低于你给的阈值,算法自动判断"没料了",停止分解。
这个逐次剥离的思路,本质是把"多目标联合优化"拆成"单目标串行优化"。VMD要同时让K个模态的带宽之和最小,变量多,目标函数容易陷入局部极值;SVMD每次只有一个模态参数要优化,收敛路径简单得多。代价是串行结构会带来累计误差,前面的模态提取不干净,后面的都会被污染。因此工具包内部会做一个类似"再正交化"的后处理,把已提取的模态和当前模态做正交投影,把历史泄漏给滤掉。
实现这个逻辑的时候,信号被表示成解析信号,利用希尔伯特变换构造约束变分问题。每次从残差里选取当前能量最大的分量作为初始中心频率,然后更新频带边界。这样K值不复存在,"模态数自动定"其实是"模态数被算法按残差能量自己定"。在频域视角下,SVMD的行为类似一个自适应的带通滤波器组,依次切出信号的主要频带。
2.2 和EMD、VMD放在一起怎么选
很多人在EMD、VMD和SVMD之间犹豫,不是因为他们不知道公式,而是不知道各自适合什么信号。EMD是纯数据驱动,不需要任何参数,但模态混叠严重、端点效应明显,特别是在EEG这种低幅值高频成分被强背景干扰淹没的时候,第一层IMF往往都是噪声。VMD需要设K和惩罚系数gamma,好处是分解结果对噪声不那么敏感,坏处是你要么经验丰富,要么得拿一堆候选K值去试。
SVMD的定位恰好落在这两者中间:不需要设K,但保留了VMD数学上的严谨结构。它对参数的依赖主要集中在gamma和收敛公差上,而不是模态数。工具包本身自带EEG和ECG数据,说明开发者最初就是奔着生理信号去设计的。生理信号恰恰是EMD最头疼的场景——基线漂移、电极伪迹、工频干扰叠在一起,EMD很容易把真实节律拆散。SVMD的串行提取机制遇到这种复杂信号时,每次只从最大能量分量入手,实际上相当于先剥离大尺度基线,再逐步细化,最后剩的一点残差就是噪声。
如果在做轴承故障诊断这类窄带冲击信号,VMD的K值反而好估,因为故障特征频率就那么几个,SVMD的优势不突出。但一旦面对"你不知道信号里到底有几层"的数据,比如脑电、肌电、振动台混合响应,SVMD就是少操一份心的选择。我一般会这么判断:能大致说出有几个频率成分,直接用VMD;完全没谱,先跑一遍SVMD看它给出几个模态,再回头用这个数量当VMD的K初值,两手都试。
2.3 工具包的典型文件结构
这类信号分解工具包在MATLAB生态里最常见,通常压缩包解压后会包含主函数、参考信号集、示例脚本和一份简短的说明。主函数一般接收三个入参:原始信号、采样频率和参数结构体,返回的是模态矩阵、中心频率数组和分解报告。示例脚本通常会调用合成信号或者实测数据,画出一个多行子图,展示每个模态的时域波形。EEG和ECG实测数据通常以.mat格式给出,里面包含data矩阵和fs标量,可能还有一个标记类型字段。动手之前先把目录结构看清楚,因为有的版本把svmd主函数放在子目录里,直接运行示例脚本会因路径问题报错。
% check_toolbox_path.m % 解压后先执行这个,确认主函数和实测数据都在路径上 clc; svmdPath = fileparts(mfilename('fullpath')); addpath(genpath(svmdPath)); % 把工具包整个目录加入搜索路径 which svmd % 打印svmd函数绝对路径,确认能找到 d = dir(fullfile(svmdPath, '**/*.mat')); % 列出所有mat数据文件 for i = 1:length(d) fprintf('%s\n', fullfile(d(i).folder, d(i).name)); end这段代码的意义在于把"环境问题"和"算法问题"隔离开。很多刚接触工具包的人把脚本报错当成算法问题,结果折腾半天发现是当前工作目录里根本没有svmd这个函数。addpath(genpath(...))一般能覆盖所有子目录,但如果你的MATLAB版本较老,genpath对中文目录名的支持偶尔抽风,把整个工具包放到纯英文路径下运行能避免这类麻烦。dir那一段用来确认实测数据是不是真的随包一起到了你手上,数据文件缺失时问题往往出在传输过程中被安全软件拦截。
3. 最小调用跑通:用合成信号验证工具包是否正常
3.1 构造多分量合成信号
先用合成信号把SVMD的行为摸清楚是最稳妥的办法。合成信号的好处是每个分量的频率和幅值都是你预先定义好的,分解完可以直接对照。我习惯构造一个包含三个正弦分量加白噪声的测试信号:一个50 Hz的低频分量、一个120 Hz的中频分量、一个5 Hz的慢变趋势项。之所以加一个5 Hz的慢分量,是要模拟生理信号里的基线漂移。很多人在验证时只放等幅正弦,那测不出工具包对幅值差异的处理能力。
% synthetic_svmd_test.m % 构造合成信号并用SVMD分解,验证是否分解出预置的3个分量 fs = 1000; % 采样率1000 Hz N = 2000; % 2秒数据 t = (0:N-1)/fs; x = 0.5*sin(2*pi*5*t) ... % 慢变基线 + 1.5*sin(2*pi*50*t) ... % 主分量 + 0.8*sin(2*pi*120*t) ... % 高频分量 + 0.1*randn(1, N); % 白噪声 opts.gamma = 0.1; % 带宽惩罚系数 opts.init = 1; % 1=从残差中自动找主分量 opts.tol = 1e-7; % 收敛容差 opts.max_Iter = 300; % 最大迭代次数 [modes, center_freq, info] = svmd(x, fs, opts); figure; for k = 1:size(modes, 1) subplot(size(modes, 1), 1, k); plot(t, modes(k,:)); ylabel(sprintf('M%d %.2fHz', k, center_freq(k))); end xlabel('时间/s');执行完这个脚本之后,正常的输出应该有3个模态,它们的中心频率分别落在5 Hz、50 Hz和120 Hz附近。center_freq数组就是每个模态在迭代结束时收敛到的归一化中心频率。判断工具包正常的标准有两层:第一,模态数等于3,不多不少;第二,三个模态的时域波形没有出现互相混叠,比如50 Hz那个模态里不应该看到明显的120 Hz波纹。
3.2 输出结果的解读逻辑
很多人的困惑在于"分解出来之后干什么"。SVMD返回的modes矩阵,每一行对应一个模态,行数就是算法自己定出来的模态数。center_freq和modes的行一一对应,info里通常包含每次迭代的目标函数值,判断收敛质量就靠它。如果info显示迭代到max_Iter上限还没停,说明参数设置不当,不是工具包坏了。
在解读结果时还要注意一点:SVMD的模态并不像傅里叶变换那样严格正交,相邻模态的频带之间可能存在轻微交叠。如果两个模态的中心频率相隔很近,比如分解出48 Hz和52 Hz两个模态,就要警惕是不是gamma设小了导致过分解。合成信号的价值此时就体现出来——你明知道原信号里只有一个50 Hz分量,却分解出两个,那过分解的判断就成立了。
% inspect_result.m % 快速检查:打印模态数、中心频率、迭代情况 fprintf('模态数量:%d\n', size(modes, 1)); for k = 1:size(modes, 1) fprintf('模态%d: 中心频率 %.2f Hz, 能量占比 %.2f%%\n', ... k, center_freq(k), ... 100*sum(modes(k,:).^2)/sum(x.^2)); end if isfield(info, 'iter_times') fprintf('各模态迭代次数:%s\n', mat2str(info.iter_times)); end这段检查代码在后续换成EEG和ECG实测数据时特别有用。能量占比衡量每个模态在总体信号中的贡献度,如果第一模态能量占比超过90%,后面几个模态能量占比低到1%以下,那这些后出模态多半是噪声或边界效应导致的伪分量,可以考虑丢弃或调整参数重新跑。
3.3 关于函数名的兼容提示
不同来源的SVMD实现,主函数命名可能不一样,有的叫svmd,有的叫SVMD1,有的为了和VMD工具箱区分会加后缀。实际下载解压之后,先看主函数开头几行注释,确认入参顺序是(x, fs, opts)还是(x, opts, fs)。这两种顺序我都遇到过,压错入参的表现非常典型:第一个参数被当成采样率,返回的全是NaN或者直接报"找不到变量"。一旦遇到这类错误,第一反应不是调参,而是去看函数签名。另外,如果下载到的是基于VMD改进的变形版本,输入参数里可能多一个"预分解层数"的选项,那个并不是模态数,而是控制内部迭代的辅助量,别被带偏。
4. 四个必调参数:gamma、init、tol、max_Iter的真实作用
4.1 gamma:频带惩罚系数,核心中的核心
SVMD里最敏感的参数就是gamma,它控制的是模态频率带宽的惩罚强度。gamma越大,算法倾向于提取更窄的频带,模态数量会变多;gamma越小,频带越宽,几个成分容易被合并成一个模态。这个规律和VMD一脉相承,因为在变分框架下,gamma本身就是约束项前的权重。
对于EEG这种宽频带信号,gamma设得太大会把alpha节律拆成好几个窄带碎片;设得太小又会让theta和alpha混在同一模态里。工具包自带的实测数据如果跑不出理想效果,先别怀疑数据质量,把gamma往下调一个数量级试试。我通常的经验是:合成信号用0.1起步,EEG用0.05到0.2之间试探,ECG因为QRS波群频带较宽,gamma要更小,常见做法是取0.01到0.05。这个参数没有唯一正解,但缩小搜索范围很快。判断标准也很直接——看分解出来的模态在频谱上是否边界清晰、无大片重叠。
4.2 init:主分量初始位置的选择策略
init控制的是每一轮迭代从哪里开始找模态。init等于1时,算法从当前残差中能量最大的频段开始提取,等于2时可能从上一个模态的中心频率邻域继续搜索。工具包默认基本都是1,因为逐次分解天然就是要先抓大头。但如果信号里噪声能量特别强,噪声频段的能量可能超过实际信号分量,此时从最大能量开始会让第一个模态变成噪声。遇到这种情况就把init改为2,从已找到的模态频率附近继续拓展。
实际经验是:EMG肌电信号因为频带宽、能量不集中,init=1很容易先拆出高频噪声;ECG在采集质量较差时也有类似问题。我在处理这类数据时会先看中心频率——如果第一个模态的中心频率在200 Hz以上,而这对生理信号来说明显不靠谱,就切换到init=2再跑。对比两次分解的结果,很多伪影模态在init=2时不会再出现。
4.3 tol与max_Iter:控制自动收敛的闸门
tol是相邻两次迭代结果的相对变化量,低于这个值就认为收敛。max_Iter是保险丝,防止算法进入无限循环。正常情况下SVMD每个模态迭代几十轮就能收敛,如果你发现所有模态的迭代次数都贴在max_Iter上,那就是没收敛,此时强行用分解结果是没有意义的。
工具的"自动收敛"本身不保证结果质量,收敛只说明目标函数稳定了,不代表模态就是物理真实的。我自己的习惯是把tol先设成1e-7跑一遍,如果迭代次数普遍超过200,就逐步放宽到1e-6或1e-5。综合看,max_Iter设置300足够,真正的问题几乎都出在gamma和init上。这组参数的调整顺序也值得养成习惯:先定gamma,再看init,最后动tol。倒过来调,经常会陷入"改了A不好、改回A再改B"的反复。
4.4 参数组合的一个参照表
这里给一组我自己常用的起点参数,覆盖不同信号类型,方便你直接复制去试。需要注意这组参数是实践总结,不是工具包页面上抄来的官方推荐,具体效果因信号而异,但至少能让你在陌生数据上有个起步点。
| 信号类型 | gamma | init | tol | max_Iter | 备注 |
|---|---|---|---|---|---|
| 合成多正弦+噪声 | 0.1 | 1 | 1e-7 | 300 | 快速验证用 |
| EEG单通道 | 0.05~0.15 | 1或2 | 1e-7~1e-8 | 500 | 注意不要拆出高频伪影 |
| ECG单通道 | 0.01~0.05 | 1 | 1e-7 | 400 | QRS形态会因gamma变大失真 |
| 振动信号 | 0.01~0.1 | 1 | 1e-6 | 300 | 依据故障频率带宽微调 |
EEG和ECG在参数上的差异主要来自信号本身的频带宽度。EEG的节律集中在0.5到40 Hz,且theta、alpha、beta频带之间边界模糊,需要稍微宽松的带宽,所以gamma不宜太小。ECG的QRS波群能量集中在10到40 Hz,但形态很陡峭,gamma取太小会把QRS拆成好几个小模态,取太大又会让T波和P波被边缘化。如果你经验不足,拿上面这张表直接起步,再做小范围扫描,比从0开始瞎试要快很多。
5. 自带EEG和ECG实测数据:一次把工具包的定位跑明白
5.1 数据文件怎么用
工具包附带的实测数据下载之后,一般会分成两组:一组是EEG,一组是ECG。加载方式没什么特殊,用load命令就能把它们读进来。关键是理解这些数据为什么被作者选作示例——EEG是非平稳、非线性的典型代表,且噪声采集成因复杂;ECG则是周期性较强但仍包含随机变化的信号。这两类数据放在一个工具包里,等于给了你一整套"参数普适性"的测试平台。先用它们验证工具包行为,再换自己的数据,会省很多诊断时间。工具包自带的.mat文件内部变量命名不统一,有的叫data、有的叫sig、有的叫x,先执行whos命令把变量名打出来,再决定怎么取值。如果一上来就写load之后直接引用变量名,报"变量不存在"的概率很高,这不怪工具包,只能说自己没先检查一下。
5.2 对EEG分解的实操:看alpha节律是否独立成形
脑电分解的目标是对频带做"自然的"划分。清醒闭眼状态下的EEG中,alpha节律应该集中出现在8-13 Hz,且不应该被拆到两个相邻模态里。用SVMD分解EEG时,重点观察中心频率落在alpha频段的那个模态,看它的时域波形有没有明显的梭状调制——alpha节律的振幅是忽大忽小的,如果分解出来是一个匀速正弦,那说明过分解或频带被切坏了。直接对实测EEG跑SVMD,日常做法是先降采样到250 Hz或500 Hz,再做一个0.5到40 Hz的带通滤波,把电极直流偏移和工频干扰先砍掉,减轻SVMD的分离负担。
% eeg_demo_run.m % 用自带的EEG数据体验SVMD的实际效果 load demo_eeg.mat; % 假设解压后是demo_eeg.mat vars = whos('-file', 'demo_eeg.mat'); % 先看文件里有啥变量 x = demo_eeg.data; % 按实际变量名改写 fs = demo_eeg.fs; x = double(x(:)'); % 转成行向量,保证维度正确 x = x - mean(x); % 去直流 x = bandpass(x, [0.5 40], fs); % 限制在生理EEG频带 opts.gamma = 0.1; opts.init = 1; opts.tol = 1e-8; opts.max_Iter = 500; [modes, cf, info] = svmd(x, fs, opts); % 只打印中心频率,快速判断分解是否合理 cf这脚本里几个细节值得标注:x转成行向量是因为svmd对输入方向的敏感度不同,有的版本按行向量处理,你用列向量输入会导致模态数量正确但波形全是翻转的;带通滤波这一步不但能提升分解速度,还能防止SVMD在50 Hz工频上去浪费模态。运行完如果中心频率出现大量分布在40 Hz以上且能量极低的模态,大概率是gamma太小造成过分解,把gamma往0.2提,或者把bandpass的上限再收紧一些。看到cf和bandpass完全不匹配时,先检查是否忘了滤波后的x直接喂给svmd函数,而不是原信号。
5.3 对ECG分解的实操:别把QRS波群切碎了
ECG分解和EEG的算法逻辑完全一致,但评判标准完全不同。EEG你可以容忍拆出多个窄带节律,ECG一旦分解不当,QRS波群会被拆开,医学特征完全失去意义。ECG的理想分解在实践中可以这样理解:P波、QRS波群、T波分别落在不同模态里,或者至少P波和T波集中在一个低频模态,QRS保持独立。SVMD处理ECG时,常见行为是先提取一个能量占绝对主导的模态——大致上是QRS的主体,然后再慢慢提取ST段和T波成分。
我在处理ECG数据时一般会把gamma降到0.02附近,这个值能保留QRS的陡峭边沿。tol从1e-7改成1e-6,因为ECG不需要EEG那么高的频带分离精度,放宽一点反而让波形保真度更高。跑完之后不要只看中心频率,一定要叠加原始信号和模态波形看一遍,确认QRS的尖峰幅值没有出现明显削顶。如果模态1的波形在R波位置出现双峰,说明过分解了,gamma往上调;如果QRS和T波叠在同一个模态里,gamma往下调。这就是ECG分解和EEG分解最大的差别——EEG允许模态边界模糊,ECG的波形形态本身有诊断价值,不能破坏。自带数据最大的贡献是让你在真实信号上看到"分解参数和波形形态"的耦合关系,而不是面对合成信号那种"分解对了就行"的幻觉。
6. 踩坑经验:SVMD用久了的几个翻车点
6.1 模态重叠:相邻模态几乎长得一样
不加控制地使用SVMD最常会遇到的情况是:分解出两个中心频率极为接近的模态,波形相关性超过0.9,肉眼几乎无法区分。造成这种现象的原因通常是gamma设置过大,频带惩罚太狠,把一个完整的频率成分硬切成两半。另外,如果信号本身频率成分连续,比如扫频信号,SVMD会按频带切片式地输出一连串相邻模态,这不是bug,而是算法对连续谱的响应方式。处理办法很直接:把gamma减小一个数量级再跑,然后看两个模态的中心频率间隔是否拉开;如果间隔仍然很小,直接用中心频率聚类的办法把相似模态合并。我也见过因为max_Iter不够导致模态没收敛干净而产生重复模态的情况,把迭代上限翻倍先排除这个可能。
6.2 过分解:一个正弦被拆成三个
合成信号里测试得好好的,换成实测数据就过分解,这个问题在EEG上最容易出现。现象是alpha节律被拆成9 Hz、10 Hz、11 Hz三个模态,每个都有能量但都是碎片。根因是实测数据非平稳,alpha节律的频率本身在缓慢漂移,SVMD把它当成多个窄带模态分别处理。解决思路不是强行调参数让算法出一个模态,而是接受"频率漂移导致模态分裂"的现实,改用滑动窗口分段分解,每段2秒,看中心频率有没有连续性。如果每段分解出来的alpha频率都在同一位置,那是gamma问题;如果每段都在缓慢移动,那是信号本身的非平稳性,合并模态即可,不要牺牲其他频带的分解质量去换alpha的完整。
6.3 第一个模态就是噪声,信号分量反而在后面
EMG噪声或电极接触不良导致的瞬态尖峰,能量可能远大于脑电节律,SVMD的init=1会先把最大能量的噪声分量提出来。表现在结果上,就是第一个模态看起来像杂乱毛刺,且中心频率在200 Hz以上。我在一次处理肌电混入的脑电数据时遇到过这情况,第一模态全是用电噪声,后面的模态里才有alpha节律。解决办法是先把信号过一次幅度阈值检测,找到并移除明显的瞬态伪迹,或者直接把init设为2,让算法从低频侧开始搜索生理节律。如果噪声频带和目标信号频带确实重叠,调参数救不了,只能换数据重新采集。工具包自带实测数据基本没有这类劣质伪迹,所以新手很难提前意识到这个问题,等拿到自己采集的数据时才发现坑有多深。
6.4 不收敛:迭代次数全部贴着max_Iter
Gamma设得太小,每次剥离的频带太宽,模态边界一直变,目标函数振荡,迭代停不下来。遇到这种情况,检查两个地方:一看info里的迭代次数与max_Iter的比值,如果普遍超过0.9,直接判定不收敛;二看目标函数值序列,如果震荡而不是单调下降,也说明参数失配。我的处理是先把tol放宽到1e-5,让算法更容易满足停机条件,再用这个结果做参考,把gamma调大,之后再看是否需要收紧tol。实际测试中,tol放宽到1e-5损失的频率精度多在0.1 Hz量级,对大多数工程分析完全可以容忍,但能显著提升收敛成功率。这条经验可以省下大量等待时间。
6.5 多通道数据直接喂进去,结果一团糟
SVMD核心处理函数默认输入是单通道行向量,把多通道EEG矩阵直接传进去,有的版本会报错,有的版本不会报错但把通道当时间维处理,出来的模态数量多到离谱。我见过有人拿64通道数据直接跑SVMD,得到60多个"模态",每个都不成样子。正确做法是写一个循环,逐通道分解,或者用cell数组把各通道结果存起来。如果工具包内部有并行化的多通道接口那也是另一套输入格式,不要混用。多通道分解时还要注意各通道的gamma是否需要单独调整,眼电伪迹严重的通道和干净的枕区通道,能量分布完全不同,共用一套参数会导致部分通道过分解。实践中最稳的方案是先用一个代表性通道调参,然后全通道统一用这套参数跑,个别差异大的通道单独重调。
7. 进阶技巧:用分半重测法验证SVMD分解结果到底可不可信
模态分解这类无监督方法的软肋是:结果看起来有序,但你也说不准它是不是把噪声也当成了模态。我现在的习惯是拿到一批信号后,不急着分析,先做一次分半重测。具体做法是:把一段EEG或ECG信号从中间切一刀,前一半、后一半分别用同一组参数跑SVMD,然后对比两半分解结果的中心频率和波形。如果两半分解出的模态数和中心频率基本一致,说明算法抓到了信号里的稳定结构,结果可信;如果两半给出的模态数量和频率差异很大,说明你设的参数正在拟合这段数据的局部噪声。
验证时对比的不是波形本身,而是模态的尺度特征。把前一半分解出的模态中心频率排个序列,和后一半的序列放在一起,对应位置的偏差应该在可接受范围内,比如中心频率落在同一频带内。对于EEG来说,前后两半在alpha频带的中心频率偏差通常不应超过0.5 Hz;对于ECG,QRS模态的波形相关系数应该高于0.9。如果达不到这个标准,别急着改参数,先回想一下数据段里有没有明显的非平稳事件,比如患者身体移动或电极松动。分段越长,两半结果的一致性未必越好,因为长段里面包含更多的非平稳变化,所以实际操作中我一般取每段10到20秒做分半。这条技巧做完,你对SVMD这套参数在某个新数据集上的信心会完全不一样。
使用SVMD的综合判断在我心里已经变得很简单:分解只是第一步,验证才是真正的门槛。任何无监督信号分解工具都会给你一个看起来合理的输出,但那个输出到底能不能在下一个数据集上复现,取决于你花了多少时间确认它的稳定性和可解释性。我自己曾因为偷懒,在拿到一批新EEG数据时直接套用了上一批的gamma和init,结果把alpha拆得七零八落,后来才发现是忘了重新检查参数。从那次以后,不管多着急,我都会先在2秒和10秒两种尺度上快速目测一遍分解结果,再决定是否继续往下做。希望这些经验能帮你在用SVMD时少走几条弯路。
本文还有配套的精品资源,点击获取