我正在处理生物信号数据,并且正在尝试计算具有高密度高振幅峰值的区域的数量。如下图所示,感兴趣的区域(如定性观察)包含在红色框中,并且在该特定试验中观察到8个这样的区域。目标是在没有研究人员干预或观察的情况下,以近乎实时的方式在数学上实现相同的结果。
下面显示的数据是由FIR滤波器处理的24位ADC的原始数据的结果,尚未进行其他处理。
我正在寻找的是一种方法,或者理想的代码,以帮助我检测所识别的区域,同时忽略感兴趣区域之间的一些较高振幅峰值(即区域3和4,5和6之间)或者7和8存在一个不受关注的高振幅的窄区域。值得注意的是,在计算之前不知道最大值。
感谢您的帮助。
答案 0 :(得分:1)
你可以使用阈值吗?
定义: (1)“幅度阈值”:如果信号大于阈值,则认为是峰值
(2)“窗口大小”:固定持续时间
算法:
如果在“窗口大小”中定义的持续时间内检测到n个峰值,而不是将“窗口大小”内的信号视为峰值簇。(我之前用这种方式处理眨眼eeg数据,不确定它是否是适合您的应用)
P.S。如果您有已经由人类标记的数据,您可以训练分类器以找出您的阈值和窗口大小。
答案 1 :(得分:0)
在你的问题中有某种“窗口大小”是否有意义?换句话说,给定一个“高”幅度的区域,如果缩小区域的持续时间,在什么时候它会对你的分析变得毫无意义?
如果您可以打开一个窗口,只需将此窗口应用于数据,并计算窗口内的能量。然后,您可以定义一些能量阈值并对能量信号执行简单的峰值检测。
答案 2 :(得分:0)
通过检查您的数据,具有高振幅峰值的区域以看似相当均匀的间隔重复。这表明您可能将正弦波或余弦波(或两者的组合)拟合到数据中。
请原谅我粗略的草图,但我的意思是这样的:
进行此识别后,您可以使用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中获得的频率重建正弦波。
最后,一旦你有正弦波,就可以识别出正弦波峰值中心的方框。
这也是一个很好的方法,因为它有效地滤除了虚假或不太相关的尖峰,帮助您将盒子正确放置在预定位置。
由于我没有您的数据,我无法为您完成所有代码,但这个想法很合理,您应该可以从这一点开始。