利用光谱测量气体浓度——用Matlab实现Origin功能(扣基底、拟合积分计算)

该博客介绍了如何使用Matlab替代Origin对大量光谱数据进行处理,包括扣除吸收峰、多项式拟合以及洛伦兹拟合。作者通过循环遍历数据,应用findpeaks函数定位峰谷并进行nan处理,然后进行多项式拟合以扣除基底。接着,进行了洛伦兹拟合来计算吸收峰面积,并根据朗伯比尔定律估算气体浓度。整个过程详细展示了Matlab代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用Matlab对大量光谱数据进行处理代替Origin实现扣除基底、峰拟合等计算。第一次发博客有不足还请大佬指出。(欢迎ahu学弟学妹使用)

背景:透过装有点燃蜡烛的玻璃罩,隔一段时间测量一次吸收光谱,直到蜡烛熄灭。本文一共记录了12组数据

先对凹陷处的吸收峰进行扣除,与Origin中Mask类似先用findpeaks找到吸收峰再将吸收峰周围的区域设置为nan,相当于Origin中的Mask。在后面的多项式拟合过程中,这些数据将不再参与拟合。

clc;
clear;
close all;


F=1001;
Z=12;

T=145;

A=xlsread('/Users/lingzhanjun/Desktop/蜡烛滤波.xlsx');
S=xlsread('/Users/lingzhanjun/Desktop/S(hritran).xlsx');

S1=repmat(S(:,2),1,Z)';
Wave=zeros(F,Z);
V=22.4*10^3;
Na=6.02*10^23;
Min=zeros(Z,1);
Max=zeros(Z,1);
B=zeros(size(A'));
x=1:F;
floora=zeros(F,Z);


for i=1:Z                       % 循环遍历每个峰

data4everpeaks = -A(:,i)';%对数据取反找反向的波峰即波谷
peakF= A(:,i)';
mph=80;
[peaks,locs]=findpeaks(data4everpeaks,'minpeakdistance',mph);



for j=1:length(locs)
    
peakF(locs(j)-20:locs(j)+20)=nan;
x(locs(j)-20:locs(j)+20)=nan;


end
[x,peakF]=prepareCurveData(x,peakF);
P=polyfit(x,peakF,3);
x=1:F;
floora(1:F,i)=polyval(P,x);

B(i,:)=(floora(:,i)./(A(:,i)+eps))';

plot(B(i,:));hold on;
end

对吸收光谱进行洛伦兹拟合,计算得出拟合吸收峰面积,根据朗伯比尔定律计算气体浓度。

B=log(B)./0.365;
for i=1:Z
    
Min(i)=min(B(i,:));
Max(i)=max(B(i,:));

end


peakR=zeros(F,1);%记录
x=(1:F)';
x1=zeros(F,1);

fitresult=zeros(F,Z);%记录拟合后的曲线数据1001,12
Data=zeros(Z,6);
% vv=zeros(1001,1);

% for i=1:Z
%     B(i,:)=B(i,:)-1;
% end

dis=25;
for i=1:Z
 everpeaks = B(i,:);   
mph=(Max(i)-Min(i))*0.3;
%
[peaks,locs]=findpeaks(everpeaks,'minpeakheight',mph);


mpd=30;
L=1:length(locs);
for j=1:length(locs)%为了防止峰上的毛刺被当作峰而设置的循环
if (j>1&&(locs(j)-locs(j-1))<mpd)
    
    locs(j)=nan;

    continue;
    
end 

end

[L,locs]=prepareCurveData(L,locs);

for j=1:length(L)
peakR(locs(j)-dis:locs(j)+dis)=B(i,locs(j)-dis:locs(j)+dis); 
x1(locs(j)-dis:locs(j)+dis)=x(locs(j)-dis:locs(j)+dis);
c=locs(j);
                 
[x,peakR]=prepareCurveData(x,peakR);
% ft=fittype('h.*(w./2)^2./((x-37)^2+(w./2)^2)','dependent',{'y'},...
%     'independent',{'x'},'coefficients',{'w','h'});


Wn=polyfit(locs,S(:,1),1);
Wave(:,i)=polyval(Wn,x);
Wave(:,i)=Wave(:,i)./100;

a0=[1 1 c];
[fitobject,resnorm]=lsqcurvefit(@fnlorentzian,a0,x,peakR);
                 
vv=fnlorentzian(fitobject,x);
fitresult(:,i)=vv+fitresult(:,i);
Data(i,j)=trapz(x,vv);%储存单峰面积Wave(:,i)
% peakR=zeros(1001,1);
% x1=zeros(1001,1);
%  
end
fitresult(:,i)=fitresult(:,i);

end
figure(2);
plot(fitresult);

for i=1:Z
    subplot(2,6,i);
    plot(B(i,:));
    hold on;
    plot(fitresult(:,i))
    ylim([0 0.03]);
end




Y=(Data./S1)./Na.*V;

Concentration=sum(Y,2)/length(locs);

Time=0:15:150;%横做标
Time(end)=T;
figure(3);
plot(Time(1:Z),Concentration(1:Z));

figure(6);
plot(B(1,:));hold on;
plot(fitresult(:,1));


function y = fnlorentzian(a,x)

   y= (a(1).*(a(2)./2)^2./((x-a(3)).^2+(a(2)./2).^2));
end

Matlab中,可以使用lsqcurvefit函数进行光谱的洛伦兹拟合。洛伦兹拟合是一种常用的非线性拟合方法,可以用于对光谱数据进行峰拟合。通过拟合洛伦兹线型函数来获得峰的位置、宽度和强度等参数。 首先,需要定义洛伦兹线型函数的表达式和物理含义。对于单峰洛伦兹拟合,可以使用以下的表达式: Lorentz = @(x, x0, gamma, A) A ./ (1 + ((x - x0)./gamma).^2) 其中,x为自变量,x0为峰的位置,gamma为峰的半宽度,A为峰的强度。 接下来,可以使用lsqcurvefit函数来进行非线性拟合。该函数可以根据给定的初始参数值和光谱数据,自动调整参数值以最小化残差,从而实现洛伦兹拟合。 最后,根据拟合结果可以得到峰的位置、宽度和强度等参数。可以将这些参数用于进一步的分析和处理。 具体的代码实现可以参考以下步骤: 1. 导入光谱数据,如使用xlsread函数读取数据。 2. 定义洛伦兹线型函数的表达式和物理含义。 3. 利用lsqcurvefit函数进行非线性拟合,获取拟合参数。 4. 根据拟合结果得到峰的位置、宽度和强度等参数。 5. 进行结果的可视化或进一步的分析。 请注意,以上代码是一个简化的示例,具体的实现可能需要根据你的数据和需求进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [利用光谱测量气体浓度——用Matlab实现Origin功能基底拟合积分计算)](https://blog.youkuaiyun.com/DIckisonDengsen/article/details/124074689)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [MATLAB 数据处理(二)非线性拟合——洛伦兹拟合(Lorentz fit)](https://blog.youkuaiyun.com/baidu_36202094/article/details/128206548)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值