基于无基底扣除的数据趋势累积谱峰检测算法
2021-05-06贾梦涵回朝妍佟美琪马仡男
贾梦涵, 回朝妍, 张 辉, 高 宇, 佟美琪, 马仡男
(北京科技大学能源与环境工程学院, 北京 100083)
随着色谱技术的发展,谱图的分析检测技术也日益提高[1]。人们提出了许多谱峰检测的方法,常见的有幅值法[2]、一阶导数法[3,4]、二阶导数法[5]、小波变换法[6-8]、曲线拟合法[9-11]和遗传算法[12]等。幅值法实现简单,但过度依赖于阈值的确定,准确率很低,较少被采用;一阶、二阶导数法需要数据光滑连续,受波动的影响大,不适合离散采集数据;小波变换法和曲线拟合法均需要人工干预,且需要操作者具备良好的专业知识储备以及经验积累,给实际应用带来一定的困难;遗传算法对于经验公式有很强的依赖,误差很大。
目前已有的谱峰检测算法大部分围绕谱线平滑、基线校正与谱峰识别3个步骤[13],对数据去噪、曲线平滑的要求很高,增大了算法的复杂度以及难度。本文提出一种跳过谱线平滑与基线校正两个步骤,在无基底扣除的情况下,利用数据趋势累积的原理进行谱峰定位的算法,简称趋势累积谱峰检测算法。该算法稳定可靠,准确度高且普适性强,具有较为广泛的应用前景。
1 算法原理
谱图不同位置的峰代表着不同的信息。对于色谱图,特定位置的峰代表某一组分,物质含量与峰面积相关;对于动态比表面仪,特定位置的峰代表着气体吸附或者脱附,气体吸脱附量与峰面积相关。因此,确定峰起点、极值点和峰终点对于谱图的分析十分重要。趋势累积谱峰检测算法计算过程如图1所示,首先通过差分过程获得数据的升降趋势,再根据趋势的累积定位谱峰起点、极值点和峰终点,计算所有谱峰的峰值,通过排序的方法对谱峰进行筛选,最终获得精准的谱峰信息。趋势累积谱峰检测算法的验证实验均采用动态比表面分析仪在不同条件下测得的吸脱附色谱图。文中所有曲线图的数据均取自于空样品管吸脱附氮气色谱曲线,实验中铜管采用70~65 ℃水浴,热导池为恒温50 ℃。
图 1 趋势累积谱峰检测算法计算流程图Fig. 1 Calculation flow chart of trend accumulation spectrum peak detection algorithm
1.1 数据预处理
浮点型数据存储空间大,运算时间长,不利于嵌入式终端的快速数据处理。为了减少运算量,对数据进行浮点型转整型的预处理操作,如图1所示,由于事先不知采样数据类型,为了防止漏读、错读,前期均以浮点型格式读入采样数据队列:F1,F2,F3, …,Fi(i=1, 2, 3, …,N;N为采样点数),得到采样队列范围(Fmin,Fmax)。
浮点型转整型预处理不可直接进行强制转换,虽然在采样队列为整数的情况下不会产生较大的误差,但对于小数采样队列,其小数位在转换过程中将被全部舍去,数据可能会出现严重的偏差。例如:采样数据均是小于0.1的数,即0.01或者0.09,这种情况下如果进行强制转换,则采样数据全部为0,数据失去本来特征,后续运算将无法进行。因此应先将源数据乘以放大因子进行放大,以确保后续转换不会影响数据的精度和运算。根据采样队列所有数据中最后一位非0小数位与小数点的距离的最大值Cmax即可确定放大因子。在不影响计算精度的情况下可适当对放大因子进行调整。
1.2 数据去噪
采样数据在产生、激励或传输的过程中,会受到不同程度的噪声干扰,特别是当采样信号差值较小时,噪声干扰的情况显得尤为严重,直接影响采样信号特性的准确识别,出现曲线毛刺过多、基线不稳定、拖尾峰等现象,对峰识别算法造成干扰,导致漏判或误判。因此,减少噪声对谱峰检测算法的干扰至关重要,数据去噪要求能够去除局部明显的噪声峰和曲线上的毛刺,平滑曲线,改善信噪比,增加谱峰检测的准确性。
目前已有很多数据去噪的算法,例如限幅滤波、中值滤波、递推中值滤波、均值滤波等[14]。趋势累积谱峰检测算法对数据去噪的要求是滤除明显的毛刺,无需进行光滑处理,故采用递推中值滤波法[15,16],主要原理是把连续N个采样值看成一个队列,队列的长度固定为N,将队列中的N个数据进行排序,取队列中间位置的数值作为有效值输出,再将采样得到的新数据放在队尾,替换掉原队列首部的数据,遵循先进先出原则,保持队列长度始终为N。该滤波算法优点是曲线不会失真,适用范围广泛;但由于排序次数多,运算速度较慢。
图 2 尖峰段、基底段源数据队列与差分、累积队列对比图Fig. 2 Comparison of spike section and base section source data queues with differential and cumulative queues a. source data curve of spike section and base section; b. differential data curve of spike section and base section; c. cumulative data curve of spike section and base section.
图 3 缓峰源数据队列与差分、累积队列对比图Fig. 3 Comparison of slow peak source data queue with differential and cumulative queue a. source data curve of slow peak section; b. differential data curve of slow peak section; c. cumulative data curve of slow peak section.
1.3 离散差分
事实上,计算机并不像人一样主观判断峰的形状与位置,只能在大量的数据运算中寻找符合特征描述的数据,这就是谱峰检测算法。谱峰检测在大量的数据分析中十分重要,研究人员基于不同峰的特征对峰进行了分类和描述,定义了峰曲线上的一些特殊点作为特征点,峰的特征点包括峰的起点、前拐点、极值点、后拐点及终点,谱峰检测就是对这些特征点的识别。
理想情况下,谱图曲线的基底部分是一条水平直线,而谱峰部分则是先逐渐上升(下降)后逐渐下降(上升)的曲线,与基底部分相比,谱峰部分存在数据升降的趋势,根据这种升降趋势对基底与谱峰进行区分。
离散差分过程是获得数据变化趋势的过程,对预处理后的数据队列I1,I2,I3, …,Ii(i=1, 2, 3, …,N;N为采样点数)进行差分,Si=Ii+1-Ii,Si为前后两个数据的差值。
若Si大于0,表示数据增大,则令Si为1,表示数据上升趋势;若Si小于0,表示数据减小,则令Si为-1,表示数据下降趋势;若Si等于0,表示数据不变,用0来表示平稳趋势;如图2b所示。通过离散差分过程可得到数据趋势队列:S1,S2,S3, …,Si。
将数据队列和趋势队列进行对比,如图2中a、b和图3中a、b所示。根据图2b可以看出,曲线基底部分经过离散差分后得到的趋势队列处于震荡状态。尖峰部分经过离散差分后得到的趋势队列规律十分明显,其前半部分持续上升,后半部分持续下降。这类峰形是比较理想化的,实际上大多数峰都像图3b中的缓峰一样,震荡上升或下降,或者在持续上升、下降的过程中夹杂出现部分下降、上升趋势。这样的峰形仅从趋势队列来看与图2b中基底部分十分相似,难以区分,这两种情况的出现使得谱峰检测过程十分困难。
图 4 谱峰段趋势累积效果图Fig. 4 Effect chart of trend accumulation of spectrum peak section A. extremum of basement peak; B. extremum of slow peak; C. extremum of spike; AI. cumulative maximum of basement peak; BI. cumulative maximum of slow peak; CI. cumulative maximum of spike.
1.4 趋势累积
在理想情况下,通常根据升降趋势的产生、结束确定谱峰的位置,但实际的谱图中绝大多数情况下都会出现基底震荡以及缓峰的现象。针对这种情况,仍然采用升降趋势对谱峰进行定位,通过趋势累积判断趋势的产生和结束。
如图2b所示,数据曲线上谱峰部分的趋势队列会先出现大量的上升趋势,后出现大量的下降趋势,形成一个完整的谱峰;而数据曲线上的基底部分,由于存在一些噪声干扰的缘故,不会呈现完全持平的趋势,但绝大多数的基底部分均是在极少量的上升或者下降趋势之间往复摆动,随着时间的延长,两者相互抵消,形成稳定的平稳趋势。趋势累积根据数据谱峰段与基底段趋势上的数量差异对谱峰进行识别,趋势的数量Sum则是通过数据趋势队列S1,S2,S3, …,Si(i=1, 2, 3, …,N-1;N为采样点数)的累加获得。
根据趋势的数量Sum对谱峰检测的原理是:在理想情况下,当Sum大于0的时候,判断为峰起点;当Sum达到最大值的时候,判断为峰值点;当Sum重新归零的时候,判断为峰终点。如图2c所示,对于理想的尖峰,这种判断模式可以准确地检测谱峰。除此之外,该模式还可准确检测到非理想的缓峰,如图3c所示,其优点在于对谱峰的检测不会遗漏,适用范围广,这也是该谱峰检测算法较其他算法更为普适的原因之一。对于图2尖峰后面的基底部分,按照这种判断模式也会检测出谱峰,说明这种模式的缺点在于区分基底与谱峰的效率低。根据图2c可看出基底段趋势的数量Sum最大值较谱峰段小很多,针对Sum最大值设置阈值的方法可以区分基底和谱峰。
1.5 遍历寻峰
趋势累积的方法可以检测出所有的峰,但并不能完全区分基底段与谱峰段,原因在于阈值的设定并不能做到准确无误。如图4所示,AI、BI、CI 3种情况均被认为是峰,但在源数据上A与B和C有较大的差异,从源数据上可以看出A为基底,B和C是谱峰,这种情况下,阈值的设定无法准确无误的将A区分出来。为了精准识别,采用遍历寻峰的方法对谱峰进行筛选。首先计算检测到的所有谱峰峰值点与峰起点的差值,然后进行排序,众数小且差值大的为所要检测的谱峰。
如果要遍历所有谱峰,将其进行一遍排序,会增加计算机的工作量,降低算法的运算速度。为提高运算速度,降低工作量,可添加人工干预,人工确定谱峰的数量,根据得到的谱峰数量从大到小进行取舍,无需大量排序统计。
2 算法核心程序设计
算法程序采用C语言编写,核心在于离散差分过程以及趋势累积过程,遍历寻峰是一个排序统计的过程,程序复杂度较低。
图5为离散差分程序流程图,图中右侧为程序的N-S图,采用顺序、选择和循环结构展示程序运行逻辑;左侧为对应的程序核心源代码,实现数据的放大、差分、覆盖等功能。可加入智能化的用户模块,根据用户的需求调整数据放大因子。
图 5 离散差分程序流程图Fig. 5 Flow chart of discrete difference program
图6为算法趋势累积程序流程图,同样采用源程序与N-S图相结合的模式。由于本程序谱峰数量未知,故采用链表结构进行谱峰数据的记录,链表结构可以克服数组需要预先知道数据大小的缺点,充分利用计算机内存空间,实现灵活的内存动态管理。本程序在链表中记录谱峰各个点在源数据数组中的编号,后期使用简单方便且节省空间。图6算法程序中将趋势累积过程阈值设置为3,实现基底与谱峰的第一步区分。关于这里的阈值,可添加用户智能设置模块,用户可以通过对比观察对阈值进行修改。
图 6 趋势累积程序流程图Fig. 6 Flow chart of trend accumulation procedure
3 分析与讨论
为验证算法程序的可行性,选择动态比表面积分析仪测定的吸脱附谱图进行测试。图7为运行算法程序得出的谱峰识别效果图。通过程序去除识别出来的谱峰部分,得到谱图基底部分效果图,见图8。
图 7 趋势累积谱峰检测算法程序的谱峰识别效果图Fig. 7 Spectrum peak recognition effect map of trend accumulation spectrum peak detection algorithm program
图 8 趋势累积谱峰检测算法程序的基底部分效果图Fig. 8 Effect picture of base part of trend accumulation spectrum peak detection algorithm program
从图7可以清晰地看出,本文的趋势累积谱峰检测算法程序检测得到的谱峰起点、峰值点以及终点的位置十分准确,且不受数据曲线毛刺、震荡的影响。对于图7中第1个尖峰尾部基线上升的情况也没有出现峰终点定位不准的现象,这表明该算法并不受基底的影响。
趋势累积谱峰检测算法中检测的对象是谱峰,也就是连续的上升(下降)趋势和连续的下降(上升)趋势。传统的谱峰检测算法是根据基底的扣除将谱峰进行分类归纳,分为单峰、拖尾峰、重叠峰等[17],这实际上为谱峰检测增添了困难。本算法的不同之处就在于不经过基底扣除这一步骤,直接对谱峰进行检测,所有的谱峰只分为急剧变化的尖峰和震荡变化的缓峰两大类,大大降低了算法的复杂度,同时也保证了定位的准确性,在尖峰、缓峰的识别上都取得了良好的效果。只要定位到各个谱峰的位置,扣除谱峰部分就可以得到基底部分,根据图8可以看出通过谱峰扣除得到的基底部分也十分贴合原曲线。
图 9 趋势累积谱峰检测算法与其他算法识别效果对比图Fig. 9 Comparison of recognition effect between trend accumulation spectrum peak detection algorithm and other algorithms
为验证趋势累积谱峰检测算法程序的准确性以及可靠性,选择其他两种已有的谱峰检测算法与本算法进行比较,依旧选取动态比表面积分析仪测定的吸脱附谱图进行测试。如图9所示,一阶导数法除了变化迅速且急剧的尖峰可以准确识别之外,其他类型的谱峰均无法识别。二阶导数法对于尖峰的识别较为准确,但对于缓峰则无法识别。综合来看,趋势累积谱峰检测算法识别效果最为准确且较其他二者更为普适。
4 结论
本文提出了一种在无基底扣除的情况下基于数据趋势累积原理的新型谱峰检测算法,通过算法程序的设计编写以及大量数据的验证改进,总结得到以下结论:用整型信号量表征数据升降趋势,采用信号量进行后续计算,对源数据的预处理过程要求较低,并且降低了算法的复杂度;将离散差分得到的趋势数据累积,巧妙地实现了谱峰的精准定位,计算过程简便且快速,针对复杂度很高的缓峰也能取得较好的效果,算法的普适性很高;将设置阈值与谱峰排序相结合,实现了谱峰与基底的分离,分离效果较好,算法稳定且准确度高。该算法适用于大部分谱图的谱峰检测分析,但在峰终点的定位上还需采用大量不同类型的数据进行验证分析,根据实验结果改进算法程序。