Java中的信号处理库?[已关闭]

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

有没有一个很好的开源Java库来做到这一点?

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

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

更新:我发现了org.apache.commons.math.transform for Fourier transforms。这不能实现功率谱密度,带通等,但它是某种东西。


答案 1

我的第一个建议是不要用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滤波器并进行时域卷积。

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

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


答案 2

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

Java DSP 集合


推荐