37

我想计算时间序列的功率谱密度;做一些带通、低通和高通滤波;也许其他一些基本的东西。

是否有一个不错的开源 Java 库来执行此操作?

我搜索了一些但没有成功(例如,谷歌搜索“功率谱密度 java”或“信号处理 java”并单击链接,查看 Apache Commons、Sourceforge、java.net 等)。

有很多小程序、书籍、教程、商业产品等,不能满足我的需求。

更新:我发现org.apache.commons.math.transform用于傅里叶变换。这并没有实现功率谱密度、带通等,但它是一些东西。

4

5 回答 5

23

我的第一个建议是不要在 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输出,然后您只需转换为幅度和 dB。FFT 之后的任何内容都应根据您的需要/想要进行定制。


如何实现低通、带通滤波:

在我看来,最简单的实现(不是计算效率最高的)是使用 FIR 滤波器并进行时域卷积。

卷积很容易实现,它是两个嵌套的 for 循环,网络上有数百万的示例代码。

如果您对滤波器设计一无所知,FIR 滤波器将是棘手的部分。最简单的方法是使用 Matlab 生成 FIR 滤波器,然后将系数复制到 java 中。我建议使用 Matlab 中的 firpmord() 和 firpm()。在阻带中实现 -30 到 -50 dB 的衰减,在通带中实现 3 dB 的纹波。

于 2009-06-07T23:05:49.227 回答
10

我编写了一些 Java DSP 类的集合,例如 IIR 过滤器:

Java DSP 集合

于 2013-08-25T21:33:17.517 回答
9

我找到了Java Digital Signal Processing一书及其示例源代码。您可能会查看代码以查看它是否符合您的需求。

您还可以查看DSP 实验室

正如评论中提到的 duffymo 和 basszero ,自 Java DSP 发布以来,Java 发生了一些变化,这可能会影响一些代码示例。特别是,(相对)新的Concurrency Utilties 包可能被证明是有用的。

于 2009-03-12T02:38:46.997 回答
3

它看起来很稀疏。尝试SignalgojeinIntel Signal Processing Library,尽管我认为最后一个只是 JNI 包装器。

我看到了很多你所说的小程序。我认为您可能能够为它们获取 JAR 并使用其中的类 API。但是,由于缺乏文档,可能不得不使用 eclipse 和 jad 来反编译并弄清楚它们的作用。例如,尝试此页面上的源。

于 2009-03-11T23:04:29.977 回答
2

我找到了另一个资源,虽然它不是图书馆:http ://www.dickbaldwin.com/tocdsp.htm 。这只是对信号处理和傅里叶变换的基本讨论,并附有一些 Java 示例。例如,请参阅教程 1478、1482、1486。不确定代码上的许可证是什么。

于 2009-03-18T18:22:14.550 回答