web-dev-qa-db-fra.com

Bibliothèque de traitement du signal en Java?

Je voudrais calculer la densité spectrale de puissance des séries temporelles; faire un filtrage passe-bande, passe-bas et passe-haut; peut-être quelques autres trucs de base.

Existe-t-il une bibliothèque open source Nice Java pour cela?

J'ai chassé un peu sans succès (par exemple, googler "densité spectrale de puissance Java" ou "traitement du signal Java" et cliquer sur des liens, en regardant dans Apache Commons, Sourceforge, Java.net, etc.).

Il existe de nombreuses applets, livres, tutoriels, produits commerciaux, etc., qui ne répondent pas à mes besoins.

Mise à jour: J'ai trouvé org.Apache.commons.math.transform pour les transformées de Fourier. Cela n'implémente pas la densité spectrale de puissance, la bande passante, etc., mais c'est quelque chose.

35
dfrankow

Ma première suggestion est de ne pas faire votre implémentation DSP en Java. Ma deuxième suggestion serait de lancer vous-même vos propres implémentations DSP simples en Java.


Pourquoi ne pas utiliser Java:

J'ai beaucoup d'expérience dans l'écriture de code DSP au cours des 10 dernières années ... et presque aucun du code DSP n'est en Java ... alors pardonnez-moi quand j'hésite à lire à propos de quelqu'un qui veut implémenter DSP en Java.

Si vous allez faire DSP non trivial alors vous ne devriez pas utiliser Java. La raison pour laquelle DSP est si pénible à implémenter dans Java est parce que toutes les bonnes implémentations DSP utilisent des astuces de gestion de mémoire de bas niveau, des pointeurs (quantités folles de pointeurs), de grands tableaux de données brutes, etc.

Pourquoi utiliser Java:

Si vous faites des trucs DSP simples lancez votre propre Java. Les choses DSP simples comme la PSD et le filtrage sont à la fois relativement facile à implémenter (implémentation facile mais ils ne seront pas rapides) car il y a tellement d'exemples d'implémentation et de théorie bien documentée en ligne.

Dans mon cas, j'ai implémenté une fonction PSD dans Java une fois parce que je représentais graphiquement le PSD dans une interface graphique Java donc il était plus facile de simplement prendre les performances dans Java et faites calculer le PSD dans l'interface graphique Java puis tracez-le).


Comment implémenter un PSD:

Le PSD est généralement juste la magnitude de la FFT affichée en dB. Il existe de nombreux exemples académiques, commerciaux et open source montrant comment calculer la magnitude de la FFT en dB. Par exemple Apache a une sortie Java implémentation qui vous donne la FFT puis il vous suffit de convertir en amplitude et dB. Tout ce qui se trouve après la FFT doit être adapté à ce vous avez besoin/voulez.


Comment mettre en œuvre un filtrage passe-bas et passe-bande:

La mise en œuvre la plus simple (pas la plus efficace en termes de calcul) consisterait à mon avis à utiliser un filtre FIR et à effectuer une convolution dans le domaine temporel.

La convolution est très facile à implémenter, il s'agit de deux boucles imbriquées et il y a littéralement des millions d'exemples de code sur le net.

Le filtre FIR sera la partie délicate si vous ne savez rien sur la conception du filtre. La méthode la plus simple serait d'utiliser Matlab pour générer votre filtre FIR, puis de copier les coefficients dans Java. Je suggère d'utiliser firpmord () et firpm () de Matlab. Tirez pour une atténuation de -30 à -50 dB dans la bande d'arrêt et une ondulation de 3 dB dans la bande passante.

23

J'ai trouvé le livre Java Digital Signal Processing et son exemple de code source . Vous pouvez parcourir le code pour voir s'il correspond à vos besoins.

Vous pouvez également consulter Laboratoire DSP .

Comme leffymo et basszero l'ont mentionné dans les commentaires, des modifications ont été apportées à Java depuis la publication de Java DSP), ce qui peut avoir une incidence sur certains exemples de code. En particulier , le (relativement) nouveau package Concurrency Utilties pourrait s'avérer utile.

9
Bill the Lizard

J'ai écrit une collection de certaines classes Java DSP, par exemple les filtres IIR:

collection Java DSP

9

Il semble assez clairsemé. Essayez Signalgo ou jein ou Intel Signal Processing Library , bien que je pense que le dernier n'est qu'un wrapper JNI.

J'ai vu beaucoup de ces applets dont vous parliez. Je pense que vous pourrez peut-être obtenir les fichiers JAR pour eux et utiliser les API de classe à l'intérieur. Il faudra peut-être utiliser Eclipse et jad pour décompiler et comprendre ce qu'ils font, cependant, en raison du manque de documentation. Essayez la source sur cette page par exemple.

3
John Ellinwood

J'ai trouvé une autre ressource, bien que ce ne soit pas une bibliothèque: http://www.dickbaldwin.com/tocdsp.htm . C'est juste une discussion de base sur le traitement du signal et la transformation de Fourier, avec quelques exemples Java. Voir par exemple les tutoriels 1478, 1482, 1486. ​​Je ne sais pas quelle est la licence sur le code.

2
dfrankow