Matlab:峰值簇的峰值检测

时间:2014-01-02 17:09:15

标签: matlab real-time signal-processing

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

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

Signal Data

我正在寻找的是一种方法,或者理想的代码,以帮助我检测所识别的区域,同时忽略感兴趣区域之间的一些较高振幅峰值(即区域3和4,5和6之间)或者7和8存在一个不受关注的高振幅的窄区域。值得注意的是,在计算之前不知道最大值。

感谢您的帮助。

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

3 个答案:

答案 0 :(得分:1)

你可以使用阈值吗?

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

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

算法:

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

P.S。如果您有已经由人类标记的数据,您可以训练分类器以找出您的阈值和窗口大小。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

进行此识别后,您可以使用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;

给出了:

enter image description here

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

最后,一旦你有正弦波,就可以识别出正弦波峰值中心的方框。

这也是一个很好的方法,因为它有效地滤除了虚假或不太相关的尖峰,帮助您将盒子正确放置在预定位置。

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