Java中的信号处理库? [关闭]
Posted
技术标签:
【中文标题】Java中的信号处理库? [关闭]【英文标题】:Signal processing library in Java? [closed] 【发布时间】:2010-10-12 19:25:06 【问题描述】:我想计算时间序列的功率谱密度;做一些带通、低通和高通滤波;可能还有一些其他基本的东西。
是否有一个不错的开源 Java 库来执行此操作?
我搜索了一些但没有成功(例如,谷歌搜索“功率谱密度 java”或“信号处理 java”并单击链接,查看 Apache Commons、Sourceforge、java.net 等)。
有很多小程序、书籍、教程、商业产品等,不能满足我的需求。
更新:我发现org.apache.commons.math.transform 用于傅里叶变换。这并没有实现功率谱密度,带通等,但它是一些东西。
【问题讨论】:
有没有人知道任何类似的 C/C++ 库? 首先,这个问题是关于 Java,而不是 C。:) 其次,FFTW 看起来像 FFT。带通、低通、高通滤波、功率谱密度等呢?显然,FFT 构成了基础,但不是这些操作的高级接口。 github.com/JorenSix/TarsosDSP 现在问这个问题已经六年了。我正在寻找一个可用于我的学习的数字信号处理(在我的情况下为音乐信号处理)的 java 库。 @dfrankow 您是否为您的任务找到了一个 java 库?或者您知道在您提出问题后引入的任何新的 Java 库吗? 我不明白为什么这个问题是“离题”。这似乎非常密切,并且鉴于正在进行的评论,这对其他人也很重要。是否应该重新打开这个问题以获得新的答案? 【参考方案1】:我的第一个建议是不要在 Java 中实现 DSP。我的第二个建议是用 Java 自己实现简单的 DSP。
为什么不使用 Java:
在过去的 10 多年里,我有很多编写 DSP 代码的经验……而且几乎没有任何 DSP 代码是用 Java 编写的……所以当我犹豫是否读到有人想用 DSP 实现 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 纹波。
【讨论】:
我不再做这个了,但是从数字食谱开始商业应用程序是不合适的。 Apache Commons Math 有一个 FFT:commons.apache.org/math/userguide/transform.html。 @dfrankow github.com/JorenSix/TarsosDSP 应该是一个更好的开始 我想知道“不要在 Java 中这样做”的说法。 Java 有一种很好的方式来处理任何内存管理任务,包括惊人的快速内存映射文件。尽管 Java 本身无法使用原始指针,但它确实为您提供了所有高级且更安全的结构来管理内存缓冲区。简单地说,一个简单的数组可以用作循环缓冲区。只需访问数组的元素,而不是使用凌乱的指针算法来找出它实际存储在内存中的位置。【参考方案2】:我已经编写了一些 Java DSP 类的集合,例如IIR 过滤器:
Java DSP collection
【讨论】:
虽然例子很少,API 似乎很灵活。谢谢!【参考方案3】:我找到了这本书 Java Digital Signal Processing 和它的 example source code。您可以查看代码,看看它是否符合您的需求。
您也可以查看DSP Laboratory。
正如 cmets 中提到的 duffymo 和 basszero,自 Java DSP 发布以来,Java 发生了一些变化,这可能会影响一些代码示例。特别是,(相对)新的Concurrency Utilties package 可能会很有用。
【讨论】:
哇,这本书是 1997 年的复古书。我不确定我是否会推荐它。信号处理思想没有改变,但 Java 确实改变了。 您认为哪些变化会对数字信号处理产生影响? @duffymo:从那时起,Java 中唯一的进步是一些并发原语(因为 dsp BEGS 用于多线程)。通常 dsp 是原始数组的数学运算。我和比尔在一起。 对我们来说更重要的是,一本书不太可能拥有开源许可,因此我们无法将其用于我们的工作。 抱歉,这本书的源代码有 GPL 许可!【参考方案4】:它看起来很稀疏。试试Signalgo 或jein 或Intel Signal Processing Library,虽然我认为最后一个只是JNI 包装器。
我看到了很多你所说的小程序。我认为您可能能够为它们获取 JAR 并使用其中的类 API。但是,由于缺乏文档,可能不得不使用 eclipse 和 jad 来反编译并弄清楚它们的作用。例如,尝试this page 上的源代码。
【讨论】:
感谢参考。老实说,我很欣赏他们。 signalgo 是“alpha(即根本没有测试!!)”jein 没有我能找到的源代码。英特尔不会开源。【参考方案5】:我找到了另一个资源,虽然它不是图书馆:http://www.dickbaldwin.com/tocdsp.htm。这只是对信号处理和傅里叶变换的基本讨论,并带有一些 Java 示例。例如,请参阅教程 1478、1482、1486。不确定代码上的许可证是什么。
【讨论】:
以上是关于Java中的信号处理库? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章