(辐射)脉冲叠加时的脉冲检测和高度表征

信息处理 有限脉冲响应 峰值检测
2022-02-01 11:02:12

编辑:标题

Edit2:更清晰的低计数率图片。

Edit3:为上下文添加了第二句。

Edit4:添加了反卷积尝试

我一直在查看我拍摄的辐射范围内的一些痕迹。这是取自 Geiger Muller (GM) 管的迹线。我的 DSP 真的生锈了,我什至不记得该叫什么。

首先,我有一个类似以下的信号,在低速率下,找到峰值并确定高度相当简单。我只是乘坐503 - 高峰。

缓慢的速度

有时事件会叠加,起初我满足于使用每个点相对于虚线的值。

在此处输入图像描述

随着脉搏率越来越高,这开始成为一个更大的问题。我的峰值检测开始越来越多地错过。

在此处输入图像描述

我可以做一个高通滤波器来消除一些噪音,这有很大帮助。但是,我很难找到清理信号、峰值振铃和信号相位/幅度移动之间的最佳点。下面是巴特沃斯低通。

在此处输入图像描述

我还希望能够根据移动的距离来表征高度,我想我可以找到高峰并做一些逻辑来尝试做出合理准确的估计。

在此处输入图像描述

我的最终目标是获得脉冲高度和脉冲之间距离的直方图。以下是基于峰值点与其他一些图中显示的紫色虚线基线的示例。

在此处输入图像描述

但我觉得我现在已经很熟悉了,我的问题是这个。

有没有人对如何改进这个或我可以采取的不同方法有任何建议?我对一些 FIR(无论如何我认为它的 FIR)过滤器有一个模糊的回忆,它们可以“转换”这样的脉冲,但在我的搜索中没有任何东西跳出来。

感谢您阅读,如果您做到了这一点。

高层观点。请注意,“香蕉”级别具有如此多的微脉冲,它使大脉冲始终间隔开。

在此处输入图像描述

更新

反卷积尝试:

按照以下建议之一,我尝试通过反卷积找到脉冲。我说尝试是因为我显然错过了一些东西。

from scipy import signal

single_peak_l_edge = find_nearest_position(raw_dat["Time"], -0.000115)
single_peak_r_edge = find_nearest_position(raw_dat["Time"],  0.0002)
single_peak = raw_dat[single_peak_l_edge:single_peak_r_edge].copy().reset_index(drop=True)

print(raw_dat.head())
print(single_peak.head())

decon, remainder = signal.deconvolve(raw_dat["Channel A"], single_peak["Channel A"])

fig, ax = plt.subplots(1, 1)
ax.plot(single_peak["Channel A"])
ax.set_title("Template")

fig, ax = plt.subplots(2, 1, sharex=True)

ax[0].plot(raw_dat["Channel A"])
ax[0].set_title("Origional")
#ax[0].set_xlim(0, 40e3)

ax[1].plot(decon)
ax[1].set_title("Deconvolved")

在此处输入图像描述

2个回答

你可以使用反卷积将这些衰减的脉冲转换回脉冲吗?

概念证明:

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

impulses = np.zeros(150)

times =   [3,  20, 30, 40, 45, 50, 55, 80, 90]
heights = [-8, -7, -1, -9, -1, -2, -1, -8, -1]
impulses[times] = heights

b, a = signal.butter(1, 0.04)

filtered = signal.lfilter(b, a, impulses)
fig, ax = plt.subplots(3, 1, sharex=True)
ax[0].plot(filtered[:151])
ax[0].set_xlim(0, 100)
ax[0].set_title('Original')

impulse = -10*signal.unit_impulse(50)
template = signal.lfilter(b, a, impulse)
ax[1].plot(template)
ax[1].set_title('Template')

deconvolved, remainder = signal.deconvolve(filtered, template)
ax[2].plot(deconvolved)
ax[2].set_title('Deconvolved')

3个反卷积示例图

然后将它们彼此分开,您可以更轻松地计算它们的高度和事件。

取决于原始颠簸的属性是什么,但它们看起来像低通滤波脉冲,这意味着它们都来自具有相同脉冲响应的卷积,所以这应该有效吗?

您的 y 轴以伏特为单位电压会随着时间的推移而增加还是在一定范围内波动?如果不了解更多有关信号特性以及您正在处理的频率内容的信息,就很难说......

您可以使用小波类型方法来捕获信号中的斜率变化。

为了了解我的意思,请参阅我提出的这个未回答的问题,该问题显示了具有两个“事件”的信号的连续小波变换图,如果您可以称它们为的话。

cwt 绘图示例