小耿成长记录第一天 | 0106 |
---|---|
拉曼光谱数据处理学习 | 读文献记录第一天 |
由于荧光背景、样品及周围环境的黑体辐射等影响,导致光谱的基线产生,其表现为缓慢变化曲线,直接对后续的数据分析产生影响。因此需要在后续处理之前将谱线中的基线消除。
分三步:
① 峰值消除;
② 多项式拟合逼近基线,得到基线;
③ 减去基线,得到基线校正后的光谱数据。
其中,拟合残差计算公式如下:
式中O(x)为原始光谱,P(x)为拟合光谱,DEV为残差。
残差判断条件如下:
If i=1,判断条件为abs(DEV1-DEV)/DEV1<0.05;
else,判断条件为abs(DEVi-DEVi-1)/DEVi<0.05;
原文链接:https://blog.youkuaiyun.com/dongke1991/article/details/123802799
常用的基线校正算法有分段线性拟合法、局部极值中值法、多项式拟合法。
%读取该目录下的所有txt文件
% 读取后file_list 的属性有
% name -- file_name
%通过字符串拼接,获取绝对路径可以直接用[],也可以用strcat()函数
clear;clc;
path1 = 'C:\Users\Gmy\Desktop\光谱\2\';
file_list1 = dir([path1,'*.txt']);
file_name1 = sort({file_list1.name});
len1 = length(file_list1);
filename1 = cell(1,len1);
text1 = cell(1,len1);
for i = 1:len1
filename1{i} = [path1,file_name1{i}];%通过字符串拼接获得的就是绝对路径了
text1{i} = load(filename1{i});
end
figure(1)
for i=1:1
figure
x = text1{i}(:,1);
y1 = text1{i}(:,2);
plot(x,y1);
title('拉曼光谱图')
xlabel('拉曼位移')
ylabel('拉曼强度')
y = sgolayfilt(y1,5,7)
%%
% x=[];%拉曼位移
% y=[];%原始光谱
n=5;%多项式阶数
[p0,s0,mu0]=polyfit(x,y,n);%多项式拟合
y_fit0=polyval(p0,x,[],mu0);%计算拟合值
r0=y-y_fit0;
dev0=sqrt(sum((r0-mean(r0)).^2)/length(r0));%计算残差
y_remove0=y(find(y<=y_fit0));%峰值消除
x_remove0=x(find(y<=y_fit0));%峰值消除
i=1;
judge=1;
while(judge)
[p1,s1,mu1]=polyfit(x_remove0,y_remove0,n);%多项式拟合
y_fit1=polyval(p1,x_remove0,[],mu1);%计算拟合值
r1=y_remove0-y_fit1;
dev(i)=sqrt(sum((r1-mean(r1)).^2)/length(r1));%计算残差
if i==1
judge=abs(dev(i)-dev0)/dev(i)>0.05;
else
judge=abs((dev(i)-dev(i-1))/dev(i))>0.05;%残差判断条件
end
index=find(y_remove0<=y_fit1);
y_remove0(index)=y_fit1(index);%光谱重建,大于拟合值的数据用拟合值代替,小于拟合值的数组采用原始数据
i=i+1
end
y_baseline=polyval(p1,x,[],mu1);%基线
y_baseline_correction=y-y_baseline;%基线校正后
figure(1)
h=plot(x,y,'b',x,y_baseline,'m',x,y_baseline_correction,'r')
set(h,'Linewidth',1,'Markersize',1)%设置线宽和点的大小
title('基线校正效果','fontsize',20)%图形标题
xlabel('波数','fontsize',10)%x轴名称
ylabel('幅值','fontsize',10)%y轴名称
grid on %打开网格线
legend('原始光谱','基线','基线校正后的光谱')%添加图例
axis tight
hold on
end
hold off