35 votes

Bibliothèque de traitement du signal en Java ?

J'aimerais calculer la densité spectrale de puissance de séries temporelles, faire un peu de filtrage passe-bande, passe-bas et passe-haut, et peut-être d'autres trucs de base.

Existe-t-il une belle bibliothèque Java à code source ouvert pour faire cela ?

J'ai cherché un peu sans succès (par exemple, en tapant sur Google "power spectral density java" ou "signal processing java" et en cliquant sur les liens, en cherchant dans Apache Commons, Sourceforge, java.net, etc.)

Il y a beaucoup d'applets, de livres, de tutoriels, de 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, le passe-bande, etc., mais c'est quelque chose.

23voto

Trevor Boyd Smith Points 3513

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


Pourquoi ne pas utiliser Java :

Je travaille dans une entreprise dont le principal argument de vente est les produits liés au DSP (environ 300 millions de revenus par an)... et aucun de nos DSP n'est en Java... alors pardonnez-moi si j'hésite à lire quelqu'un qui veut implémenter le DSP en Java.

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

Pourquoi utiliser Java :

Si vous faites simple DSP stuff roll your own Java implementation. Les choses simples de DSP comme le PSD et le filtrage sont toutes deux relativement faciles à mettre en œuvre (mise en œuvre facile mais pas rapide) parce qu'il y a tellement d'exemples de mise en œuvre et de théorie bien documentée en ligne.

Dans mon cas, j'ai implémenté une fonction PSD en Java une fois parce que je devais tracer le graphique du PSD dans une interface graphique Java. Il était donc plus facile de prendre le coup de performance en Java et de faire calculer le PSD dans l'interface graphique Java, puis de le tracer.


Comment mettre en œuvre une DSP :

La DSP est généralement juste la magnitude de la FFT affichée en dB. Commencez par copier le code C de Recettes numériques section parlant de la FFT. Convertissez le code FFT en Java. (Si votre tableau de données est réel, utilisez Recettes numériques : FFT d'une seule fonction réelle . Recherchez la fonction : void realft(float data[], unsigned long n, int isign) ). Prenez les 10 * log10(abs(data[])) de la sortie de realft(). Vous avez maintenant votre propre PSD en Java et vous avez appris quelque chose sur le DSP/FFT.

Avant que vous ne vous mettiez en colère en suggérant de convertir du code C en Java, laissez-moi vous dire que j'ai déjà implémenté ce code spécifique en Java et qu'il fonctionne décemment (le code n'utilise aucune astuce C fantaisiste qui rendrait l'implémentation Java horrible).


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

L'implémentation la plus simple (mais pas la plus efficace en termes de calcul) serait à mon avis d'utiliser un filtre FIR et de faire une convolution dans le domaine temporel.

La convolution est très facile à mettre en œuvre : il s'agit de deux boucles for imbriquées et il existe littéralement des millions d'exemples de code sur le net.

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

9voto

Bill the Lizard Points 147311

J'ai trouvé le livre Traitement du signal numérique en Java et son exemple de code source . Vous pouvez examiner le code pour voir s'il correspond à vos besoins.

Vous pouvez également consulter Laboratoire DSP .

Comme l'ont mentionné duffymo et basszero dans les commentaires, des changements ont été apportés à Java depuis la publication de Java DSP, ce qui peut avoir un impact sur certains des exemples de code. En particulier, le (relativement) nouveau Paquet Utilités de la concussion pourrait s'avérer utile.

9voto

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

Collection Java DSP

3voto

John Ellinwood Points 6578

Il a l'air plutôt clairsemé. Essayez Signalgo ou jein ou le Bibliothèque Intel de traitement des signaux mais je pense que le dernier n'est qu'une enveloppe JNI.

J'ai vu beaucoup de ces applets dont vous parliez. Je pense que vous pouvez obtenir les JARs pour eux et utiliser les APIs de classe à l'intérieur. Vous devrez peut-être utiliser eclipse et jad pour décompiler et comprendre ce qu'ils font, en raison du manque de documentation. Essayez les sources sur cette page par exemple.

2voto

dfrankow Points 2983

J'ai trouvé une autre ressource, bien qu'il ne s'agisse pas d'une bibliothèque : http://www.dickbaldwin.com/tocdsp.htm . Il s'agit juste d'une discussion de base sur le traitement du signal et la transformée de Fourier, avec quelques exemples en Java. Voir par exemple les tutoriels 1478, 1482, 1486. Je ne sais pas quelle est la licence sur le code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X