Simulation example: Single Sideband transceiver: Difference between revisions

From GNU Radio
Jump to navigation Jump to search
No edit summary
(Incorporate suggested improvements)
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<!-- Simulation_example:_Single_Sideband_transceiver.mediawiki -->
<!-- Simulation_example:_Single_Sideband_transceiver.mediawiki -->
This tutorial explains how a Single Sideband (SSB) signal can be generated and received. Rather than using any real hardware for transmission, the signal is sent via a socket from the transmit section to the receive section. The only actual hardware involved is the computer's microphone input and speaker output. In the case of a Raspberry Pi computer, which has no microphone input, two alternatives are presented.
This tutorial explains how a Single Sideband (SSB) signal can be generated and received. The transmitter and receiver use the filter method.


This tutorial can be performed with either GNU Radio (GR) version 3.7 or 3.8 (and later). The Graphical User Interface gnuradio-companion (GRC) is used to create a flowgraph for each section.
<code>Tested with v3.10.9.2</code><br>


== Prerequisites ==
== Prerequisites ==


* [[Guided_Tutorial_GRC|'''Intro to GR usage: GRC and flowgraphs''']]
* [[Guided_Tutorial_GRC|'''Intro to GR usage: GRC and flowgraphs''']]
* [[Sample_Rate_Tutorial|'''Understanding sample rate''']]
* [[Variables_in_Flowgraphs|'''Variables in Flowgraphs''']]


== SSB receiver ==
== Flowgraph ==


=== The Weaver method of SSB demodulation ===
The following flowgraph can be downloaded by clicking [[Media:SSB_demo.grc]]. Using a terminal screen, start `gnuradio-companion` and open the downloaded file.


Traditionally, SSB has been created and received using narrow bandpass filters, or by using a "phasing method" requiring a 90 degree phase shift network across the audio spectrum. In 1956 Donald Weaver published a third method in the Proceedings of the IRE ("A Third Method of Generating and Detecting Single Side Band Signals", Dec. 1956). It involves the use of a local oscillator with a frequency in the middle of the audio spectrum (1500Hz) for the I and Q signals separately, and then adding or subtracting them to recover the upper or lower sideband audio.
[[File:SSB_demo_fg.png|800px]]


=== Flowgraph ===
=== Transmitter section ===


Using gnuradio-companion (GRC) and the following Block descriptions, build this flowgraph of the receiver section:<br>
* The transmitter section is across the upper row of blocks starting with the [[Audio Source]] (your microphone).
* The [[Band Pass Filter]] has a low frequency cutoff of 300Hz and a high frequency cutoff of 3500Hz to pass normal voice frequencies. The Gain parameter is set by the [[QT GUI Range]] block labeled "Mic gain".
* The [[Swap IQ]] block interchanges the Real and Imaginary components which effectively changes upper and lower sidebands.
* The [[Selector]] block chooses which input to use, based on the [[QT GUI Chooser]] labeled "Transmit Sideband".
* The [[QT GUI Time Sink]] shows a 'scope trace' of the audio signal.
* The [[QT GUI Frequency Sink]] shows the frequency plot of the audio.
* The [[QT GUI Waterfall Sink]] shows the signals on a waterfall (spectrogram) plot. The bandwidth of the audio can be seen clearly on the plot.
* The [[Virtual Sink]] and [[Virtual Source]] blocks provide connection points to allow a cleaner presentation of the flowgraph. They are functionally the same as drawing a line between the two points, and have no impact on the data flow.


[[File:SSB_rcv_fg.png|800px]]
=== Receiver section ===


=== Block descriptions ===
* The transmitter signal is fed to the receiver through the [[Virtual Source]] block.
 
* As in the transmitter section, the [[Swap IQ]] and [[Selector]] blocks choose which sideband to use, based on the [[QT GUI Chooser]] labeled "Receive Sideband".
* The Options block identifies the filename for the flowgraph, a title, author, etc.
* The paramters for the [[FFT Filter]] are set by the [[Band-pass Filter Taps]] block. Using Complex taps, the output will be only in the Upper sideband with a frequency range of 300Hz to 3500Hz.
** id: SSB_rcv
* The [[Complex To Real]] block produces the Real part of the data stream.
** Click on File -> Save As&nbsp;&nbsp;Use the file name 'SSB_rcv'. the extension '.grc' is added automatically
* To produce a volume control, the [[QT GUI Range]] block labeled "Volume" sets a variable named 'volume' which is used in the [[Multiply Const]] block. The name "Multiply Const" block seems a little confusing because the Constant can be a variable, but it is to distinguish it from a [[Multiply]] block which multiplies two (or more) input streams together.
* The signal from the transmitter section is received by the ZMQ PULL Source. It is a 24khz carrier with a sample rate of 768khz.
* The [[Audio Sink]] is the computer speaker or headphones. See "Caution" below!
** Address: tcp://127.0.0.1:50301
* A Variable block defines the sample rate.
** id: samp_rate
** value: 768000
* Another Variable block defines the decimation factor. Since the Audio Sink (speaker) uses a sample rate of 48khz, we will reduce (decimate) the incoming sample rate by a factor of 16.
** id: decim
** value: 16
* A QT GUI Range block defines the tuning for the input signal
** id: tuning
** label: Tuning
** default value: 25500
** start: 19000
** stop: 29000
** step: 100
* The Frequency Xlating FIR Filter performs three functions: frequency translation, filtering, and decimation. See [[Frequency_Xlating_FIR_Filter]] for more detail.
[[File:SSB_rcv_FIR_parms.png]]
 
