当前位置: 首页 > 知识库问答 >
问题:

更新:使用局部最大值可视化信号

魏翔
2023-03-14

我有一个信号,我想在我的信号中添加一个平台(平坦化),在我找到局部极大值的地方。

我在这里提供了一个示例,以使我的问题更容易理解,因为我实际数据的大小是1x166520,所以我无法在这里上载整个文件。

我想做什么,我期待什么:

•我想使信号平坦,以便在信号中找到局部最大值。

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

下面是输出外观的示意图

我在第5、1、7、8、4点有局部极大值。

当我处于局部极大值时,我希望我的信号变平(剪辑),并成为围绕该点的一条直线。

我还想控制展平的宽度。假设宽度是0.2,就像我在手绘草图中提到的那样。如果是这样,我想把它变成0.3,所以我也需要控制剪裁部分的宽度。

更清晰地更新了详细信息:

我在做什么:

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

测量信号有延迟、偏移、平坦。

我想通过在信号中加入延迟、偏移和平坦来使我的参考信号看起来像我测量的信号,以满足我的需要。

为了对原始信号进行展平,我观察到,在每个局部极大值处,我都得到了信号的展平,而在每个测量中,展平都是不同的。

所以我想让我的信号平坦在每个局部最大值。

Y轴:压扁高度(我要控制y轴压扁高度)

意味着我想做一个循环,其中包含y轴上不同的展平值,例如在第一次尝试中,我想给出0.1的展平,然后在第二次尝试中,我想给出0.2的所有局部最大值的展平,并观察它们的效果。简而言之,当我有局部最大值时,我想给出y轴上最大值的(locs-0.1)展平。

意味着如果我在5时达到峰值,那么我想在4.9时在(5-0.1)时给出平坦度。然后在第二个循环中,要检查(locs-0.2)在y轴上的局部最大值的影响。

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

X轴:展平宽度(我想更改展平宽度)

意思是我想通过给出一系列值来观察压扁宽度变化的效果。这可以通过循环的帮助来完成。

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

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

原始数据详情:

在我的原始数据中,x轴包含小数点的值,所以不想插值数据。

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

我的实际数据大小为1x1666520。

原始信号看起来像

窗口效果:

该窗口只是为了观察在局部极大值均值处发生的变化行为,例如如果压扁宽度为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')

关于乔恩扁平化建议的修改代码

Jon提出了一个想法,即考虑最大值前后的值,并使其与最大值相同,以使宽度可控。

 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');

  • 更新问题:

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

通过插值,它可以很好地对信号进行展平,但不幸的是,它消除了原始信号的量化,而且插值使过程非常缓慢。

是否有其他方法可以在局部极大值处剪裁信号?

我将非常感谢你的帮助,因为我在这个阶段一无所知。

我已经尝试并测试了john提供的代码。它工作得很好,但问题是我的数据。它包含量化步骤。

重要要点:

  1. 我的原始数据是分步或量化的

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

请求:

如果您有一些问题,请提问,这样我就能更好地进行查询。

共有1个答案

梁昊天
2023-03-14

不知道你在找什么,尤其是窗户。对于“x轴上的2个点”的展平,可能会使局部最大值与之前的值相同?

从代码继续:

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

编辑整个代码:

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');
 类似资料:
  • 我有一个熊猫数据框,有两列,一列是温度,另一列是时间。 我想做第三和第四列,叫做最小和最大。这些列中的每一个都将填充nan's,除非有一个局部min或max,那么它将具有该极值的值。 这里是一个数据的样本,本质上我试图识别图中所有的峰值和低点。 有没有内置的熊猫工具可以做到这一点?

  • 问题内容: 以下Ajax请求在做什么错…? 链接/通话: 路线: 控制器: 风景: 部分称为: 错误: 看起来Rails正在寻找一个名为“更新”的视图-为什么以及如何解决此问题? 非常感谢!汤姆 问题答案: 好的,对于任何有类似问题的人,我都找到了解决方案: 问题在于,在Rails3中,Prototype被jQuery取代。因此,以下代码不再有效: 以下2个链接将说明有关如何处理jQuery的详细

  • 问题内容: 我有一张桌子,上面有一张图表中的数据。 例如 我需要一个查询,该查询返回值在局部最大值处的结果,即特定索引处的值大于index + 1和index-1处的值。 因此,对于示例集,它应返回索引列表:2、6、9,它们对应于值7、12、14。 我在SQLite中使用PHP。我可以用php中的foreach循环来做到这一点,但想知道是否有一种简单的方法可以仅使用SQL命令来做到这一点。 任何输

  • 如果我想将一个名为“maximum_num”的新列突变到x上,其值为5.1,4.9,4.7等,我该怎么做?(我意识到糟糕的例子,因为这里都是Sepal.Length,但如果最大值每次来自不同的cols) 我想我可以用which.max但不知道如何编织。 我也试过 如何追加包含最大行值的新列? 有dplyr esque的方式吗?对base r也很满意。

  • 问题内容: 你能否建议使用中的模块函数在一维numpy数组中找到局部最大值/最小值?显然,最简单的方法是看一下最近的邻居,但我希望有一个被接受的解决方案,它是发行版的一部分。 问题答案: 如果你要查找一维数组中所有小于其邻居的条目,则可以尝试 你还可以在使用此步骤之前使数组平滑。 我认为没有专用的功能。

  • 当我试图设置表单错误对象时,我遇到了这个问题。基本上,我想在每个输入字段下方显示错误。作为回应,我得到了一个对象数组,我如何设置我的错误对象? 错误-超过了最大更新深度。当组件在useEffect内部调用setState,但useEffect没有依赖关系数组,或者每次呈现时依赖关系之一发生变化时,就会发生这种情况。