更新:使用局部最大值

时间:2017-08-17 13:42:54

标签: matlab time-series signal-processing sampling

我有一个信号,我想在我的信号中添加一个平台(Flattening),我找到了局部最大值。

我在这里提供了一个示例,使我的问题更容易理解,因为我的实际数据的大小是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点达到峰值,那么我想在(5-0.1)4.9处进行压扁。 然后在第二个循环中想要检查(locs-0.2)在y轴上的局部最大值中的效果。

想要为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')

关于建议Jon进行展平的修改代码

Jon提出了一个想法,即考虑maxima之前和之后的值,并使它们与maxima相同,以使宽度可控。

 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的小数点。 所以我的信号被采样和量化。

通过插值,它可以完美地对信号进行平坦处理,但遗憾的是它正在消除原始信号的量化,并且插值也使得该过程非常缓慢。

还有其他方法可以在局部最大值处剪切信号吗?

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

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

要点:

  1. 我的原始数据是步骤或量化。
  2. 它包含大小为0.001的小数点,因此通过插入x轴和y轴上的点。所以我的数据和时间包含差异为0.001的点。
  3. 通过做插值,它工作正常,但问题是它正在消除信号的量化。
  4. 如果有人帮助我,我将非常感激你。

    请求:

    如果您有任何问题,请询问,以便我能够更好地查询。

1 个答案:

答案 0 :(得分:2)

不确定您要查找的内容,尤其是窗口。对于在x轴上平坦到" 2点"也许使局部最大值与前一个值相同?

继续你的代码:

library(tm)
library(XML)
library(SnowballC)

doc<-VCorpus(VectorSource(readLines(file.choose())))

doc <- tm_map(doc, stripWhitespace)

doc <- tm_map(doc, stemDocument)

doc<-tm_map(doc, content_transformer(tolower))

doc<-tm_map(doc, removeWords, stopwords("english"))

myStopwords <- c(stopwords("english"), "can", "will")
myStopwords <- setdiff(myStopwords, c("will","can"))
doc <- tm_map(doc, removeWords, myStopwords)

doc<-tm_map(doc,removeNumbers)


#If you omit this step, the error will not appear in "TermDocumentMatrix".
doc <- tm_map(doc, gsub, pattern = "buy", replacement = "bought")

doc <- TermDocumentMatrix(doc, control=list(removePunctuation=T))

enter image description here

修改 整个代码:

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