My first suggestion is to not do your DSP implementation in Java. My second suggestion would to roll your own simple DSP implementations yourself in Java.
Why not to use Java:
I work in a company who's main selling point is DSP related products (about 300 Million revenue per year)... and none of our DSP is in Java... so forgive me when I am hesitant to read about someone who wants to implement DSP in java.
If you are going to be doing non-trivial DSP then you shouldn't be using Java. The reason that DSP is so painful to implement in Java is because all the good DSP implementations use low level memory management tricks, pointers (crazy amounts of pointers), large raw data arrays, etc.
Why to use Java:
If you are doing simple DSP stuff roll your own Java implementation. Simple DSP things like PSD and filtering are both relatively easy to implement (easy implementation but they won't be fast) because there is soo many implementation examples and well documented theory online.
In my case I implemented a PSD function in Java once because I was graphing the PSD in a Java GUI so it was easiest to just take the performance hit in Java and have the PSD computed in the java GUI and then plot it.
How to implement a PSD:
The PSD is usually just the magnitude of the FFT displayed in dB. Start by copying the C code from Numerical Recipes section talking about FFT. Convert the FFT code to Java. (If your data array is real use Numerical Recipes: FFT of Single Real Function. Look for function: void realft(float data[], unsigned long n, int isign)
). Take the 10 * log10(abs(data[])) of the output from realft(). Now you have your own PSD in Java and you have learned something about DSP/FFT.
Before you get upset about suggesting converting C code to Java let me tell you that I have already implemented this specific code to Java and it works decently (the code doesn't use any fancy C tricks that would make the Java implementation horrible).
How to implement lowpass, bandpass filtering:
The easiest implementation (not the most computationally efficient) would in my opinion be using an FIR filter and doing time domain convolution.
Convolution is very easy to implement it is two nested for loops and there are literally millions of example code on the net.
The FIR filter will be the tricky part if you don't know anything about filter design. The easiest method would be to use Matlab to generate your FIR filter and then copy the coefficents into java. I suggest using firpmord() and firpm() from Matlab. Shoot for -30 to -50 dB attenuation in the stopband and 3 dB ripple in the passband.