峰值检测代码
Code for peak detection
我想计算实时信号是否在第一步中通过了一些阈值。在第一步中,我想检测真实信号是否低于这些阈值(以便检测信号中的峰值)。我的 Matlab 代码:
k=1;
t = 1;
l=1;
for i =1:length(sm) //sm my signal.
if (sm(i) > 0.25)
first(k) = i;
k = k+1;
if (sm(i) > 0.5)
second(t) = i;
t =t +1;
if (sm(i) > 0.75)
third(l) = i;
l = l+1;
end
end
end
end
示例:
![在此处输入图片描述][1]
我想计算信号通过和低于三个阈值 0.25
、0.5
、0.75
和 return 那些 windows.基本上是我示例中的三个主要峰值。
基本上我想做的是使用 fastsmooth 函数和 findpeaks。
signalSmoothed = fastsmooth(sm,50); plot(signalSmoothed)
[max_pk1 max_pk2] = findpeaks(signalSmoothed);
find(max_pk1 >0.5)
inversex = 1.01*max(signalSmoothed) - signalSmoothed;
[min_pk1 min_pk2] = findpeaks(inversex);
find(min_pk1 >0.5)
为了只获取所需的峰值,有哪些启发式方法?此外,图片是一个离线示例。一般来说,我想在线执行该技术。
编辑:我错误地将我想要的曲线结果定义为峰值,它是整个波而不仅仅是最大值。
这是获取信号 sm
通过阈值 0.25、0.50 和 [= 的点的解决方案32=]0.75。这些点可以在数据范围内转换为 windows 并存储在 W
中。最后我们可以很容易地在同一张图中绘制它们。请注意,我们需要在局部函数 getwindows
中进行一些检查以处理特殊情况,例如当 window 开始超出数据范围时。 windows 在另一个 window 中的检测是在 getwindowsspecial
函数中完成的。
代码如下:
function peakwindow
% generate sample data
rng(7);
sm = 2*rand(1,25)-0.5;
sm = interp1(1:length(sm),sm,1:0.01:100*length(sm));
% get points
firstup = find(diff(sm > 0.25)==1);
secondup = find(diff(sm > 0.50)==1);
thirdup = find(diff(sm > 0.75)==1);
firstdown = find(diff(sm < 0.25)==1);
seconddown = find(diff(sm < 0.50)==1);
thirddown = find(diff(sm < 0.75)==1);
% plot the result
figure; hold on;
plot(sm,'k')
plot(firstup,sm(firstup),'*')
plot(firstdown,sm(firstdown),'*')
plot(secondup,sm(secondup),'*')
plot(seconddown,sm(seconddown),'*')
plot(thirdup,sm(thirdup),'*')
plot(thirddown,sm(thirddown),'*')
% get windows
W1 = getwindows(firstup,firstdown);
W2 = getwindows(secondup,seconddown);
W3 = getwindows(thirdup,thirddown);
% get special window
WS = getwindowsspecial(W1,W3);
% plot windows
plotwindow(W1,0.25,'r');
plotwindow(W2,0.50,'r');
plotwindow(W3,0.75,'r');
plotwindow(WS,0,'b-');
function W = getwindows(up,down)
if length(up)>1 && length(down)>1 && up(1)>down(1)
down(1)=[]; % handle case when window begins out of bounds left
end
if length(up)<1 || length(down)<1;
W = []; % handle if no complete window present
else
% concatenate and handle case when a window ends out of bounds right
W = [up(1:length(down));down]';
end
function plotwindow(W,y,lspec)
for i = 1:size(W,1)
plot(W(i,:),[y,y],lspec)
end
% get windows of U where there is a window of H inside
function W = getwindowsspecial(U,H)
W = []; % empty matrix to begin with
for i = 1:size(U,1) % for all windows in U
if any(H(:,1)>=U(i,1) & H(:,1)<=U(i,2))
W = [W;U(i,:)]; % add window
end
end
这是结果:
要查看处理是否正常,我们可以在使用 rng(3)
初始化时绘制结果:
请注意,0.25 和 0.50 的 window 将开始超出边界,因此不存在于绘制 windows.
我想计算实时信号是否在第一步中通过了一些阈值。在第一步中,我想检测真实信号是否低于这些阈值(以便检测信号中的峰值)。我的 Matlab 代码:
k=1;
t = 1;
l=1;
for i =1:length(sm) //sm my signal.
if (sm(i) > 0.25)
first(k) = i;
k = k+1;
if (sm(i) > 0.5)
second(t) = i;
t =t +1;
if (sm(i) > 0.75)
third(l) = i;
l = l+1;
end
end
end
end
示例:
![在此处输入图片描述][1]
我想计算信号通过和低于三个阈值 0.25
、0.5
、0.75
和 return 那些 windows.基本上是我示例中的三个主要峰值。
基本上我想做的是使用 fastsmooth 函数和 findpeaks。
signalSmoothed = fastsmooth(sm,50); plot(signalSmoothed)
[max_pk1 max_pk2] = findpeaks(signalSmoothed);
find(max_pk1 >0.5)
inversex = 1.01*max(signalSmoothed) - signalSmoothed;
[min_pk1 min_pk2] = findpeaks(inversex);
find(min_pk1 >0.5)
为了只获取所需的峰值,有哪些启发式方法?此外,图片是一个离线示例。一般来说,我想在线执行该技术。
编辑:我错误地将我想要的曲线结果定义为峰值,它是整个波而不仅仅是最大值。
这是获取信号 sm
通过阈值 0.25、0.50 和 [= 的点的解决方案32=]0.75。这些点可以在数据范围内转换为 windows 并存储在 W
中。最后我们可以很容易地在同一张图中绘制它们。请注意,我们需要在局部函数 getwindows
中进行一些检查以处理特殊情况,例如当 window 开始超出数据范围时。 windows 在另一个 window 中的检测是在 getwindowsspecial
函数中完成的。
代码如下:
function peakwindow
% generate sample data
rng(7);
sm = 2*rand(1,25)-0.5;
sm = interp1(1:length(sm),sm,1:0.01:100*length(sm));
% get points
firstup = find(diff(sm > 0.25)==1);
secondup = find(diff(sm > 0.50)==1);
thirdup = find(diff(sm > 0.75)==1);
firstdown = find(diff(sm < 0.25)==1);
seconddown = find(diff(sm < 0.50)==1);
thirddown = find(diff(sm < 0.75)==1);
% plot the result
figure; hold on;
plot(sm,'k')
plot(firstup,sm(firstup),'*')
plot(firstdown,sm(firstdown),'*')
plot(secondup,sm(secondup),'*')
plot(seconddown,sm(seconddown),'*')
plot(thirdup,sm(thirdup),'*')
plot(thirddown,sm(thirddown),'*')
% get windows
W1 = getwindows(firstup,firstdown);
W2 = getwindows(secondup,seconddown);
W3 = getwindows(thirdup,thirddown);
% get special window
WS = getwindowsspecial(W1,W3);
% plot windows
plotwindow(W1,0.25,'r');
plotwindow(W2,0.50,'r');
plotwindow(W3,0.75,'r');
plotwindow(WS,0,'b-');
function W = getwindows(up,down)
if length(up)>1 && length(down)>1 && up(1)>down(1)
down(1)=[]; % handle case when window begins out of bounds left
end
if length(up)<1 || length(down)<1;
W = []; % handle if no complete window present
else
% concatenate and handle case when a window ends out of bounds right
W = [up(1:length(down));down]';
end
function plotwindow(W,y,lspec)
for i = 1:size(W,1)
plot(W(i,:),[y,y],lspec)
end
% get windows of U where there is a window of H inside
function W = getwindowsspecial(U,H)
W = []; % empty matrix to begin with
for i = 1:size(U,1) % for all windows in U
if any(H(:,1)>=U(i,1) & H(:,1)<=U(i,2))
W = [W;U(i,:)]; % add window
end
end
这是结果:
要查看处理是否正常,我们可以在使用 rng(3)
初始化时绘制结果:
请注意,0.25 和 0.50 的 window 将开始超出边界,因此不存在于绘制 windows.