执行峰值拟合,发现高峰和标签,集成某些地区

37视图(30天)
我有一个数据集,我需要做一个基线校正,然后整合某些地区计算比率把他们打印出来。
我的基线校正部分似乎是工作,但我没有得到任何结果峰值和整合的结果。我认为找不到峰值定义的地区是主要的问题。
下面我分享代码,以及样本数据集。
%负载拉曼数据从一个文本文件
数据= readmatrix ( “我data.txt之路” );
x =数据(:1); %波数
y =数据(:,2); %强度
%基线校正使用不对称最小二乘(ALS)算法
基线= als_baseline (y, 0.001, 10 ^ 6);
corrected_y = y -基线;
%找到峰值谱——本节并不给任何输出
prominence_threshold = 120;
distance_threshold = 10;
山峰= findpeaks (corrected_y, “MinPeakProminence” prominence_threshold, “MinPeakDistance” ,distance_threshold);
%执行峰值拟合和集成
range1 = (2050、2200);
range2 = (2800、3000);
integrated_area1 = 0;
integrated_area2 = 0;
i = 1:元素个数(peaks.loc)
位置= x (peaks.loc (i));
强度= corrected_y (peaks.loc (i));
如果 位置> = range1 (1) & & < = range1位置(2)
integrated_area1 = integrated_area1 +强度;
结束
如果 位置> = range2 (1) & & < = range2位置(2)
integrated_area2 = integrated_area2 +强度;
结束
结束
结果= integrated_area2 / ((integrated_area1 + integrated_area2) + (integrated_area1 + integrated_area2));
流( “集成结果:% f \ n” ,结果);
%定义ALS基线校正函数
函数 基线= als_baseline (y, p, lam)
L =元素个数(y);
D = diff (speye (L), 2);
w = 1 (L, 1);
i = 1:10
W = spdiags (W 0 L, L);
C =胆固醇(W +林* (D ' * D));
\ \ z = C (C”(w。* y));
w = p * (y > z) + (1 - p) * (y < z);
结束
基线= z;
结束
你能推荐一个更好的方法吗?或发现任何代码的问题是感谢。

答案(2)

马修•诺伊
马修•诺伊 2023年6月14日十五19
你好
修正一些小错误
希望它能帮助
%负载拉曼数据从一个文本文件
数据= readmatrix (03——频谱——006——规范。1.三种数据);
x =数据(:1);%波数
y =数据(:,2);%强度
%基线校正使用不对称最小二乘(ALS)算法
基线= als_baseline (y, 0.001, 10 ^ 6);
corrected_y = y -基线;
%找到峰值谱——本节并不给任何输出
prominence_threshold = 10;
distance_threshold = 10;
(峰值、loc) = findpeaks (corrected_y,“MinPeakProminence”prominence_threshold,“MinPeakDistance”,distance_threshold);
%执行峰值拟合和集成
range1 = (2050、2200);
range2 = (2800、3000);
integrated_area1 = 0;
integrated_area2 = 0;
ci = 1:元素个数(loc)
位置= x (loc (ci));
强度=山峰(ci);
如果位置> = range1 (1) & & < = range1位置(2)
integrated_area1 = integrated_area1 +强度;
结束
如果位置> = range2 (1) & & < = range2位置(2)
integrated_area2 = integrated_area2 +强度;
结束
结束
结果= integrated_area2 / ((integrated_area1 + integrated_area2) + (integrated_area1 + integrated_area2));
流(“集成结果:% f \ n”,结果);
%定义ALS基线校正函数
函数基线= als_baseline (y, p, lam)
L =元素个数(y);
D = diff (speye (L), 2);
w = 1 (L, 1);
i = 1:10
W = spdiags (W 0 L, L);
C =胆固醇(W +林* (D ' * D));
\ \ z = C (C”(w。* y));
w = p * (y > z) + (1 - p) * (y < z);
结束
基线= z;
结束
4评论
马修•诺伊
马修•诺伊 2023年6月15日14:34
我改变的值来获得更多的山峰被选现在结果不同于0.5
我添加了几行代码来显示有多少山峰保留的范围
我还是有点担心你称之为area_integral不是面积积分,但一个简单的几峰值振幅之和。你不是sippose做一个真正的积分定义范围,假设这个范围实际上包含一个撞吗?
%负载拉曼数据从一个文本文件
数据= readmatrix (03——频谱——006——规范。1.三种数据);
x =数据(:1);%波数
y =数据(:,2);%强度
%基线校正使用不对称最小二乘(ALS)算法
基线= als_baseline (y, 0.001, 10 ^ 6);
corrected_y = y -基线;
%找到峰值谱——本节并不给任何输出
prominence_threshold = 3;
distance_threshold = 10;
(峰值、loc) = findpeaks (corrected_y,“MinPeakProminence”prominence_threshold,“MinPeakDistance”,distance_threshold);
情节(x, corrected_y,“b”x (loc),山峰,“博士”);
%执行峰值拟合和集成
range1 = (2050、2200);
range2 = (2800、3000);
integrated_area1 = 0;
integrated_area2 = 0;
n1 = 0;%的新代码
n2 = 0;%的新代码
ci = 1:元素个数(loc)
位置= x (loc (ci));
强度=山峰(ci);
如果位置> = range1 (1) & & < = range1位置(2)
integrated_area1 = integrated_area1 +强度;
n1 = n1 + 1;
结束
如果位置> = range2 (1) & & < = range2位置(2)
integrated_area2 = integrated_area2 +强度;
n2 = n2 + 1;
结束
结束
disp ([“选择峰值范围1 =”num2str (n1)]);%的新代码
disp ([“选择峰值范围2 =”num2str (n2)]);%的新代码
% = integrated_area2 /结果((integrated_area1 + integrated_area2) + (integrated_area1 + integrated_area2));
结果= integrated_area2 / (2 * (integrated_area1 + integrated_area2));%一样!
流(“集成结果:% f \ n”,结果);
%定义ALS基线校正函数
函数基线= als_baseline (y, p, lam)
L =元素个数(y);
D = diff (speye (L), 2);
w = 1 (L, 1);
i = 1:10
W = spdiags (W 0 L, L);
C =胆固醇(W +林* (D ' * D));
\ \ z = C (C”(w。* y));
w = p * (y > z) + (1 - p) * (y < z);
结束
基线= z;
结束

登录置评。


恰图兰卡Chiththaka
恰图兰卡Chiththaka 2023年6月16日12:07
你好,
谢谢你的更新。
这两个领域有广泛的峰值(Sample_DataSet)。高峰在2050 - 2200年是较小的,而2800 - 3000要大得多。
是的,我想要测量的峰下面积选择区域,然后做以下计算结果。
Int.1 / (Int1 + Int2)
结果= integrated_area2 / (integrated_area1 + integrated_area2);我有更新这个。
仔细检查,我做了一个计算在excel中适应trapazoid规则,并有一个非常不同的结果与Sample_DataSet . . ! !
我也想做一个峰值拟合使用以下代码。
S =负载(“Sample_Raman_Data2.mat”);
%执行洛伦兹拟合达到顶峰。
年代。适合= PeakFit (S。数据、“窗口”(2050、2200),“PeakShape”,“洛伦兹”;
它给了一个错误
未识别的函数或变量“PeakFit”。
我试图建立corect路径和安装所需的额外的包在正确的地方。但遗憾的是没有成功。完全迷失在这个方法。
4评论
恰图兰卡Chiththaka
恰图兰卡Chiththaka 2023年6月16日在十八33
再次感谢。这对我来说是一个很大的帮助。
是的,两个区域是对应于两大高峰,包括边界(P2 P1 = 2050 - 2200 = 2800 - 3000),在分析区域下面我感兴趣。最后输出代码所示的比例(P1 / (P1和P2))。
有趣的是代码选择钟形曲线拟合后的某些地区(%减少高斯贝尔数据),不是吗?所以它将不是2050 - 2200,但是2055 - 2150例如呢?是否可以导出这些x地区限制每个曲线的分析?一定很有趣我找到这个地区的样本,以确定实际地区的两座山峰,我感兴趣的。
如果这个区域变化从一个样本,另一个由于峰值分布,积分值也会不同于样本,不是吗?
最初的原因我没有使用功能Trapz是X读数之间没有相同的距离两个读数。峰值拟合后,可以使用函数trapz吗?也许我没有完全理解这个函数是如何工作的。
再次非常感谢您的支持! ! !万博1manbetx

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!