我想计算时间序列的功率谱密度; 做一些带通,低通和高通滤波; 也许其他一些基本的东西.
有没有一个很好的开源Java库来做到这一点?
我有点没有成功(例如,谷歌搜索"功率谱密度java"或"信号处理java"和点击链接,查看Apache Commons,Sourceforge,java.net等).
有许多小程序,书籍,教程,商业产品等,不符合我的需求.
更新:我找到了 org.apache.commons.math.transform进行傅立叶变换.这不实现功率谱密度,带通等,但它是一些东西.
我的第一个建议是不要用Java实现你的DSP实现.我的第二个建议是用Java自己编写自己的简单DSP实现.
为什么不使用Java:
在过去的10多年里,我有很多编写DSP代码的经验......而且几乎所有的DSP代码都不是用Java编写的......所以当我不愿意阅读有关想要用Java实现DSP的人时,请原谅我.
如果您要做非平凡的DSP,那么您不应该使用Java.DSP在Java中实现是如此痛苦的原因是因为所有优秀的DSP实现都使用低级内存管理技巧,指针(指针数量疯狂),大型原始数据数组等.
为什么要使用Java:
如果您正在进行简单的DSP操作,请使用自己的Java实现.像PSD和过滤这样的简单DSP事件都相对容易实现(易于实现,但它们不会很快),因为有太多的实现示例和在线记录的理论.
在我的情况下,我在Java中实现了一个PSD函数,因为我在Java GUI中绘制了PSD,因此最简单的方法是在Java中获取性能并在Java GUI中计算PSD然后绘制它.
如何实现PSD:
PSD通常只是以dB为单位显示的FFT幅度.学术,商业和开源中有很多例子说明如何以dB为单位计算FFT的幅度.例如,Apache有一个Java实现,它为您提供FFT输出,然后您只需要转换为幅度和dB.FFT之后的任何内容都应根据您的需要量身定制.
如何实现低通带通滤波:
在我看来,最简单的实现(不是计算效率最高)将使用FIR滤波器并进行时域卷积.
卷积非常容易实现,它是两个嵌套for循环,网上有数百万个示例代码.
如果您对滤波器设计一无所知,FIR滤波器将是棘手的部分.最简单的方法是使用Matlab生成FIR滤波器,然后将系数复制到java中.我建议使用Matlab中的firpmord()和firpm().在阻带中拍摄-30至-50 dB的衰减,在通带内拍摄3 dB的纹波.
我找到了Java Digital Signal Processing这本书及其示例源代码.您可以查看代码以查看它是否符合您的需求.
您还可以查看DSP实验室.
正如评论中提到的duffymo和basszero,自Java DSP发布以来,Java已经发生了一些变化,可能会影响一些代码示例.特别是,(相对)新的Concurrency Utilties包可能证明是有用的.
我编写了一些Java DSP类的集合,例如IIR过滤器:
Java DSP集合