我想计算时间序列的功率谱密度;做一些带通,低通和高通滤波;也许是其他一些基本的东西。
有没有一个很好的开源Java库来做到这一点?
我有点没有成功(例如,谷歌搜索“功率谱密度java”或“信号处理java”和点击链接,查看Apache Commons,Sourceforge,java.net等)。
有许多小程序,书籍,教程,商业产品等,不能满足我的需求。
更新 :我找到了org.apache.commons.math.transform进行傅立叶变换。这没有实现功率谱密度,带通等,但它确实存在。
答案 0 :(得分:23)
我的第一个建议是不要用Java实现DSP实现。我的第二个建议是用Java自己编写简单的DSP实现。
为什么不使用Java:
我在过去10多年里有很多编写DSP代码的经验......而且几乎所有的DSP代码都不是用Java编写的......所以当我犹豫不决地阅读有关想要实现DSP的人时,请原谅我Java的。
如果你要做非平凡的DSP 那么你不应该使用Java。在Java中实现DSP是如此痛苦的原因是因为所有优秀的DSP实现都使用低级内存管理技巧,指针(指针数量疯狂),大型原始数据数组等。
为什么要使用Java:
如果你正在做简单的DSP 那么你可以使用自己的Java实现。像PSD和过滤这样的简单DSP事件都相对容易实现(易于实现,但它们不会很快),因为有太多的实现示例和在线记录的理论。
在我的情况下,我在Java中实现了一个PSD函数,因为我在Java GUI中绘制了PSD,因此最简单的方法是在Java中获取性能并在Java GUI中计算PSD然后绘制它。
如何实施PSD:
PSD通常只是以dB为单位显示的FFT幅度。学术,商业和开源中有很多例子说明如何以dB为单位计算FFT的幅度。例如Apache has a Java implementation that gives you the FFT输出,然后您只需要转换为幅度和dB。 FFT后的任何内容都应根据您的需要量身定制。
如何实现低通带通滤波:
在我看来,最简单的实现(不是计算效率最高)将使用FIR滤波器并进行时域卷积。
卷积很容易实现它是两个嵌套for循环,网上有数百万个示例代码。
如果您对滤波器设计一无所知,FIR滤波器将是棘手的部分。最简单的方法是使用Matlab生成FIR滤波器,然后将系数复制到java中。我建议使用Matlab中的firpmord()和firpm()。拍摄阻带中的-30至-50 dB衰减和通带中的3 dB纹波。
答案 1 :(得分:9)
我找到了这本书Java Digital Signal Processing及其example source code。您可以查看代码以查看它是否符合您的需求。
您还可以查看DSP Laboratory。
正如评论中提到的duffymo和basszero,自Java DSP发布以来,Java已经发生了一些变化,可能会影响一些代码示例。特别是,(相对)新的Concurrency Utilties package可能有用。
答案 2 :(得分:9)
我编写了一些Java DSP类的集合,例如: IIR过滤器:
答案 3 :(得分:3)
看起来很稀疏。试试Signalgo或jein或Intel Signal Processing Library,不过我认为最后一个只是一个JNI包装器。
我看到了很多你正在谈论的小程序。我想你可以为他们获取JAR并使用里面的类API。但是,由于缺乏文档,可能不得不使用eclipse和jad来反编译并弄清楚它们的作用。例如,尝试this page上的来源。
答案 4 :(得分:2)
我找到了另一个资源,虽然它不是一个库:http://www.dickbaldwin.com/tocdsp.htm。它只是对信号处理和傅里叶变换的基本讨论,以及一些Java示例。请参阅示例教程1478,1482,1486。不确定代码上的许可证是什么。