In my course for the more technical part, we were introduced to signal processing, we had to use Octave with the audio package and gnu plot for plotting.
For the fun part of the course used MaxMSP/Jitter which is a commercial project,
but there's always PureData which is opensource and the Jitter equivalent would be PD Gem, but just for audio signal processing you should be fine with PureData.
In short, if you're into the number crunching bit, Octave should be fine.
We also did the image processing in Octave too, it's two dimensions as opposed to one(sound), but it's still signal processing. You can apply a high-pass or a low pass filter to an image too, you can try an echo/delay on images for fun if you like.
Pure Data is a bit different, since you patch cords instead of typing lots of code, but it's pretty fun and one of the advantages is that you can make changes live, while your patch/program is running which makes it great for fast prototyping.
Straying a bit from audio signal processing, if you're into generative music, you should have a look at some opensource projects like ChucK, SuperCollider, ixi
or fluxus...some do cool stuff with Haskell.
Update
On the c++ side you can also check out Dr. Mick Grierson's Maximilian library which also includes a nice little addon for OpenFrameworks
It's also worth checking out Sonic Visualiser and Vamp Plugins (a lot of nice goodies there)
HTH