Yesterday I spent some time trying to implement a simulation of an SSB exciter that worked by using the Hilbert transform on some input audio, and then multiplying it through by a carrier signal in quadrature and summing (or differencing) the two resulting streams to produce the LSB or USB. I was getting poor cancellatio of the opposite sideband, but through a series of experiments determined that if I lengthened the FIR filter to a huge number of taps (around 600) I began to get the cancellation that I thought I would get. The lack of cancellation is worse at low frequencies, which is should be a clue. Before I went to bed, I thought I had it, but in the light of morning, now I am not so sure. I'll ponder it more.
But my morning reading found this website on MathWorks, which details the kind of math that I'm implementing in C. I'll review it again.
Addendum: Here's a brief glimpse of the kind of thing that I worked on. I've taken a regular mono signal recorded at 48khz, low pass filtered it at around a 3khz frequency, computed the Hilbert transform of it, and then frequency shifted the single sideband version of it up to a carrier frequency a little above 8khz (that would be VLF, I understand, but it is the principle of the thing!). This was computed using a Hilbert transform with 501 taps (250 non zero entries):
If I try to compute the same thing with only 201 taps, you can see that some of the very low frequency signals are visible in the lower sideband opposite their USB constituents.
I need to ponder this some more.
Addendum2: Just as a little test, I tried modulating my voice up by just 350 hertz, simulating reception of a signal on USB, but tuned 350 hz too low. You get the classic Daffy Duck type speech (sans any noise that is typical on HF):