【问题标题】:Matlab: Peak detection for clusters of peaksMatlab:峰簇的峰检测
【发布时间】:2014-01-02 17:09:15
【问题描述】:

我正在处理生物信号数据,并试图计算具有高密度高振幅峰值的区域数量。如下图所示,感兴趣的区域(如定性观察)包含在红色框中,并且在此特定试验中观察到了 8 个这样的区域。目标是在没有研究人员干预或观察的情况下近乎实时地在数学上实现相同的结果。

下面绘制的数据是来自 24 位 ADC 的原始数据由 FIR 滤波器处理的结果,尚未进行其他处理。

我正在寻找一种方法或理想的代码,以帮助我检测已识别的此类区域,同时忽略感兴趣区域之间(即区域 3 和 4、5 和 6 之间)的一些更高幅度的峰值, 或 7 和 8 有一个高振幅的狭窄区域,这是无关紧要的)。值得注意的是,最大值在计算之前是未知的。

感谢您的帮助。

数据
https://www.dropbox.com/s/oejyy6tpf5iti3j/FIRData.mat

【问题讨论】:

    标签: matlab real-time signal-processing


    【解决方案1】:

    您可以使用阈值吗?

    定义: (1)“幅度阈值”:如果信号大于阈值则认为是峰值

    (2)“窗口大小”:固定持续时间

    算法:

    如果在“窗口大小”中定义​​的持续时间内检测到 n 个峰值,而不是将“窗口大小”内的信号视为峰值簇。(我以前以这种方式处理过眨眼脑电图数据,不确定是否是适合您的应用)

    附:如果您有已经被人工标记的数据,您可以训练分类器来找出您的阈值和窗口大小。

    【讨论】:

    • 感谢您的回复。在我们的例子中,由于从一个对象到另一个对象的值范围是未知的,当对象之间变化时,您建议如何设置幅度阈值?
    • 如果您的实验允许,也许您可​​以进行预筛选以确定幅度阈值。即在不进行实验操作的情况下简单地观察信号,并在开始进行真正的实验之前为每个受试者设置阈值。或者您可能会观察到其他一些信号来推断您感兴趣的信号...这实际上取决于您的信号是什么以及您正在进行的实验...
    • 这就是我的想法,但是对于已经收集到的数据呢?你能想出一种方法来实现吗?
    • 好吧,你必须玩它,通常你计算信号的平均值和标准偏差,并将阈值设置为 n 个标准偏差(这取决于你的应用程序)。
    • 太好了,感谢您的提示。我投了赞成票,因为到目前为止我在峰值检测方面取得了成功 - 将等待接受以查看是否有更多答案传入或可能会为其他人发布我的代码(如果这些都不会接受你的:))
    【解决方案2】:

    在您的问题中设置某种“窗口大小”是否有意义?换句话说,给定一个“高”幅度的区域,如果你缩小该区域的持续时间,它在什么时候对你的分析变得毫无意义?

    如果您能想出一个窗口,只需将此窗口应用于您的数据,并计算窗口内的能量。然后,您可以定义一些能量阈值并对能量信号进行简单的峰值检测。

    【讨论】:

    • 我目前正在使用一种窗口,是的。感谢您提出关于计算波形能量的想法 - 现在研究能量与方差的好处。
    【解决方案3】:

    通过检查您的数据,具有高振幅峰值的区域以看似相当均匀的间隔重复出现。这表明您可以将正弦波或余弦波(或两者的组合)拟合到您的数据中。

    请原谅我的粗略草图,但我的意思是这样的:

    一旦您进行了识别,您就可以使用 FFT 来获得主要的空间频率。请记住,由于虚假数据,您的信号的空间频谱可能相当复杂,但您需要的是数据的一两个主要频率。

    例如,我做了一个正弦曲线,你可以这样计算:

    N = 255; % # of samples
    x = linspace(-1/2, 1/2, N);
    dx = x(2)-x(1);
    nu = 8; % frequency in cycles/interval
    vx = (1/(dx))*[-(N-1)/2:(N-1)/2]/N; % spatial frequency
    
    y = sin(2*pi*nu*x); % this would be your data
    
    F = fftshift(abs(fft(y))/N);
    
    figure; set(gcf,'Color',[1 1 1]);
    subplot(2,1,1);plot(x,y,'-b.'); grid on; xlabel('x'); grid on;
    subplot(2,1,2);plot(vx,F,'-k.'); axis([-1.3*nu 1.3*nu 0 0.6]); xlabel('frequency'); grid on;
    

    这给出了:

    注意主要空间频率 ± nu 处的峰值。现在,一旦您有了主要的空间频率,您就可以使用从 FFT 获得的频率重建正弦波。

    最后,一旦你有了你的正弦波,你就可以识别出中心位于正弦波峰值的盒子。

    这也是一种不错的方法,因为它可以有效地过滤掉虚假或不太相关的尖峰,帮助您将盒子正确放置在预期位置。

    由于我没有你的数据,我无法为你完成所有代码,但这个想法是合理的,你应该可以从这一点开始。

    【讨论】:

    • 感谢您的回复。在开始实施之前,我对这种方法的担忧是,所观察到的生物现象并不总是以一致的时间间隔发生。我在观察数据时看到的不是正弦曲线,而是一系列指数衰减函数。你能调整你的算法以适应这种近似吗?
    • @iKiar,你是对的,这种方法的假设是你的数据集群是定期的。如果不是定期进行,那么这可能效果不佳。但是,如果您的数据与您展示的样本一致,那么我认为它应该可以正常工作。如果您可以发布示例或为您的原始数据创建下载,我将能够更好地评估这种方法对您的问题的有效性。
    • 数据已添加到问题的最后,非常感谢。
    • @iKiar,刚刚看到你的链接,但我得先出去一会儿,我看看,你的数据看起来很有趣。
    猜你喜欢
    • 1970-01-01
    • 2014-01-15
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2017-05-05
    • 2015-09-29
    相关资源
    最近更新 更多