高斯函数的Caputo-Fabrizio分数阶导数闭式表达式及信号处理应用
发布时间:2026/10/14 18:00:56 锦皓数字建站

做信号处理的同学应该都有过这种经历想用导数提取特征结果一阶导数出来全是毛刺二阶导数直接没法看。我最近在调一个边缘检测的小项目被这个问题卡了几天最后用的方案就是标题里这个组合——高斯函数的Caputo-Fabrizio分数阶导数闭式表达式。这个组合的核心价值在于分数阶导数给了一个连续可调的“求导强度”高斯函数保证了能写出闭式表达式而闭式表达式意味着在Matlab里不用求解积分十几行代码就能把它当卷积核用。下面我会从分数阶导数的直觉讲起把推导、代码、踩坑记录完整整理一遍给同样在做信号分析、图像处理的朋友做个参考。1. 分数阶导数不是新花样而是可调的“求导强度”1.1 整数阶导数在信号处理里的老问题信号处理里最常见的操作之一就是求导。一阶导数能突出信号变化最快的点二阶导数能定位拐点听起来都很美好真用到实际数据上就是另一回事了。一阶导数在频域上相当于乘一个jω高频分量被线性放大二阶导数乘的是-ω²高频放大得更夸张。而现实里的信号尤其是传感器采集回来的数据高频部分几乎总是夹杂着噪声和毛刺。直接求导的结果就是“边缘找没找到不好说噪声倒是放大得很均匀”。所以工程上早就有了对策先平滑再求导。最典型的就是高斯一阶导数滤波器先把信号和高斯核卷积再求导。高斯核是低通滤波器能把高频噪声压下去然后微分环节再把有效的高频边缘拉出来。这个方案确实能解决问题但有一个别扭的地方——平滑尺度σ和导数阶次是分开的两个参数你得先猜一个σ再决定用几阶导数。σ调小了噪声压不住σ调大了边缘又变宽几阶导数更是只能选整数1和2之间没有任何过渡。实际调参的时候很容易陷入“要么太钝、要么太尖”的两难。1.2 Caputo-Fabrizio定义从长记忆到短记忆分数阶导数的想法其实不新早在三百多年前就有人讨论过“非整数阶”的导数数学上最常用的是Riemann-Liouville和Caputo定义。这两种定义都有一个共同特点它们对过去所有时刻的导数加权求和权重是幂函数衰减。幂函数衰减得很慢数值上必须处理“长记忆”每算一个点都要对整段历史做积分效率很低这也让分数阶导数在工程里一直不太流行。后来有人提出了Caputo-Fabrizio定义最核心的改动是把幂函数核换成了指数衰减核写成公式就是[ {}_a^{CF}D_t^\alpha f(t)\frac{M(\alpha)}{1-\alpha}\int_a^t f(\tau)\exp\left(-\frac{\alpha(t-\tau)}{1-\alpha}\right)d\tau ]这里0α1M(α)是一个归一化系数。这个式子的含义可以直观理解为先对信号求一阶导数然后在时间轴上做一个指数衰减的窗口求和。离当前时刻越近的历史权重越大越远的历史权重指数级减小。这个过程很像一个人对近期变化的记忆特别清晰对远期变化逐渐淡忘而不是像幂函数那样把几百年前的事情还牢牢记着。对信号处理来说这个性质非常友好因为大多数应用本来就只需要关心信号最近一小段时间的变化趋势保留超长记忆不仅没用还会拖慢计算。1.3 高斯函数凭什么能写出闭式解闭式表达式的意思是说对于一个解析函数它的某个变换结果也能写成解析形式而不用靠数值积分去逼近。对于CF分数阶导数这个积分变换绝大多数函数的闭式解都不存在但高斯函数是个例外。原因在于高斯的指数二次型和指数衰减核的指数一次型乘在一起后仍然可以配方成一个高斯积分最后归结为误差函数。这个过程是完全解析的没有近似。有了这个闭式表达式做信号处理就不需要算积分了。直接把公式采样成滤波器核和信号做卷积就完了速度比数值积分快几个量级。这也是为什么标题里的组合如此有价值分数阶导数负责提供连续可调的微分特性高斯函数负责让结果可以被解析表达二者缺一不可。2. 闭式推导从积分到一行函数2.1 先做一个变量代换为了让推导清爽一点先定义βα/(1−α)。注意α在0到1之间时β在0到正无穷之间这个参数可以理解为指数核的衰减速度。代换之后CF定义变成[ {}_a^{CF}D_t^\alpha f(t)\frac{M(\alpha)}{1-\alpha}\int_a^t f(\tau)e^{-\beta(t-\tau)}d\tau ]如果积分下限取−∞右边的积分就是f′(t)和一个单边指数核e^{−βt}的卷积。这个视角非常重要CF分数阶导数本质上是在普通一阶导数后面接了一个指数平滑器。它在“纯微分”和“纯平滑”之间插入了一个可以连续调节的中间地带。2.2 代入高斯函数配方换元设高斯函数为[ g(t)\exp\left(-\frac{t^2}{2\sigma^2}\right) ]它的导数是[ g(\tau)-\frac{\tau}{\sigma^2}\exp\left(-\frac{\tau^2}{2\sigma^2}\right) ]代入卷积积分核心要算的就是这个[ I(t)\int_{-\infty}^{t}-\frac{\tau}{\sigma^2}\exp\left(-\frac{\tau^2}{2\sigma^2}\right)e^{-\beta(t-\tau)}d\tau ]这个积分的关键技巧只有一个把指数上的二次项配方。把−τ²/(2σ²)βτ凑成−(τ−βσ²)²/(2σ²)β²σ²/2然后做一个换元u(τ−βσ²)/σ积分就会拆成一个标准正态分布函数的积分形式加上一个高斯函数的边界项。整个过程中没有用到任何数值近似每一步都是标准的微积分操作。2.3 闭式公式与两种检查方法经过配方、换元和误差函数表示最终结果可以整理成非常漂亮的形式[ {}_a^{CF}D_t^\alpha g(t)\frac{M(\alpha)}{1-\alpha}, g(t)\left[1-\frac{\beta\sigma\sqrt{2\pi}}{2}\operatorname{erfcx}\left(\frac{\beta\sigma^2-t}{\sqrt{2}\sigma}\right)\right] ]这里的erfcx是缩放的互补误差函数定义为erfcx(z)e^{z²}erfc(z)。写代码的时候一定要用这个形式后面我会详细解释为什么。这个式子有两个很好的自检方法。第一当α趋近0时β趋近0右边趋近于g(t)也就是核不再微分退化成普通高斯平滑核。第二当α趋近1时β趋近无穷大通过erfcx的渐近性质可以推出结果趋近于g′(t)−(t/σ²)g(t)也就是经典高斯一阶导数。我调试代码的时候就是靠这两个极限来验证实现有没有写错的如果两个极端对不上那一定是公式或者采样参数出了问题。3. 从公式到滤波器三种理解方式和实际应用3.1 平滑加微分的连续插值很多读者第一次看到这个闭式表达式的时候都在想同一个问题这东西到底怎么用答案很简单把它当成一个卷积核。对一维信号核就是h(t;α,σ)对二维图像利用二维高斯函数的可分离性可以构造Kxh(x)·g(y)和Kyg(x)·h(y)分别做卷积得到水平和垂直响应响应幅值开根号就是梯度幅值。这个核最吸引人的地方在于α是一个连续旋钮。α小的时候核更接近高斯平滑核对噪声不敏感但边缘响应会宽一些α大的时候核更接近高斯导数核边缘锐利但噪声也被更多地放大。在实用场景里这种连续过渡比“先用高斯平滑再用Sobel差分”这种两步走要顺手得多。因为在两步走方案里平滑强度和微分阶次很难直观换算而这里就是一个参数从0拧到1的过程。3.2 一维信号突变点检测与噪声抑制一个非常典型的应用场景是叠加了高频噪声的矩形波想找跳变沿。用纯一阶导数噪声会把导数波形搞得满是尖刺阈值很难选。用高斯一阶导数需要事先把σ调大但σ大了跳变沿又会变宽定位精度下降。使用CF核的话把α设成0.3到0.5核在跳变处给出的响应依旧是一个明显的主峰但高频噪声被指数核有效压住了。直观理解指数核相当于一个带衰减记忆的低通器它不像纯微分那样给高频无限放大。这个特性在做心电信号、振动信号、地震波初至拾取这类场景里非常实用。我实际测试过一段含噪的阶跃信号α1的纯高斯导数输出几乎被噪声淹没而α0.4的CF核输出里阶跃位置的峰依然清晰可辨。这种对噪声的容忍度是整数阶导数很难达到的。3.3 二维图像可分离核与边缘检测到了二维图像这个核的价值会更明显。传统Sobel其实是离散差分对噪声敏感高斯导数核是“先平滑再微分”比Sobel好一些但依然只能选整数阶微分。CF核把微分阶次变成了连续量你可以在α0.8时获得类似高斯导数的锐利边缘又可以在α0.2时保留更宽范围的弱边缘。对那些边界不锐利的图像比如低对比度的医学影像或者雾天图像降低α往往比单纯增大σ更能保住弱边缘同时又不至于把噪声带进来。我在实际项目里遇到过类似情况同一幅低对比度测试图固定σ把α从0.9调到0.5检测出的边缘连续性明显变好而噪声点没有明显增多。这种感觉就像是换了一个更懂“慢变化边缘”的算子在帮你找轮廓。4. Matlab代码从一维核到完整demo4.1 一维核生成函数先给出整个方案的地基一个生成一维CF核的Matlab函数。这个函数直接用闭式表达式没有循环没有数值积分。function h cf_gauss_kernel_1d(sigma, alpha, radius, dt) % sigma: 高斯宽度 % alpha: 分数阶阶次建议 0 alpha 1 % radius: 核支撑半径对应的采样点个数 % dt: 采样间隔 if nargin 4, dt 0.1; end if nargin 3, radius ceil(6 * sigma / dt); end t (-radius:radius) * dt; beta alpha / (1 - alpha); g exp(-t.^2 / (2 * sigma^2)); z (beta * sigma^2 - t) / (sqrt(2) * sigma); h (1 / (1 - alpha)) * g .* (1 - (beta * sigma * sqrt(2*pi) / 2) .* erfcx(z)); % 离散卷积近似连续卷积时乘上采样间隔 h h * dt; end这里有两个容易忽略的点。第一radius至少取到6σ/dt以上因为闭式核里面除了高斯项还有erfcx项尾部衰减速度不如纯高斯快截太短会出现明显振荡。第二dt不能太大建议dt不大于σ/4否则核形状会走样卷积结果和连续理论对不上。4.2 一维信号滤波demo用上面的函数做一个完整的信号演示。下面的代码生成一段带噪声的方波然后用CF核做卷积观察跳变处是否出现清晰峰值。fs 1000; t (0:999) / fs; x zeros(size(t)); x(200:400) 1; x(600:650) -0.5; x x 0.1 * randn(size(t)); % 加上高斯白噪声 sigma 2 / fs; % 平滑宽度约2个采样周期 alpha 0.4; % 分数阶阶次 dt 1 / fs; N ceil(6 * sigma / dt); h cf_gauss_kernel_1d(sigma, alpha, N, dt); y conv(x, h, same); plot(t, x, Color, [0.7 0.7 0.7]); hold on; plot(t, y, LineWidth, 1.5); legend(原始含噪信号, CF卷积输出);实际运行会看到输出信号在跳变位置有很明显的单峰响应而平缓段的噪声幅度被压到了很低水平。这里的alpha0.4是一个不错的中间值如果想更锐利可以调到0.6但噪声会相应多一点。注意conv的same选项会带来轻微边界效应信号较长时无所谓短信号建议先对边缘做镜像延拓再截断。4.3 二维图像边缘检测demo二维情况下利用高斯函数的可分离性把一维CF核再沿另一个方向配一个普通高斯平滑核就能构造出二维方向导数核。I imread(你的测试图.png); I double(rgb2gray(I)) / 255; sigma 1.5; alpha 0.5; dt 0.5; N ceil(6 * sigma / dt); idx (-N:N) * dt; h1 cf_gauss_kernel_1d(sigma, alpha, N, dt); g exp(-idx.^2 / (2 * sigma^2)); g g / sum(g); Kx h1(:) * g(:); % 水平方向CF导数核 Ky g(:) * h1(:); % 垂直方向CF导数核 Gx conv2(I, Kx, same); Gy conv2(I, Ky, same); mag sqrt(Gx.^2 Gy.^2); mag mag / max(mag(:)); imshow(mag); title(CF导数梯度幅值);Kx先做水平方向的分数阶微分再做垂直方向的平滑这正是二维高斯可分离性质的直接体现。如果不做两个方向只用单个方向的卷积得到的响应有强烈的方向性不利于通用边缘检测。核的尺寸取决于Nsigma取1.5、dt取0.5时核大约37×37速度完全可以接受。5. 实战中的坑数值形式和参数边界5.1 erfcx是救命的第一次实现这个公式时我犯过一个很经典的数值错误。当时直接按照数学推导的中间形式把e^{β²σ²/2}e^{−βt}这样的指数项全部展开来算。在σ2、α0.6时β1.5β²σ²/24.5还没什么问题但当我测试α0.9、σ3时β9β²σ²/2364这个指数在双精度下直接变成了inf后面的结果全部变成NaN。后来把公式重写成erfcx形式指数项被z²吸收掉数值问题就消失了。所以这里特别提醒论文或者推导稿里给的中间形式往往不适合直接写代码必须整理成数值稳定的等价形式。erfcx是Matlab内置函数老旧版本如果没有可以用exp(z.^2).erfc(z)代替但注意这种写法在z很大时依然有溢出风险真遇到这种情况可以用渐近公式1/(zsqrt(pi))近似。5.2 边界情况的处理α非常接近0时公式里分母1−α会使得核变得很大但实际上α0的极限应该就是普通高斯核α非常接近1时分母1−α会让核趋向无穷但极限应该是普通高斯一阶导数。有限精度下直接套公式必然出问题所以我建议把α限制在0.02到0.98之间超出这个范围就直接用高斯核或高斯导数核替代。这个处理不是偷懒而是为了保证数值行为的连续性。另一个边界问题是积分下限。严格来说CF定义里积分下限a通常是信号起点或者0很多推导是把a取成−∞才好得到这个漂亮的闭式表达式。高斯函数在±∞处趋于0这种做法是数学上合理的但把核用于任意信号时相当于默认信号也是在±∞处趋于0的稳态场景。对滤波应用来说这种近似影响很小如果追求严格需要额外处理边界项。5.3 核的零均值化与M(α)选择不同文献里M(α)的取法各不相同常见的有取常数1、取1−αα/Γ(1α)、以及取2/(2−α)共三种。对卷积滤波来说M(α)只是一个全局缩放不影响核的形状。如果你后续要对梯度幅值做阈值或者相对比较选哪个都行如果需要不同α之间的幅值可比建议对核做零均值化或者对梯度幅值做百分比归一化。零均值化是一个容易被忽略的小技巧。因为CF核在α较小的时候直流分量不为零直接卷积会让平缓区域出现一个常数偏移对阈值判断造成干扰。最简单的处理是在生成核之后执行一次h h - mean(h);这一步对于边缘检测类任务几乎是必须的。卷积的边界方式我也建议用symmetric或者先延拓再截断不要用零填充否则图像四周会被制造出一圈假边缘。5.4 常见问题速查表现象原因解决办法输出全是NaN公式中的指数项溢出改用erfcx形式α接近1时输出爆炸分母1−α趋近0α限幅到0.98以下或退化为高斯导数核图像边缘有黑色边框卷积边界零填充使用symmetric边界核形状与理论不符采样间隔dt太大让dt不超过σ/4平缓区域有颜色偏移核直流分量不为零生成核后执行h h - mean(h)不同α结果幅值差异大M(α)不统一统一M(α)或对梯度幅值归一化这张表是我实际调试时反复使用的基本覆盖了第一次上手能遇到的大部分问题。6. 参数选择经验与后续扩展6.1 三组实用的起步参数参数怎么选永远是这类方法被问得最多的问题。我个人的经验可以分为三个场景。一维信号突变检测先让σ和你要关注的脉宽保持同数量级再用α微调锐度α小于0.2时响应峰的宽度会明显增加α大于0.8时噪声敏感度显著上升起始值取0.4比较稳。图像边缘检测场景里σ跟噪声水平正相关噪声大的图σ往2到3走α决定边缘选择性低对比度图α往0.3到0.5走对比度好的图0.6到0.8都行。第三个场景是微弱信号提取也就是信噪比很低的场景α建议取0.2到0.3配合稍大一点的σ相当于用强度较高的平滑换微弱边缘的连续性。这只是起步值具体还是要扫一遍参数看输出。我习惯写一个两层for循环让α从0.1到0.9、σ从0.5到3变化把输出指标做成热力图一眼就能看到参数甜点区比盲调快得多。6.2 和传统算子的对比感受如果只看原理Sobel、高斯导数、CF核都可以归到图像梯度算子这个大类里但实际用下来差别非常大。Sobel速度最快但噪声点也多高斯导数边缘干净但需要额外选一个阈值把弱边缘滤掉CF核在α0.5时得到的梯度幅值直方图更容易拉开双峰后续用自适应阈值就不用那么纠结。这里面的原理就是α0.5时核介于平滑与微分之间响应不是单纯强调高频也不是单纯压噪声而是把边缘能量相对集中化了。这个中间态对阈值处理非常友好也是我最喜欢用它的原因。6.3 还能玩出什么花这套闭式表达式并不只适用于二维边缘检测。一维版本可以直接用在音频信号包络提取上用很小的核就能得到比Hilbert包络更平缓的轮廓。二维版本可以推广到三维体数据用三个方向的可分离核做裂缝增强或者血管骨架提取。如果你需要做实时系统或者嵌入式部署核可以离线算好存成查表在线只需要做两次卷积成本是非常低的。后续还可以把它跟其他信号处理模块串起来。比如在分数阶各向异性扩散里用这个核代替传统的梯度估计扩散过程会稳定很多又比如在多尺度特征提取里让α随着尺度变化得到一个同时具备尺度鲁棒性和方向选择性的特征描述。这些方向都是很自然的扩展。对我来说最舒服的一点是核的每个值都能用一行公式精确算出来不需要任何数值积分器调试起来干净利落这种体验在传统分数阶方法里几乎找不到。最后再分享一个我习惯的细节调试这类核函数时别急着看滤波结果先把核在时域里可视化一遍和α0、α1两个极端对比确认形状是平滑过渡的。我几乎每次都能在这个步骤里发现参数或者采样间隔的问题。分数阶导数的概念听着高深但关键就在于它连续可调的微分特性和闭式实现的数值稳定性这两点都掌握了剩下的就是大胆去试自己的数据了。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。