1

我试图以捕捉原始图的大部分特征的方式对图进行反卷积。当我使用以下代码时,有两个主要问题:


def Gaussian(x, mean, sd):
  Gaussian = []
  for i in range(x.size):
    norm += [1.0/(sd*np.sqrt(2*np.pi))*np.exp(-(x[i] - mean)**2/(2*sd**2))]
  return np.array(norm)


x_value = np.arange(100)
fun = lambda x: np.exp(-(0.1*x-6)**2+4) + np.exp(-(0.1*x-4.75)**2+2)

y_value1 = fun(x_value) + np.random.normal(0,1,len(x_value))*3

m, dm, sd1, sd2, h1, h2 = [60, 10, 1, 1, 5, 2]
p = [m, dm, sd1, sd2, h1, h2] # Initial guesses for leastsq
y_init = norm(x_value, m, sd1)*h1 + norm(x_value, m + dm, sd2)*h2 # For final comparison plot

def res(p, y, x):
  m, dm, sd1, sd2, h1, h2 = k
  m1 = m
  m2 = m1 + dm
  y_fit = Gaussian(x, m1, sd1) * h1 + Gaussian(x, m2, sd2) * h2
  err = y - y_fit
  return err

ls = least_squares(res, p, args = (y_value1, x_value))


第一个主要问题是它提供了多个解决方案。下面显示的真实数据实际上非常可靠。很明显,它将有两个卷积图。然而,在我们有更一般的数据形状的情况下,结果开始变得非常不同。我不认为去卷积图可以解释原始图的固有特征。

拟合图

第二个问题是我必须手动设置峰值的数量。我想要一些能自动但最佳地确定峰值的东西。你们碰巧知道做这件事的任何功能吗?

还是我完全错过了一些重要的事情?我找不到解决这些问题的答案。

==================================================== =========================== 编辑:我从这里导入 peakdet https://gist.github.com/antiface/7177333 并且它有效对于上面显示的图表。但是,出现了另一个问题,它没有检测到如下图的曲线拐点:

在此处输入图像描述

我正在尝试从 peakdet 稍微修改代码以检测这些点。请帮忙!

4

1 回答 1

0

我知道,很老的帖子,但是……</p>

通常,您检测到的信号不是 100% 锐利的——您有一个所谓的点扩散函数(PSF),通常是高斯形的,它会“模糊”频谱上的整个曲线。这可以通过原始数据(测量光谱)的反卷积来考虑,或者反过来,通过卷积图与 PSF 的卷积来考虑。

于 2021-11-10T11:26:47.153 回答