私の最初の提案は、JavaでDSP実装を行わないことです。私の2番目の提案は、Javaで独自の単純なDSP実装を自分でロールすることです。
Javaを使用しない理由:
私は過去10年以上にわたってDSPコードを書いた経験が豊富です...そしてほとんどのDSPコードはJavaにありません...JavaでDSPを実装したい人について読むのをためらっているときは許してください。
重要なDSPを実行する場合は、Javaを使用しないでください。DSPをJavaで実装するのが非常に難しい理由は、すべての優れたDSP実装が、低レベルのメモリ管理トリック、ポインター(クレイジーな量のポインター)、大量の生データ配列などを使用するためです。
Javaを使用する理由:
単純なDSPを実行している場合は、独自のJava実装をロールします。オンラインでの実装例が非常に多く、理論が十分に文書化されているため、PSDやフィルタリングなどの単純なDSPは、どちらも比較的簡単に実装できます(実装は簡単ですが、高速ではありません)。
私の場合、Java GUIでPSDをグラフ化していたため、JavaでPSD関数を一度実装したので、Javaでパフォーマンスヒットを取得し、Java GUIでPSDを計算して、それをプロットするのが最も簡単でした。
PSDを実装する方法:
PSDは通常、dBで表示されるFFTの大きさです。FFTの大きさをdBで計算する方法を示す、学術、商業、およびオープンソースからの多くの例があります。たとえば、ApacheにはFFT出力を提供するJava実装があり、マグニチュードとdBに変換する必要があります。FFTの後は、必要なもの/欲しいものに合わせて調整する必要があります。
ローパス、バンドパスフィルタリングを実装する方法:
私の意見では、最も簡単な実装(最も計算効率が高いわけではありません)は、FIRフィルターを使用して時間領域の畳み込みを行うことです。
畳み込みは非常に簡単に実装でき、2つのネストされたforループがあり、ネット上には文字通り何百万ものサンプルコードがあります。
フィルタの設計について何も知らない場合、FIRフィルタは扱いにくい部分になります。最も簡単な方法は、Matlabを使用してFIRフィルターを生成し、係数をJavaにコピーすることです。Matlabのfirpmord()とfirpm()を使用することをお勧めします。阻止帯域で-30〜-50 dBの減衰、通過帯域で3dBのリップルを撮影します。