有人可以解释这个程序的逻辑。
我不明白为什么y=y/max(y)
而且,
interp = (0.5-y(i-1)) / (y(i)-y(i-1));
tlead = x(i-1) + interp*(x(i)-x(i-1));
剧本:
function width = fwhm(x,y)
y = y / max(y);
N = length(y);
MicroscopeMag=10;
PixelWidth=7.8; % Pixel Pitch is 7.8 Microns.
%------- find index of center (max or min) of pulse---------------%
[~,centerindex] = max(y);% 479 S10 find center peak and coordinate
%------- find index of center (max or min) of pulse-----------------%
i = 2;
while sign(y(i)-0.5) == sign(y(i-1)-0.5) %trying to see the curve raise
i = i+1; %474 S10
end %first crossing is between v(i-1) & v(i)
interp = (0.5-y(i-1)) / (y(i)-y(i-1));
tlead = x(i-1) + interp*(x(i)-x(i-1));
i=centerindex+1; %471
%------- start search for next crossing at center--------------------%
while ((sign(y(i)-0.5) == sign(y(i-1)-0.5)) && (i <= N-1))
i = i+1;
end
if i ~= N
interp = (0.5-y(i-1)) / (y(i)-y(i-1));
ttrail = x(i-1) + interp*(x(i)-x(i-1));
%width = ttrail - tlead; % FWHM
width=((ttrail - tlead)/MicroscopeMag)*PixelWidth;
% Lateral Magnification x Pixel pitch of 7.8 microns.
end
感谢。
答案 0 :(得分:2)
该程序使用点扩散函数(PSF)的Full Width at Half Maximum(FWHM)计算显微镜的分辨率,该特征是使用给定的物镜/光学器件等显微镜。
PSF通常看起来像高斯:
并且FWHM告诉您显微镜系统辨别小物体(即分辨率)有多好。假设您正在查看2个点对象,那么分辨率(间接FWHM)是这些对象需要的最小大小,如果您确实要告知有2个对象彼此靠近而不是一个大对象。
现在对于上述函数,看起来它首先计算PSF的最大值,然后沿曲线逐渐下降,直到它大约达到最大值的一半。然后可以根据PSF的分布计算FWHM。
希望让事情更清楚一点!
答案 1 :(得分:2)
你特别提到的两段代码都是内务管理:它更多的是关于它的光谱而不是光学。
所以第一行
y = y/max(y);
将其归一化为1,即将整个系列除以最大值。这是一种相当普遍的做法,在这里做这件事是明智的,它可以避免程序员在以后通过它进行分割。
下一部分,
interp = (0.5-y(i-1)) / (y(i)-y(i-1));
tlead = x(i-1) + interp*(x(i)-x(i-1));
以及后来ttrail
的相应块,是关于尝试插入信号值为0.5的确切点。之前它标识了峰值的中心和半最大值之前的最后一个索引位置,所以现在我们有一个包含信号前沿的范围。
'半最大'标准要求我们找到前沿值为0.5的点(我们标准化为1,因此半最大值定义为0.5)。数据可能没有完全相同的样本 - 它将会[... 0.4856 0.5024 ...]
或类似的东西。
因此,这两行试图在一个指数的分数中确切地确定该线将穿过0.5的值。它通过简单的线性插值来实现:
y(i)-y(i-1)
给出了两个值之间的delta_y和
0.5-y(i-1)
给我们带来了不足。通过采用该比率,我们可以线性插值两个指数位置之间的距离,我们应该恰好达到0.5。
然后下一行计算出相应的delta_x,它会根据时基给出实际距离。
对后缘做同样的事情,然后使用这两个插值给出一个更精确的全宽值。
为了想象这一点,我会在i = 2
行放置一个断点并逐步执行它,注意或绘制y(i)
的值。 stem
有助于可视化离散数据,尤其是当您在索引位置之间工作时。