局部特征尺度分解LCD原理与MATLAB实现:轴承故障诊断实战 简介这份资源面向信号处理方向的学生、科研人员与工程实践者聚焦局部特征尺度分解LCD这一非平稳、非线性信号分析方法。其核心思路是通过三次样条插值构造光滑的内禀尺度分量从而逐层揭示信号在不同尺度下的局部特征可服务于异常检测、模式识别与信号恢复等任务。压缩包共6个文件以5个m脚本为主体另含1个系统隐藏文件整体约6KB体积轻量便于快速阅读与二次开发脚本大致覆盖主分解流程、极值点检测、分量判据与基础线性运算等环节便于读者对照原理逐步理解算法实现。目前已有382人学习下载说明该方向具备一定关注度。对于希望用MATLAB复现LCD、理解尺度空间构建与插值平滑细节的读者这份代码可作为入门参考与调试起点并在此基础上调整参数以适配不同信号类型。1. 从一段轴承振动信号说起LCD 到底在分解什么手里有一段实测的轴承振动信号采样率 12.8 kHz转频大约 30 Hz外圈故障特征频率在 107 Hz 附近。直接做 FFT谱线上一堆边带和噪声混在一起故障特征被调制得看不清。这时候常见的做法是先做自适应分解把信号拆成若干个瞬时频率有物理意义的单分量再对每个分量做包络谱。经验模态分解EMD是最常被提到的方案但它有个绕不开的毛病模态混叠和端点效应迭代筛分次数一多分量就串味了。局部特征尺度分解Local Characteristic-scale DecompositionLCD就是冲着这个痛点来的。它的核心思路和 EMD 不同EMD 靠极值点拟合上下包络再取均值LCD 则直接定义了一个「内禀尺度分量」Intrinsic Scale ComponentISC的概念用三次样条插值把信号里的极值点和中点连起来构造出一条光滑的基线再用原信号减去基线得到分量。因为插值节点选的是局部特征尺度点不是简单的极值包络所以迭代次数少、端点发散也轻。这份 MATLAB 资源包做的就是把这套分解流程完整实现出来输入一维信号输出一组 ISC 分量和一个残余趋势项。它适合谁做旋转机械故障诊断、做非平稳信号时频分析、做生物医学信号心电、肌电预处理的人只要你的信号是非线性非平稳的LCD 都能当 EMD 的替代方案试。新手可以拿它跑通流程、看分量长什么样熟手更关心的是插值边界怎么处理、筛分停止准则怎么定、分量数怎么控制这些在源码里都有对应参数。下面我按「原理选型 → 动手复现 → 参数调优 → 避坑」的顺序把这份资源拆开讲。2. LCD 的数学骨架三次样条插值怎么造出内禀尺度分量2.1 为什么是三次样条而不是极值包络EMD 的包络拟合通常用三次样条穿过极大值点和极小值点问题在于极值点分布不均匀时样条会在端点附近剧烈摆动这就是端点效应的来源。LCD 换了个构造方式它不分别拟合上下包络而是先找出信号的所有局部极值点再在相邻极值点之间取中点把这些中点作为「局部特征尺度点」。然后用三次样条把这些尺度点连成一条光滑曲线这条曲线就是基线。为什么非得是三次样条因为分段线性插值会导致基线出现折角一阶导数不连续减出来的分量会带高频毛刺而更高阶的样条比如五次虽然更光滑但容易过冲在极值点密集的区域产生虚假振荡。三次样条在「二阶导数连续」和「不过冲」之间取了个平衡这也是它在信号分解里被反复选用的原因。常见做法是对尺度点序列做自然边界条件的三次样条插值端点二阶导设为零这样端点不会被人为拉飞。2.2 筛分迭代与 ISC 的判定条件LCD 的分解是一个筛分sifting过程和 EMD 类似但判据不同。每一轮筛分的目标是得到一个满足内禀尺度分量条件的函数在整个数据段内任意两个相邻极值点之间信号的均值近似为零或者说基线穿过信号的方式满足「极值点与零点交替」。实际操作里不会追求严格数学条件而是用一个迭代停止准则来控制。下面这段是资源里筛分主循环的骨架我按自己的理解加了注释function [ISC, residual] lcd_decompose(x, maxISC, stopRatio) % x : 输入一维信号列向量 % maxISC : 最大分量数防止无限分解 % stopRatio : 筛分停止阈值相邻两次基线差的标准差比 residual x(:); ISC []; for k 1:maxISC h residual; while true % 1. 找局部极值点 [maxIdx, minIdx] find_extrema(h); % 2. 极值点之间取中点构造局部特征尺度点 scaleIdx build_scale_points(maxIdx, minIdx); % 3. 三次样条插值得到基线 baseline spline(scaleIdx, h(scaleIdx), 1:length(h)); % 4. 减去基线 hNew h - baseline; % 5. 停止准则基线能量占比足够小 if std(baseline) / std(h) stopRatio break; end h hNew; end ISC [ISC, hNew]; residual residual - hNew; % 残余项单调或极值点太少就停 if length(find_extrema(residual)) 3 break; end end end逻辑说明外层循环每跑一次抽出一个 ISC内层 while 是筛分反复构造基线并剥离直到基线相对能量低于stopRatio。参数上maxISC一般设 5 到 8信号复杂可以到 10stopRatio经验值在 0.05 到 0.2 之间太小会导致过筛分分量里混入虚假成分太大则分量没分干净。build_scale_points是这份资源的关键函数它决定了尺度点怎么选也是和 EMD 拉开差距的地方。2.3 端点延拓别让样条在边界放飞三次样条插值最怕端点。信号首尾的尺度点如果直接当边界样条在端点附近会外推产生大幅摆动这个摆动会污染整个分量。资源里用的是镜像延拓把信号首尾各延拓一段延拓长度取一个极值点间隔的典型值插值完再把延拓段丢掉。function xe mirror_extend(x, nExt) % 镜像延拓nExt 为单侧延拓点数 left flipud(x(2:nExt1)); right flipud(x(end-nExt:end-1)); xe [left; x; right]; end参数nExt怎么定我一般取信号中相邻极值点平均间隔的 1 到 2 倍。太短起不到抑制端点效应的作用太长会引入不存在的周期性让端点附近的分量失真。这一步是 LCD 能不能用于短数据的关键实测里 1024 点的信号nExt取 20 到 40 比较稳。3. 在 MATLAB 里跑通分解从加载信号到画出 ISC3.1 环境准备与文件结构这份资源是纯 MATLAB 实现不依赖任何工具箱里的高级函数基础版 MATLAB 就能跑。我用的环境是 R2021b理论上 R2016a 之后的版本都没问题因为用到的spline、findpeaks、interp1都是老函数。把资源解压后目录里通常有这么几类文件主分解函数、极值点检测、尺度点构造、镜像延拓、以及一个 demo 脚本。建议单独建一个工作目录把这些 .m 文件放进去避免和别的项目函数重名。提示如果你的 MATLAB 装了信号处理工具箱findpeaks可以直接用没装的话资源里一般带了自写的极值检测别混用否则极值点判据不一致会导致分解结果对不上。3.2 构造测试信号并调用分解先用一个已知成分的合成信号验证流程这样分量对不对一眼能看出来。下面这段可以直接抄fs 1000; % 采样率 t (0:1/fs:1-1/fs); % 1 秒数据 % 三个分量低频趋势 中频调幅 高频 x 0.5*sin(2*pi*5*t) ... 1.0*sin(2*pi*50*t).*(10.3*cos(2*pi*8*t)) ... 0.2*sin(2*pi*180*t); [ISC, res] lcd_decompose(x, 6, 0.1); figure; subplot(size(ISC,2)2,1,1); plot(t,x); title(原始信号); for i 1:size(ISC,2) subplot(size(ISC,2)2,1,i1); plot(t, ISC(:,i)); title([ISC , num2str(i)]); end subplot(size(ISC,2)2,1,size(ISC,2)2); plot(t, res); title(残余趋势);逻辑说明合成信号里 5 Hz 是趋势50 Hz 是被 8 Hz 调幅的载波180 Hz 是高频细节。理想情况下 LCD 应该把这三个成分大致分开ISC1 对应高频往后依次是低频残余项吃掉剩下的趋势。参数maxISC6给足余量stopRatio0.1是中等强度筛分。跑完看子图如果 ISC 之间频率成分明显串了说明stopRatio偏大或尺度点构造有问题。3.3 分量有效性验证包络谱与瞬时频率分解完不能只看波形得验证分量是不是单分量。常用做法是对每个 ISC 做 Hilbert 变换看瞬时频率是否平稳。如果某个 ISC 的瞬时频率在时间轴上大幅跳变说明它还是多分量筛分没到位。for i 1:size(ISC,2) analytic hilbert(ISC(:,i)); instFreq fs/(2*pi)*diff(unwrap(angle(analytic))); figure; plot(t(2:end), instFreq); title([ISC , num2str(i), 瞬时频率]); ylim([0 fs/2]); end参数说明hilbert要求信号是实信号返回解析信号unwrap处理相位卷绕否则瞬时频率会出现负值跳变。看瞬时频率图平稳的 ISC 应该围绕某个中心频率小幅波动波动范围一般不超过中心频率的 20%。这一步是判断分解质量最直接的手段比看波形靠谱。4. 参数怎么调筛分阈值、分量数与插值边界的联动4.1 stopRatio 的取值区间与后果stopRatio是 LCD 里最敏感的参数它决定筛分什么时候停。我做过一组对比同一个轴承信号其他参数不变只改stopRatiostopRatio分量数现象0.028过筛分ISC 出现虚假高频包络谱多出无关峰0.056分量干净故障特征清晰0.105轻微欠筛分低频分量里混有残余调制0.204明显欠筛分ISC 瞬时频率跳变经验上从 0.05 起步如果分量瞬时频率不稳就往下调如果分量数暴涨、出现明显毛刺就往上调。注意这个阈值和信号幅值无关因为用的是标准差比值所以换信号不用重新标定但换采样率后极值点密度变了最优值会小幅漂移。4.2 分量数控制maxISC 不是越大越好maxISC是硬上限防止残余项还有极值点时无限分解。设太大后面几个 ISC 基本是噪声没物理意义设太小真正的低频分量被残余项吞掉。常见做法是先设 8 跑一遍看残余项还有没有明显振荡有就加没有就减。对于旋转机械振动信号故障特征通常在前 4 个 ISC 里后面几个可以忽略。4.3 插值边界与采样率的匹配镜像延拓长度nExt和采样率是绑定的。采样率高极值点间隔点数多nExt要相应加大。我一般按「平均极值间隔的 1.5 倍」来估[maxIdx, minIdx] find_extrema(x); allIdx sort([maxIdx; minIdx]); avgGap mean(diff(allIdx)); nExt round(1.5 * avgGap);这样不管什么采样率延拓长度都跟着信号自身的尺度走比固定点数稳。如果信号很短比如 512 点以下nExt可能超过信号长度的一半这时候要手动限制否则镜像段会盖过原信号。5. 避坑与排查LCD 实战里最容易翻车的五件事5.1 现象分解结果每次跑都不一样原因极值点检测里用了findpeaks的默认参数对幅值接近的极值点判定不稳定或者信号里有平台段导致极值点漏检。解决固定极值检测的MinPeakDistance和MinPeakProminence平台段用差分符号变化来判极值别依赖单一函数。5.2 现象ISC1 里混进了低频成分原因stopRatio设太大第一轮筛分没剥干净就停了。解决把stopRatio降到 0.05 以下或者增加内层筛分的最小迭代次数比如至少 3 次防止一次就退出。5.3 现象端点附近分量幅值异常放大原因镜像延拓长度不够或者延拓后没把延拓段正确丢弃样条外推污染了端点。解决检查nExt是否按极值间隔自适应插值后只取中间原信号对应的那段索引别错位。5.4 现象分量数远多于预期后面全是噪声原因maxISC设太大且残余项停止条件太宽松。解决给残余项加一个能量判据当残余项标准差小于原信号标准差的 1% 时直接停别等极值点少于 3 个。5.5 现象瞬时频率出现负值原因Hilbert 变换对非单分量信号会给出无意义的瞬时频率或者信号里有直流偏置。解决分解前先去均值验证瞬时频率时只取有物理意义的频段负值段说明该 ISC 不是单分量回去调stopRatio。6. 把 LCD 接进故障诊断流程包络谱定位与分量筛选分解只是第一步真正要的是从 ISC 里找出带故障特征的那个分量。我的习惯是对每个 ISC 做包络谱看故障特征频率及其倍频是否突出。下面这段是筛选逻辑faultFreq 107; % 外圈故障特征频率 fs 12800; for i 1:size(ISC,2) env abs(hilbert(ISC(:,i))); env env - mean(env); N length(env); f (0:N-1)*(fs/N); P abs(fft(env))/N; % 看故障频率附近能量占比 band (f faultFreq*0.9) (f faultFreq*1.1); ratio max(P(band)) / mean(P); fprintf(ISC %d 故障频率突出度: %.2f\n, i, ratio); end逻辑说明包络谱里故障特征频率处的峰值和背景均值的比值越大说明该分量越可能携带故障信息。参数上faultFreq要按你的轴承型号算别照抄频带取 ±10% 是为了容忍转速波动。跑完挑比值最大的那个 ISC再做细化分析。一个容易忽略的技巧LCD 分解出来的 ISC 顺序是按频率从高到低排的但实际信号里故障特征不一定在高频段。我见过外圈故障落在 ISC3 的情况所以别只盯着 ISC1。另外如果某个 ISC 的包络谱里故障频率和转频的调制边带同时出现基本可以确认是故障分量这时候再回去看它的瞬时频率是否平稳双重验证。从那以后我每次拿到新信号都强制先跑一遍合成信号验证分解函数没被改动再上实测数据这一步帮我省过好几次因为函数路径冲突导致的假结果。希望这份拆解能帮到你把 LCD 真正用起来。本文还有配套的精品资源点击获取