summaryrefslogtreecommitdiff
path: root/docs/exploring-gnuradio/exploring_gnuradio.dox
diff options
context:
space:
mode:
Diffstat (limited to 'docs/exploring-gnuradio/exploring_gnuradio.dox')
-rw-r--r--docs/exploring-gnuradio/exploring_gnuradio.dox135
1 files changed, 135 insertions, 0 deletions
diff --git a/docs/exploring-gnuradio/exploring_gnuradio.dox b/docs/exploring-gnuradio/exploring_gnuradio.dox
new file mode 100644
index 0000000000..a3224838d1
--- /dev/null
+++ b/docs/exploring-gnuradio/exploring_gnuradio.dox
@@ -0,0 +1,135 @@
+/*! \page page_exploring_gnuradio Exploring GNU Radio
+
+In this page, we will go over two examples that are shipped with GNU
+Radio. We start off with a very simple dial tone generating example
+that is done in Python. The second example uses both GNU Radio
+Companion (GRC) and Python for different stages of the example.
+
+In either case, we will be actually working with Python code and the
+modules as they exist in Python. However, in the following discussion,
+we will refer to each block using the full C++ namespace so that we
+can easily link to the block's documentation inside the manual.
+
+The example files discussed in this page are installed with the
+documentation and are located in $prefix/share/doc/gnuradio-$version/.
+
+\section ex_dial_tone Dial Tone Example
+
+This example is found in the dial_tone.py file and constructs a very
+simple GNU Radio application that combines two sine waves to create a
+dial tone. It calls a function to construct the flowgraph which
+handles generating the signal sources.
+
+The build_graph function sets up the sampling rate, which we will use
+to set the rate of the audio sink as well as the amplitude, which we
+use to scale the signal to control the volume of the output. We then
+create a top_block. The top_block is the object that holds the
+flowgraph, the basic data structure of a GNU Radio application. We
+will use the top_block to connect together and hold the signal
+processing blocks, which we build next.
+
+This example uses three signal processing blocks. The first two are
+gr::analog::sig_source_f blocks, which generate sine waves at
+frequencies 350 and 440 Hz. We next create the connection to the
+speaker system using gr::audio::sink, which takes in the sample rate
+it will use to produce the output signal. The audio sink block can
+also take in a second parameter to set the output device name, which
+we use if there is a resource conflict or if using a sampling rate
+that the hardware won't naturally support. Common device names are
+"pulse" if using PulseAudio or "plughw:0,0", which is an ALSA device
+that can handle resampling.
+
+We next take the three blocks we've built and connect together the
+flowgraph. The flowgraph connects sources to sinks through other
+signal processing blocks. Here, we are directly connecting two sources
+to a single sink. The next example uses more complex flowgraphs to
+farther explore these concepts. The two lines containing the
+"tb.connect" statements are where the connections are made. The
+flowgraph will look like:
+
+\verbatim
+sig_source_f (freq = 350) -->
+ audio.sink
+sig_source_f (freq = 440) -->
+\endverbatim
+
+We're inputting two signals into a single block, which with the audio
+sink allows us to output in stereo. The two signals combine to form
+the dual frequencies of a standard dial tone.
+
+In the connection of the signal source to the audio sink, notice how
+we specify the sink as a Python tuple, (dst, X). Technically, we
+specify all connections as ((source block, port out), (sink block,
+port in)) because each block that outputs samples can have multiple
+output ports just as a block that receives samples can have multiple
+input ports. However, in the case of a gr::analog::sig_source_f, it
+only produces samples on a single output and so the output port of 0
+is implied. Otherwise, we could write this as "tb.connect((src0, 0),
+(dst,0))" for complete representation of the connection.
+
+When we are done connecting the blocks, we have a flowgraph in the
+object "tb". While it's connected, the sources are not generating any
+samples. We have to start the flowgraph running. In the main section,
+we return the top_block object and then call the "start" function on
+it. This is a non-blocking call that launches the flowgraph's main
+thread, which initiates the sources to start sending samples through
+the flowgraph. We then block until the user presses "Enter" at which
+point we call the flowgraph's "stop" function to shut it down.
+
+
+\section ex_fm_demod FM Demodulator
+
+This example can be done completely in GRC or both GRC and Python. We
+will generate an FM signal using GRC first and then using either a GRC
+program or an example in Python to demodulate and play it back.
+
+\subsection Modulator
+
+We first launch GRC using the terminal command
+"gnuradio-companion". This starts the graphical interface to create
+our flowgraphs. We won't explore the GRC interface here; just use it
+to generate a data file. With GRC launched, open the file
+"fm_tx.grc". Exploring this flowgraph, it generates the dial tone
+frequencies, adds them together, resamples the signal so we can use
+integer upsampling in the wideband FM transmitter block (WBFM
+Transmit) and output the data. While this is happening, we're also
+outputting the original signal to the audio system as well as viewing
+it in time and frequency at different stages.
+
+The intent of this example is to generate a frequency-modulated dial
+tone signal and save itto a file. While saving it to a file, we only
+want to generate a signal large enough to make use of but it doesn't
+have to be too large. So we put a gr::blocks::head block that limits
+the number of samples into the file sink. Once this block has seen N
+number of samples, it will stop the flowgraph. Meanwhile, we use a
+gr::blocks::skiphead block to ignore the first M samples, which helps
+us avoid the transients and group delay of the filters in the system.
+
+We run this either using the menu "Build->Execute" or using the gears
+button on the toolbar. It will run for a short amount of time and stop
+once the head has seen the items set in the "nitems" parameter. The
+result is a file "dummy.dat" that contains the complex FM samples.
+
+\subsection Demodulator
+
+The demodulator part is shown in both a GRC graph and as a Python
+script. Both the GRC graph, "fm_rx.grc", and the Python script,
+"fm_demod.py", do the same thing and basically reverse the stages of
+the modulator. It uses a gr::blocks::file_source to read the
+"dummy.dat" file we created previously. This is sent to the FM
+demodulator, which is simply implemented here using the
+gr::analog::quadrature_demod_cf. This demodulates the signal and
+converts the complex FM signal to a float signal.
+
+We then resample it from the input signal at 200 ksps to the audio
+rate of 44.1 ksps. Because this resampling cannot be done using an
+integer decimation rate, we use an arbitrary resampler, the
+gr::filter::pfb_arb_resampler_fff block, that allows us to resample at
+any rate as well as filter the signal to the audio rate we want. The
+output of this block is filtered to a 15 kHz bandwidth at a sample
+rate of 44.1 ksps, which is ready for the gr::audio::sink block.
+
+Both the GRC and Python files can be explored farther to better
+understand the operations of the blocks.
+
+*/ \ No newline at end of file