识别组件频率并计算曲线的积分

时间:2012-02-16 14:48:06

标签: java math signal-processing fft wave

我在5分钟内有1200个振幅数据样本,数据中有4-5个“尖峰”。它们可以相互靠近,因此可以出现“肩膀”。数据也有些嘈杂。

enter image description here

我需要:

  • 以编程方式确定出现这些峰值的时间,
  • 最终确定曲线的积分以找出每个离散峰下的面积,忽略附近邻居的振幅

后一个要求让我觉得我需要为每个组件派生一个函数,并使用该函数计算下面的区域。

这是一个离散小波变换问题吗?傅里叶变换?短时傅立叶变换?别的什么?是否有Java库来帮助解决这个问题?

我正在寻找一种方法来确定5个方程,当它们加在一起时,产生原始数据曲线。可能就像这些高斯曲线(我只是用眼球)

Gaussian Curve

3 个答案:

答案 0 :(得分:1)

如果您的峰值有某种理论模型(比如高斯等),那么您可以使用每个峰周围的一些点对每个峰进行回归拟合,然后查找给定模型的积分你的派生参数。

答案 1 :(得分:0)

找到峰值你可以试试这样的......

  • 获取样本的三个点
  • 将最后一个值与下一个值进行比较,您可以找到峰值出现的位置
  • 当前值大于上一个和下一个时,您将有一个峰值

以下是matlab中的make!

How to detect local maxima and curve windows correctly in semi complex scenarios?

如果你现在达到峰值,你可以为y轴安装抛物线表达式,抛物线的一般形式:

y = ax ^ 2 + bx + c

然后,如果曲线的峰值出现在点,例如:y = 3,你有一个抛物线=:

f(x)= y = -3x ^ 2 + 6x

之后,您需要找到x轴曲线的起点和结束位置

这样你就可以应用积分区了!

enter image description here

b =在x轴上找到上点

a =在x轴找到下点

最后你有了这个区域

答案 2 :(得分:0)

如果我理解你的问题,这与小波变换或傅里叶变换无关。

要查找峰值,您只需按顺序循环每个数据样本并比较相邻值。每当你在增加后减少,你就会有一个高峰。在实践中,您需要应用一些过滤以防止因噪声而检测到错误的峰值。如果你的噪音不是太强,一个简单的平均滤波器,可能是多次通过可以解决你的问题。你可以使用傅里叶变换进行过滤,但我很确定不需要它。

要计算面积,您可以将每个样品对视为一列。每列的宽度相等(因为您的样本在时间上是等距的),例如,两个样本的平均高度,以及宽度*高度的区域。然后,您只需总结所有列的区域。还有其他方法可以获得更好的精确度,例如使用平行四边形而不是矩形柱。