我想计算时间序列的功率谱密度;进行一些带通、低通和高通滤波;也许还有其他一些基本的东西。
有没有一个不错的开源 Java 库可以做到这一点?
我已经搜索了一些但没有成功(例如,谷歌搜索“功率谱密度java”或“信号处理java”并点击链接,在Apache Commons、Sourceforge、java.net等中查找)。
有很多小程序、书籍、教程、商业产品等等,都不能满足我的需求。
更新: 我发现org.apache.commons.math.transform http://commons.apache.org/proper/commons-math/userguide/transform.html为傅里叶变换。这并没有实现功率谱密度、带通等,但它是一些东西。
我的第一个建议是不要使用 Java 进行 DSP 实现。我的第二个建议是用 Java 自己实现简单的 DSP 实现。
为什么不使用Java:
在过去的 10 多年里,我在编写 DSP 代码方面拥有丰富的经验……而且几乎没有 DSP 代码是用 Java 编写的……所以当我犹豫是否要阅读有关某人想要用 Java 实现 DSP 的文章时请原谅我。
如果你要做不平凡的DSP那么你不应该使用Java。用 Java 实现 DSP 之所以如此痛苦,是因为所有好的 DSP 实现都使用低级内存管理技巧、指针(大量的指针)、大型原始数据数组等。
为什么使用Java:
如果你正在做简单的DSP开发你自己的 Java 实现。像 PSD 和滤波这样的简单 DSP 东西都相对容易实现(实现简单,但速度不会很快),因为网上有太多的实现示例和详细记录的理论。
就我而言,我在 Java 中实现了一次 PSD 函数,因为我在 Java GUI 中绘制 PSD 图形,因此最简单的方法是在 Java 中降低性能并在 Java GUI 中计算 PSD,然后绘制它。
如何实现 PSD:
PSD 通常只是以 dB 为单位显示的 FFT 幅度。有许多来自学术、商业和开源的示例展示了如何计算 FFT 的幅度(以 dB 为单位)。例如Apache 有一个 Java 实现,可以为您提供 FFT http://commons.apache.org/proper/commons-math/userguide/transform.html输出,然后您只需转换为幅度和 dB。 FFT 之后的任何内容都应根据您的需要/想要进行定制。
如何实现低通、带通滤波:
我认为最简单的实现(不是计算效率最高的)是使用 FIR 滤波器并进行时域卷积。
卷积非常容易实现,它是两个嵌套的 for 循环,并且网上有数百万个示例代码。
如果您对滤波器设计一无所知,FIR 滤波器将是棘手的部分。最简单的方法是使用 Matlab 生成 FIR 滤波器,然后将系数复制到 java 中。我建议使用 Matlab 中的 firpmord() 和 firpm()。在阻带中实现 -30 至 -50 dB 衰减,在通带中实现 3 dB 纹波。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)