我的第一个建议是不要在 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 的纹波。