算法介绍
拉曼光谱的位移和强度可以给我们提供拉曼光谱测定物质的含量相关信息,其中拉曼位移是定性与结构分析的依据。拉曼光谱分析技术在定性分析中的运用较为广泛。
但由于拉曼光谱是散射光,得到的浓度-强度曲线并不是完全线性的。其原因主要有以下三点:
- 拉曼仪器激发器本身的不稳定性
- 样本对反射光存在光的吸收
- 样品在测定过程中存在操作误差
迭代自适应加权惩罚最小二乘法(Adaptive Iterative Re-weighted Penalized Least Squares,airPLS),是一种精度较高,常被用于去除拉曼光谱中的背景噪声。
Python实现
def airPLS(X, lam, order, wep=0.05, p=0.05, itermax=20):
(m,n) = X.shape
Z = np.empty([m,n])
D = np.diff(np.eye(n), order, axis=0)
DD = np.matmul(lam * D.T,D)
for i in range(m):
w = np.ones([n,1]).T
x = X[i,:]
for j in range(1, itermax+1):
W = spdiags(w, 0, n, n)
C = cholesky(W + DD)
z = np.matmul(inv(C), np.matmul(inv(C.T), (w * x).T)).T
d = x - z
dssn = np.abs(sum(d[d<0]))
if dssn < 0.001 * sum(np.abs(x)):
break
w[d>=0] = 0
w[0][:math.ceil(n*wep)] = p
w[0][n-math.floor(n*wep)-1:] = p
to_exp = abs(d[d<0])/dssn
w[d<0] = j * np.exp(to_exp)
Z[i,:] = z
Xc=X-Z
return Xc,Z
效果图
其中,蓝线为原始数据,绿线为光谱基线,黄线为去底后的数据。
参考文档
代码改编自一条大鱼025的文章《近红外光谱基线校正—airPLS》中的MATLAB代码。