What is causing these spikes in the output of the low pass filter?
I don't have MatLab with the DSP toolbox, but you're calling filter wrong.  Use:

y = filter(Hd, [1], x);


to set the feedback taps properly to $[1]$.

You should also inspect your filter design by using

freqz(Hd, [1], 512, 8000);


Although my hunch is that amplitude spikes in the output are directly caused by the filtering of the phase discontinuities you intentionally added when performing FM modulation.

Really, no modern equipment uses frequency switching to perform FSK.  FSK emitted from modern equipment is almost always continuous phase.  Are you really dealing with an ancient piece of Bell 103 modem hardware?

An example Octave script that generates the complex I/Q samples of continuous phase FSK is here:

https://dsp.stackexchange.com/a/53834/28112

if you need an example of how to generate CPFSK.