更新:用本地最大值可视化信号

问题描述:

我有一个信号,我想在我的信号中添加一个高原(展平),以便找到当地的最大值。更新:用本地最大值可视化信号

我在这里提供了一个例子,使我的问题更易于理解,因为我的真实数据的大小是1x1666520,所以我无法在此处上传整个文件。

我想要做什么,我期待:

•我想让我的信号平坦,我们会发现在信号局部最大值。

•我想将窗口应用于信号,以便在一定范围内可视化展平的效果,并且更深入,更清晰地显示我的信号。我也想控制窗口的大小和宽度。

这里的输出应该如何看素描

Sketch with flattened local maxima

我在点5,1,7,8局部极大值,4

当我在当地的最大值,我希望我的信号变得平坦(剪辑),并成为围绕该点的直线。

我也想控制扁平的宽度。假设宽度为0.2,如我在手绘中所提到的那样。如果是这样,我想使它成为0.3,所以我还需要控制裁剪部分的宽度。更清晰

更新的详细信息:

我在做什么:

我有2个信号。来自传感器的第一参考信号和第二测量信号。 (我从1个传感器获取了6个不同的测量信号)。

测得的信号有延迟,偏移,变平。

我想让我的参考信号看起来像我的测量信号,通过延迟,偏移和展平信号来满足我的需求。

为了使我的原始信号变平坦,我观察到,在每个局部最大值处,信号都变得平坦,每次测量变平坦都不一样。

所以我想让我的信号在每个本地最大值都保持平坦。

Y轴:平坦化(我想控制在y轴上平坦化的高度)

意味着我想使一个环,其包含在Y轴例如平坦化在第一次尝试我的变化值的高度想在第二次尝试中给扁平0.1,然后给扁平为0.2的局部最大值并观察它们的效果。 简而言之,当我有局部最大值时,所以我想给出y轴上最大值的(locs - 0.1)变平。

意思是说,如果我在5点达到高峰,所以我想在4.9(5-0.1)压扁。 然后在第二个循环中检查y轴上局部最大值处的(locs-0.2)的效果。

想要对0.1到0.9的值应用循环。

X轴:压扁的宽度(我想改变平坦化的宽度)

意味着我想观察在通过给出一个数值范围的平坦的宽度变化的影响。这可以通过循环的帮助完成。

简而言之,当我有局部最大值时,所以我想在x轴的最大值上给出0.1的展平宽度。

然后在第二个循环中检查x轴上局部最大值的0.2宽度变化的效果。

enter image description here

原始数据细节:

我在原来的数据x轴包含小数所以不想插值数据值。

在我的原始数据中,y轴还包含小数点后的值。

我真实数据的大小是1x1666520。

原始信号看起来像

enter image description here

窗口作用:

窗口只是观察发生在地方局部最大的变化行为意味着一样,如果变平的宽度为0.1所以窗户大概是0.2。

对不起,我仍然无法提供一个很好的示例数据,解释了我在MATLAB中的情况,所以我附上了手工草图。 我希望我能保持清晰的问题。

代码:

t = 1:25 ; 
A = [1 0 1 2 3 5 0 1 0 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2]; 
[pks,locs] = findpeaks(A) 

win1 = hamming(numel(A))'; 
xw1 = win1.*A; 

figure 
plot(t,xw1,'r',t,A,'b') 

修改代码乔恩的建议压扁

乔恩给了一个想法之前和最大值后再考虑价值观,使他们相同的最大值,以使宽度可控。

t = 1:25 ; 
A = [1 0 1 2 3 5 0 1 0 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2]; 
[pks,locs] = findpeaks(A) 
% A(A>locs)=locs 
figure 
plot(t,A,'b') 
A(locs+1) = A(locs); 
A(locs-1) = A(locs); 
hold all;plot(t,A,'r'); 

enter image description here

  • 更新问题:

请看看在信号原始信号和量化步长附图。其实我很抱歉,我仍然无法上传整个数据文件。

enter image description here 其实我的原始信号包含步长为0.001的小数点。所以我的信号被采样和量化。

通过做内插法,它可以很好地使信号平坦化,但不幸的是它消除了原始信号的量化,而且内插法使得该过程非常缓慢。

是否有任何其他方式在局部最大值点剪切信号?

我会很感激你的帮助,因为我在这个阶段无能为力。

我试过并测试过约翰提供的代码。它运作良好,但问题与我的数据。 IT包含量化步骤。

要点:

  1. 我的原始数据在步骤或量化。
  2. 它包含大小为0.001的小数点,因此通过对x轴和y轴进行插值来完成。因此,我的数据和时间包含差值为0.001的点。
  3. 通过做插值它工作完美,但问题是,它正在消除信号的量化。

如果有人帮助我,我会非常感激你。

请求:

如果你有疑问,请向,所以我就可以让我更好的查询。

+2

你想如何压平它?因为第一个明显的答案是'A(A> mymax)= mymax' –

+0

非常感谢Ander Birgui。所以在我的情况下,对于上面的例子,我得到pks在5,7,4意味着局部极大值,所以现在我想要的是让我的信号平坦意味着在本地极大值处的直线5,7,4达到某个值意味着我的信号得到当它看到局部最大值时,在x轴上平展2点。请看附图。我希望它能够澄清我的观点,这也是我也希望将窗口应用于信号的原因,以便我可以清楚地看到展平效果。 – Peter

+0

在上面附图中绿色信号显示扁平化的效果,这就是我想要处理的信号 – Peter

不知道你在找什么,特别是窗口。对于“x轴上的2点”展平可能会使本地最大值与先前的值相同?

从您的代码继续:

figure 
plot(t,A,'b') 
A(locs) = A(locs-1); 
hold all;plot(t,A,'r'); 

enter image description here


编辑 整个代码:

t = 1:25 ; 
A = [1 0 1 2 3 5 0 1 0 0 0 2 3 6 7 0 0 8 0 1 1 2 3 4 2]; 
t2=1:0.1:25; 
A = interp1(t,A,t2); %re-make example data to have decimal points on the x-axis 
t=t2; 
[pks,locs] = findpeaks(A); 
figure 
plot(t,A,'b') 

windowWidth_x2 = 2; %define how wide, this is 0.2, because the x-axis increments by 0.1 

valuesToClipTo = A(locs-windowWidth_x2); %No idea what you actually want 
for ii=1:length(locs) %Explaining is futile 
    A((locs(ii)-windowWidth_x2):((locs(ii)-windowWidth_x2)-1+find(A((locs(ii)-windowWidth_x2):end)<valuesToClipTo(ii),1,'first'))) = valuesToClipTo(ii); 
end 
hold all;plot(t,A,'r'); 

+0

乔恩这是我正在寻找扁平部分正是我想要做的。非常感谢您的时间和帮助,关于窗口我只需要在窗口上应用窗口让我们举一个例子,我需要将窗口大小(5)应用到我的信号上,并且希望在窗口持续时间内可视化我的信号,这就是我试图做的应用试图应用窗口来可视化我制作的信号。 – Peter

+0

乔恩1更多东西对不起,我现在可视化这个逻辑是伟大的,但如果我想只是下面的一个值下降,并使其平坦意味着在这种情况下之前本地最大值8我的值为0,所以它将我的图拉下来0但我希望它使信号平坦意味着8的直线,5的直线,4的直线等。对不起,我深深地想象它,所以我才知道这个问题。这是否有一些逻辑? – Peter

+1

不知道你的意思,因为我不知道我知道你的目标。也许使下一个值与本地最大值相同? 'A(locs + 1)= A(locs);' – 2017-08-17 16:17:04