【问题标题】:Identify component frequencies and calculate integrals for curves识别分量频率并计算曲线的积分
【发布时间】:2025-11-30 02:25:01
【问题描述】:

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

我需要:

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

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

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

我正在寻找一种方法来确定 5 个方程式,当它们相加时,会产生原始数据曲线。可能类似于这些高斯曲线(我只是目测)

【问题讨论】:

  • 这些峰的形状是否遵循任何数学模型?如中,时域波形可以表示为一堆时间偏移参数化峰值的总和吗?如果没有,那么我认为没有任何有意义的方法可以隔离它们。
  • @Oli,峰值是正弦波(几乎)
  • +1。因为每个帖子都有图表更好。
  • 在某些情况下,图中的组件之间有更多的重叠。我相信这将使计算每个单独组件的面积变得更加困难。如果我可以导出构成整体信号的各个函数,这将很容易。但是派生这些函数的最佳方法是什么?

标签: java math signal-processing fft wave


【解决方案1】:

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

【讨论】:

  • 你好 hotpaw,这听起来很有希望。该术语对我来说大多是新的,但我的曲线形状确实看起来是高斯的。我在示例文件中添加了一个近似方程。在 Java 中,我该如何进行回归拟合?您是否知道可以帮助解决此问题的数学库,或者自己做起来容易吗?
【解决方案2】:

如果我正确理解您的问题,这与小波或傅立叶变换无关。

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

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

【讨论】:

  • 感谢回复,我已经把积分部分的要求说清楚了。由于构成图表的信号分量可以是附近的邻居,因此我需要计算每个分量的面积,而不受附近邻居输出的影响。
【解决方案3】:

要找到峰,您可以尝试这样的事情...

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

这是在matlab中的制作方法!

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轴的曲线在哪里开始和在哪里结束

这样你就可以申请积分区了!

b = 在 x 轴上查找上点

a = 在 x 轴上查找较低点

然后你终于有了这个区域

【讨论】:

  • 谢谢eder,我猜我会在执行此操作之前对数据进行平滑处理?给定峰值位置,我将如何计算曲线的积分?
  • 没问题,你可以平滑并且仍然可以工作,除了找到峰值你需要知道它的开始和结束位置来计算它的面积
  • 然后让每一列无限小,你会得到精确的面积(耶微积分)