There are several ways to generate a single side band signal in a software radio and I am slowly exploring each and every one of them. For this first attempt I have decided to try using a basic amplitude modulation followed by a bandpass filter with complex taps that can select either the upper or the lower side bands.
The concept of amplitude modulation is very simple: We have a carrier wave who’s amplitude is modulated using the incoming audio signal. Now, the term carrier wave is a bit undefined in a software radio where we work at baseband. Of course, we still have a carrier but it is generated by the USRP and we can not modulate it from our flow graph. Nevertheless , we can still use this principle by modulating a sine wave which will take the role of the carrier. I think we can compare this sine wave to a local oscillator in a heterodyne hardware transmitter 😉
The frequency of this “local oscillator” will lead to an offset of our signal from the centre frequency, but we can compensate for that. In fact, when using an oscillator with complex output it even makes sense to put its frequency to 0 Hz.
The audio input is a real stream and we have to multiply this (mix it) with the complex output of the sine wave generator. In GNU Radio we can not mix real and complex signals, so we have to convert the real audio stream to a complex stream with imaginary part 0. It is still a real stream but now in complex format.
After the modulator (the multiply block) we have a band pass filter with complex taps. Complex taps allow us to use negative cutoff frequencies, which is what we use for selecting the side band. Using a pass band of -3000 … -300 Hz we get a lower side band signal, using 300 … 3000 Hz we get the upper side band. That’s all! After the filter we have the single side band signal.
You’ll notice that I have inserted a second mixer that is used to tune ±25 kHz within the passband. There is also a block for increasing the signal level since the numerical range of the USRP is signed 16 bit numbers. Of course all this could be optimised by using higher gains in the previous blocks.
This may not be the preferred way to generate SSB in a software radio but it works and even sounds good. The video below shows a simple demo using my FT-817 as receiver.
Watch video on YouTube.
I’ll be back later with other methods for generating SSB, but for now, this example seems quite adequate. The GRC files are available from my github repository.