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.