* A QT GUI Range block defines the tuning of the local oscillators
** id: bfo
** label: Fine tuning
** default value: 1500
** start: 0
** stop: 3000
** step: 10
** Widget: choose whatever you like
* A QT GUI Chooser allows selection of the Upper or Lower sideband
* The value of the Sideband selector is used as a multiplier in the Multiply Const block.
** Constant: reverse
* A QT GUI Range block defines an Audio gain (volume) control
** id: volume
** default value: 0.2
** start: 0
** stop: 1.0
** step: 0.05
** Widget: choose whatever you like
* The value of the volume control is used as a multiplier in the Multiply Const block.
** Constant: volume
* The speaker output is defined by an Audio Sink block. The parameters are:
** Sample rate: set to 48khz (use the pull-down)
** Device name: for most speakers (or headphone jacks) built into the computer, the Device name can be left blank; for other cases, see [[Audio_Sink#Device_Name]]
 
=== Test receiver section ===
 
To test the receiver, generate and run the flowgraph. After a few seconds, a GUI window will open with the Tuning, Fine tuning, and Volume controls, along with the sideband select push buttons. To terminate the process cleanly, click on the 'X' in the upper corner of the GUI rather than using Control-C.
 
== SSB transmitter ==
 
=== Flowgraph ===
 
Using gnuradio-companion (GRC) and the following Block descriptions, build this flowgraph (a separate one from the receiver) for the transmitter section:<br>
 
[[File:SSB_xmt_1_fg.png|800px]]
 
=== Block descriptions ===
 
* The Options block identifies the filename for the flowgraph, a title, author, etc.
** id: SSB_xmt_1
** Click on File -> Save As&nbsp;&nbsp;Use the file name 'SSB_xmt_1'. the extension '.grc' is added automatically
* The microphone input is defined by an Audio Source block. The parameters are:
** Sample rate: set to 48khz (use the pull-down)
** Device name: for most microphone jacks built into the computer, the Device name can be left blank; for other cases, see [[Audio_Source#Device_Name]]
* For the remainder of the flowgraph, a sample_rate of 768khz is used. This value was chosen to give the 48khz audio frequency 16 samples per cycle (48000 x 16 = 768000).
** Variable block
*** id: samp_rate
*** value: 768000
* To boost the 48khz sample rate of the audio input to the 768khz sample rate, a Repeat block with an Interpolation value of 16 is used.
* A QT GUI Range block defines an Audio gain (volume) control
** id: volume
** default value: 0.5
** start: 0
** stop: 20.0
** step: 0.1
** Widget: choose whatever you like
* The value of the volume control is used as a multiplier in the Multiply Const block.
** Constant: volume
* The carrier signal (in this example is 24khz) is generated by the Signal Source block.<br>
** Sample Rate: samp_rate
** Frequency: carrier_freq
** Amplitude: 1.0
* To create a double sideband signal, the carrier signal is multiplied by the audio signal.
 
The Band Pass Filter creates the Single Sideband signal by passing the frequencies from 24300Hz to 27000Hz and rejecting the others (the filter method). This gives a signal with only one sideband (upper) and no carrier. The audio frequencies of that signal are 300Hz to 3000Hz.
 
* For a real radio transmitter, the output of the Band Pass Filter would be fed to Radio Frequency (RF) hardware. For this tutorial, we are sending the transmit signal to a ZMQ PUSH Sink data socket connected to the receiver section.
** Address: tcp://127.0.0.1:50301
 
=== Note for Raspberry Pi ===
 
Since a Raspberry Pi has no audio input jack, there are two alternatives:
 
# use a USB audio dongle.
# replace the Audio Source block with a Signal Source block (frequency: 600) and a Throttle block to simulate an audio input.


== Testing ==
== Testing ==


When using GRC, doing a Generate and/or Run creates a Python file with the same name as the .grc file. You can execute the Python file without running GRC again.
<b>CAUTION!</b> To avoid loud feedback, use headphones or a microphone/headset instead of the computer speaker.
 
For testing this system we will use two processes, so we will need two terminal windows.
 
Terminal 1:
* since you just finished building the transmit flowgraph, you can just do a Run. After a few seconds, a GUI window will open with the Volume control and the GUI Frequency Sink.
 
Terminal 2:
Open another terminal window.
* change to whatever directory you used to generate the flowgraph for SSB_rcv
* execute the following command:
    python3 -u SSB_rcv.py
* After a few seconds, a GUI window will open with the Tuning, Fine tuning, and Volume controls, along with the sideband select push buttons.


Speaking into the microphone should show a change in the pattern on the QT GUI Time Sink. The level of modulation can be adjusted with the transmit volume control. You should hear your voice from the speakers. The speaker volume can be adjusted with the receive volume control. Adjust the Fine tuning control until you voice sounds natural to you. Note that very small changes (tens of Hz) will make a difference in how it sounds. Then switch to the lower sideband and hear the results!
<p>To start the program, click the "Execute" icon or press F6. A screen will open showing the Mic gain, Volume, sideband selections, Time, Frequency, and Waterfall displays. Both transmit and receive will be in Upper Sideband mode.</p>


To terminate each of the processes cleanly, click on the 'X' in the upper corner of the GUI rather than using Control-C.
<p>Speaking into the microphone, you should hear yourself clearly. Selecting Lower Sideband for both transmit and receive should also work well. Note the change of the frequencies on both the Frequency and Waterfall plots.</p>


== What do to next ==
<p>Selecting Upper Sideband on transmit and Lower Sideband on receive (or vice versa) will produce almost no sound.</p>


Now that you have a working system, you can experiment:
<p>To terminate the test, click the 'X' in the upper right-hand corner of the "SSB_demo" screen.


* make a receiver using the filter method
[[Category:Tutorials]]
* make a transmitter using the Weaver method
[[Category:Tested With 3.10]]
* make either using the phasing method. hint: use a Hilbert filter for the 90 degree phase shift

Latest revision as of 21:15, 19 February 2025

This tutorial explains how a Single Sideband (SSB) signal can be generated and received. The transmitter and receiver use the filter method.

Tested with v3.10.9.2

Prerequisites

Flowgraph

The following flowgraph can be downloaded by clicking Media:SSB_demo.grc. Using a terminal screen, start `gnuradio-companion` and open the downloaded file.

SSB demo fg.png

Transmitter section

  • The transmitter section is across the upper row of blocks starting with the Audio Source (your microphone).
  • The Band Pass Filter has a low frequency cutoff of 300Hz and a high frequency cutoff of 3500Hz to pass normal voice frequencies. The Gain parameter is set by the QT GUI Range block labeled "Mic gain".
  • The Swap IQ block interchanges the Real and Imaginary components which effectively changes upper and lower sidebands.
  • The Selector block chooses which input to use, based on the QT GUI Chooser labeled "Transmit Sideband".
  • The QT GUI Time Sink shows a 'scope trace' of the audio signal.
  • The QT GUI Frequency Sink shows the frequency plot of the audio.
  • The QT GUI Waterfall Sink shows the signals on a waterfall (spectrogram) plot. The bandwidth of the audio can be seen clearly on the plot.
  • The Virtual Sink and Virtual Source blocks provide connection points to allow a cleaner presentation of the flowgraph. They are functionally the same as drawing a line between the two points, and have no impact on the data flow.

Receiver section

  • The transmitter signal is fed to the receiver through the Virtual Source block.
  • As in the transmitter section, the Swap IQ and Selector blocks choose which sideband to use, based on the QT GUI Chooser labeled "Receive Sideband".
  • The paramters for the FFT Filter are set by the Band-pass Filter Taps block. Using Complex taps, the output will be only in the Upper sideband with a frequency range of 300Hz to 3500Hz.
  • The Complex To Real block produces the Real part of the data stream.
  • To produce a volume control, the QT GUI Range block labeled "Volume" sets a variable named 'volume' which is used in the Multiply Const block. The name "Multiply Const" block seems a little confusing because the Constant can be a variable, but it is to distinguish it from a Multiply block which multiplies two (or more) input streams together.
  • The Audio Sink is the computer speaker or headphones. See "Caution" below!

Testing

CAUTION! To avoid loud feedback, use headphones or a microphone/headset instead of the computer speaker.

To start the program, click the "Execute" icon or press F6. A screen will open showing the Mic gain, Volume, sideband selections, Time, Frequency, and Waterfall displays. Both transmit and receive will be in Upper Sideband mode.

Speaking into the microphone, you should hear yourself clearly. Selecting Lower Sideband for both transmit and receive should also work well. Note the change of the frequencies on both the Frequency and Waterfall plots.

Selecting Upper Sideband on transmit and Lower Sideband on receive (or vice versa) will produce almost no sound.

To terminate the test, click the 'X' in the upper right-hand corner of the "SSB_demo" screen.