From 7930b1ebbb7328b69d78ac4dc3ea919e0d00c2ae Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Tue, 16 Nov 2010 22:34:38 -0800 Subject: Adding a simple example of using the tagger and tagging file. --- gnuradio-examples/python/tags/test_file_tags.py | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100755 gnuradio-examples/python/tags/test_file_tags.py (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/tags/test_file_tags.py b/gnuradio-examples/python/tags/test_file_tags.py new file mode 100755 index 000000000..a658256c7 --- /dev/null +++ b/gnuradio-examples/python/tags/test_file_tags.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +from gnuradio import gr +import scipy + +def main(): + data = scipy.arange(0, 32000, 1).tolist() + trig = 100*[0,] + 100*[1,] + + src = gr.vector_source_s(data, True) + trigger = gr.vector_source_s(trig, True) + + thr = gr.throttle(gr.sizeof_short, 10e3) + ann = gr.annotator_alltoall(1000000, gr.sizeof_short) + tagger = gr.burst_tagger(gr.sizeof_short) + + fsnk = gr.tagged_file_sink(gr.sizeof_short) + + tb = gr.top_block() + tb.connect(src, thr, (tagger, 0)) + tb.connect(trigger, (tagger, 1)) + tb.connect(tagger, fsnk) + + tb.run() + +if __name__ == "__main__": + main() + + -- cgit From 911533c659389d565a9c230c8318a5f57070b656 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Wed, 17 Nov 2010 12:04:14 -0800 Subject: Adding an example that uses gr_uhd sources to generate tags and collects bursts of energy. --- .../python/tags/uhd_burst_detector.py | 82 ++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100755 gnuradio-examples/python/tags/uhd_burst_detector.py (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/tags/uhd_burst_detector.py b/gnuradio-examples/python/tags/uhd_burst_detector.py new file mode 100755 index 000000000..2d4ca9b9a --- /dev/null +++ b/gnuradio-examples/python/tags/uhd_burst_detector.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +from gnuradio import eng_notation +from gnuradio import gr +from gnuradio import uhd +from gnuradio import window +from gnuradio.eng_option import eng_option +from gnuradio.gr import firdes +from optparse import OptionParser + +class uhd_burst_detector(gr.top_block): + def __init__(self, frequency, sample_rate, + uhd_address="192.168.10.2"): + + gr.top_block.__init__(self) + + self.freq = frequency + self.samp_rate = sample_rate + self.uhd_addr = uhd_address + + self.uhd_src = uhd.single_usrp_source( + device_addr="addr="+self.uhd_addr, + io_type=uhd.io_type_t.COMPLEX_FLOAT32, + num_channels=1, + ) + + self.uhd_src.set_samp_rate(samp_rate) + self.uhd_src.set_center_freq(freq, 0) + self.uhd_src.set_gain(32, 0) + + taps = firdes.low_pass_2(1, 1, 0.4, 0.1, 60) + self.chanfilt = gr.fir_filter_ccc(10, taps) + self.ann0 = gr.annotator_alltoall(100000, gr.sizeof_gr_complex) + self.tagger = gr.burst_tagger(gr.sizeof_gr_complex) + + # Dummy signaler to collect a burst on known periods + data = 10000*[0,] + 500*[1,] + self.signal = gr.vector_source_s(data, True) + + # Energy detector to get signal burst + self.c2m = gr.complex_to_mag_squared() + self.iir = gr.single_pole_iir_filter_ff(0.0001) + self.sub = gr.sub_ff() + self.mult = gr.multiply_const_ff(32768) + self.f2s = gr.float_to_short() + self.fsnk = gr.tagged_file_sink(gr.sizeof_gr_complex) + + + ################################################## + # Connections + ################################################## + self.connect((self.uhd_src_0, 0), (self.tagger, 0)) + self.connect((self.tagger, 0), (self.fsnk, 0)) + + # Connect a dummy signaler to the burst tagger + #self.connect((self.signal, 0), (self.tagger, 1)) + + # Connect an energy detector signaler to the burst tagger + self.connect((self.uhd_src_0, 0), (self.c2m, 0)) + self.connect((self.c2m, 0), (self.sub, 0)) + self.connect((self.c2m, 0), (self.iir, 0)) + self.connect((self.iir, 0), (self.sub, 1)) + self.connect((self.sub, 0), (self.mult,0)) + self.connect((self.mult, 0), (self.f2s, 0)) + self.connect((self.f2s, 0), (self.tagger, 1)) + + def set_samp_rate(self, samp_rate): + self.samp_rate = samp_rate + self.wxgui_fftsink2_0.set_sample_rate(self.samp_rate/10) + self.uhd_src_0.set_samp_rate(self.samp_rate) + +if __name__ == '__main__': + a = 1 + parser = OptionParser(option_class=eng_option, usage="%prog: [options]") + (options, args) = parser.parse_args() + + frequency = 418e6 + samp_rate = samp_rate = 200000 + uhd_addr = "192.168.10.2" + + tb = uhd_burst_detector(frequency, samp_rate, uhd_addr) + tb.run() -- cgit From 01a054be12bdef4d8c17d6134275ede9d9997c3d Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Wed, 17 Nov 2010 16:48:06 -0800 Subject: Removing vestigial line. --- gnuradio-examples/python/tags/uhd_burst_detector.py | 1 - 1 file changed, 1 deletion(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/tags/uhd_burst_detector.py b/gnuradio-examples/python/tags/uhd_burst_detector.py index 2d4ca9b9a..432698225 100755 --- a/gnuradio-examples/python/tags/uhd_burst_detector.py +++ b/gnuradio-examples/python/tags/uhd_burst_detector.py @@ -70,7 +70,6 @@ class uhd_burst_detector(gr.top_block): self.uhd_src_0.set_samp_rate(self.samp_rate) if __name__ == '__main__': - a = 1 parser = OptionParser(option_class=eng_option, usage="%prog: [options]") (options, args) = parser.parse_args() -- cgit From 49fa0877d64d06eb5dfd2b530d3efc9ea9529851 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Wed, 17 Nov 2010 19:43:02 -0800 Subject: Fixing uhd test app. --- gnuradio-examples/python/tags/uhd_burst_detector.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/tags/uhd_burst_detector.py b/gnuradio-examples/python/tags/uhd_burst_detector.py index 432698225..fb140704e 100755 --- a/gnuradio-examples/python/tags/uhd_burst_detector.py +++ b/gnuradio-examples/python/tags/uhd_burst_detector.py @@ -17,6 +17,7 @@ class uhd_burst_detector(gr.top_block): self.freq = frequency self.samp_rate = sample_rate self.uhd_addr = uhd_address + self.gain = 32 self.uhd_src = uhd.single_usrp_source( device_addr="addr="+self.uhd_addr, @@ -24,10 +25,10 @@ class uhd_burst_detector(gr.top_block): num_channels=1, ) - self.uhd_src.set_samp_rate(samp_rate) - self.uhd_src.set_center_freq(freq, 0) - self.uhd_src.set_gain(32, 0) - + self.uhd_src.set_samp_rate(self.samp_rate) + self.uhd_src.set_center_freq(self.freq, 0) + self.uhd_src.set_gain(self.gain, 0) + taps = firdes.low_pass_2(1, 1, 0.4, 0.1, 60) self.chanfilt = gr.fir_filter_ccc(10, taps) self.ann0 = gr.annotator_alltoall(100000, gr.sizeof_gr_complex) @@ -49,14 +50,14 @@ class uhd_burst_detector(gr.top_block): ################################################## # Connections ################################################## - self.connect((self.uhd_src_0, 0), (self.tagger, 0)) + self.connect((self.uhd_src, 0), (self.tagger, 0)) self.connect((self.tagger, 0), (self.fsnk, 0)) # Connect a dummy signaler to the burst tagger #self.connect((self.signal, 0), (self.tagger, 1)) # Connect an energy detector signaler to the burst tagger - self.connect((self.uhd_src_0, 0), (self.c2m, 0)) + self.connect((self.uhd_src, 0), (self.c2m, 0)) self.connect((self.c2m, 0), (self.sub, 0)) self.connect((self.c2m, 0), (self.iir, 0)) self.connect((self.iir, 0), (self.sub, 1)) -- cgit From 716e497547b5e0f3e19481e4ca129bae114935f8 Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Sun, 21 Nov 2010 19:43:13 -0500 Subject: Updating example to pass file tagger the sample rate and changed some values for my testing. --- .../python/tags/uhd_burst_detector.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/tags/uhd_burst_detector.py b/gnuradio-examples/python/tags/uhd_burst_detector.py index fb140704e..17e71cb29 100755 --- a/gnuradio-examples/python/tags/uhd_burst_detector.py +++ b/gnuradio-examples/python/tags/uhd_burst_detector.py @@ -35,7 +35,7 @@ class uhd_burst_detector(gr.top_block): self.tagger = gr.burst_tagger(gr.sizeof_gr_complex) # Dummy signaler to collect a burst on known periods - data = 10000*[0,] + 500*[1,] + data = 1000*[0,] + 1000*[1,] self.signal = gr.vector_source_s(data, True) # Energy detector to get signal burst @@ -44,7 +44,7 @@ class uhd_burst_detector(gr.top_block): self.sub = gr.sub_ff() self.mult = gr.multiply_const_ff(32768) self.f2s = gr.float_to_short() - self.fsnk = gr.tagged_file_sink(gr.sizeof_gr_complex) + self.fsnk = gr.tagged_file_sink(gr.sizeof_gr_complex, self.samp_rate) ################################################## @@ -54,16 +54,16 @@ class uhd_burst_detector(gr.top_block): self.connect((self.tagger, 0), (self.fsnk, 0)) # Connect a dummy signaler to the burst tagger - #self.connect((self.signal, 0), (self.tagger, 1)) + self.connect((self.signal, 0), (self.tagger, 1)) # Connect an energy detector signaler to the burst tagger - self.connect((self.uhd_src, 0), (self.c2m, 0)) - self.connect((self.c2m, 0), (self.sub, 0)) - self.connect((self.c2m, 0), (self.iir, 0)) - self.connect((self.iir, 0), (self.sub, 1)) - self.connect((self.sub, 0), (self.mult,0)) - self.connect((self.mult, 0), (self.f2s, 0)) - self.connect((self.f2s, 0), (self.tagger, 1)) + #self.connect((self.uhd_src, 0), (self.c2m, 0)) + #self.connect((self.c2m, 0), (self.sub, 0)) + #self.connect((self.c2m, 0), (self.iir, 0)) + #self.connect((self.iir, 0), (self.sub, 1)) + #self.connect((self.sub, 0), (self.mult,0)) + #self.connect((self.mult, 0), (self.f2s, 0)) + #self.connect((self.f2s, 0), (self.tagger, 1)) def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate @@ -74,7 +74,7 @@ if __name__ == '__main__': parser = OptionParser(option_class=eng_option, usage="%prog: [options]") (options, args) = parser.parse_args() - frequency = 418e6 + frequency = 450e6 samp_rate = samp_rate = 200000 uhd_addr = "192.168.10.2" -- cgit From 7ecc767e8fe6248d5e9372da8c7cfb9aacbd790b Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Sun, 21 Nov 2010 19:44:47 -0500 Subject: Updating test_file_tags.py to use new file tagger interface (sample rate of 1 means time stamp on files is based solely on the item time). --- gnuradio-examples/python/tags/test_file_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/tags/test_file_tags.py b/gnuradio-examples/python/tags/test_file_tags.py index a658256c7..4ff4549ef 100755 --- a/gnuradio-examples/python/tags/test_file_tags.py +++ b/gnuradio-examples/python/tags/test_file_tags.py @@ -14,7 +14,7 @@ def main(): ann = gr.annotator_alltoall(1000000, gr.sizeof_short) tagger = gr.burst_tagger(gr.sizeof_short) - fsnk = gr.tagged_file_sink(gr.sizeof_short) + fsnk = gr.tagged_file_sink(gr.sizeof_short, 1) tb = gr.top_block() tb.connect(src, thr, (tagger, 0)) -- cgit From 7c5dc0920240f566ad4482f47ca8b9095479f04e Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Sun, 21 Nov 2010 21:23:31 -0500 Subject: Removed comments to stdout from file tagger; made it easir to go from internally generated bursts to detected bursts (which needs work). --- .../python/tags/uhd_burst_detector.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/tags/uhd_burst_detector.py b/gnuradio-examples/python/tags/uhd_burst_detector.py index 17e71cb29..993c6807d 100755 --- a/gnuradio-examples/python/tags/uhd_burst_detector.py +++ b/gnuradio-examples/python/tags/uhd_burst_detector.py @@ -53,17 +53,19 @@ class uhd_burst_detector(gr.top_block): self.connect((self.uhd_src, 0), (self.tagger, 0)) self.connect((self.tagger, 0), (self.fsnk, 0)) - # Connect a dummy signaler to the burst tagger - self.connect((self.signal, 0), (self.tagger, 1)) + if 0: + # Connect a dummy signaler to the burst tagger + self.connect((self.signal, 0), (self.tagger, 1)) - # Connect an energy detector signaler to the burst tagger - #self.connect((self.uhd_src, 0), (self.c2m, 0)) - #self.connect((self.c2m, 0), (self.sub, 0)) - #self.connect((self.c2m, 0), (self.iir, 0)) - #self.connect((self.iir, 0), (self.sub, 1)) - #self.connect((self.sub, 0), (self.mult,0)) - #self.connect((self.mult, 0), (self.f2s, 0)) - #self.connect((self.f2s, 0), (self.tagger, 1)) + else: + # Connect an energy detector signaler to the burst tagger + self.connect((self.uhd_src, 0), (self.c2m, 0)) + self.connect((self.c2m, 0), (self.sub, 0)) + self.connect((self.c2m, 0), (self.iir, 0)) + self.connect((self.iir, 0), (self.sub, 1)) + self.connect((self.sub, 0), (self.mult,0)) + self.connect((self.mult, 0), (self.f2s, 0)) + self.connect((self.f2s, 0), (self.tagger, 1)) def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate -- cgit From d692a41f98e7b888c745efbb9fcbbb0400f39025 Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Wed, 24 Nov 2010 17:29:11 -0800 Subject: Major Makefile.am housecleaning. Passes distcheck. Move all occurrences of swig_built_sources out of Makefile.am's. Move all SWIG related use of BUILT_SOURCES out of Makefile.am's. Clean up 'if PYTHON' conditionalization in gr-* Still left to do: fix Makefile.swig CLEANFILES and no_dist_files such that they remove exactly the generated files. --- gnuradio-examples/python/apps/Makefile.am | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/apps/Makefile.am b/gnuradio-examples/python/apps/Makefile.am index 620b9fd29..50fe75151 100644 --- a/gnuradio-examples/python/apps/Makefile.am +++ b/gnuradio-examples/python/apps/Makefile.am @@ -19,6 +19,8 @@ # Boston, MA 02110-1301, USA. # +include $(top_srcdir)/Makefile.common + SUBDIRS = hf_explorer hf_radio -EXTRA_DIST = README +EXTRA_DIST += README -- cgit From 4d3bbb036cc4b910e5165c8a5dc7261ef4ebc43b Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Mon, 29 Nov 2010 12:57:07 -0500 Subject: Fixing up the UHD sample tag example to take command line options. --- .../python/tags/uhd_burst_detector.py | 28 ++++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/tags/uhd_burst_detector.py b/gnuradio-examples/python/tags/uhd_burst_detector.py index 993c6807d..f8ebbe66a 100755 --- a/gnuradio-examples/python/tags/uhd_burst_detector.py +++ b/gnuradio-examples/python/tags/uhd_burst_detector.py @@ -10,7 +10,7 @@ from optparse import OptionParser class uhd_burst_detector(gr.top_block): def __init__(self, frequency, sample_rate, - uhd_address="192.168.10.2"): + uhd_address="192.168.10.2", trigger=False): gr.top_block.__init__(self) @@ -18,9 +18,10 @@ class uhd_burst_detector(gr.top_block): self.samp_rate = sample_rate self.uhd_addr = uhd_address self.gain = 32 + self.trigger = trigger self.uhd_src = uhd.single_usrp_source( - device_addr="addr="+self.uhd_addr, + device_addr=self.uhd_addr, io_type=uhd.io_type_t.COMPLEX_FLOAT32, num_channels=1, ) @@ -53,7 +54,7 @@ class uhd_burst_detector(gr.top_block): self.connect((self.uhd_src, 0), (self.tagger, 0)) self.connect((self.tagger, 0), (self.fsnk, 0)) - if 0: + if self.trigger: # Connect a dummy signaler to the burst tagger self.connect((self.signal, 0), (self.tagger, 1)) @@ -74,11 +75,24 @@ class uhd_burst_detector(gr.top_block): if __name__ == '__main__': parser = OptionParser(option_class=eng_option, usage="%prog: [options]") + parser.add_option("-a", "--address", type="string", default="addr=192.168.10.2", + help="select address of the device [default=%default]") + #parser.add_option("-A", "--antenna", default=None, + # help="select Rx Antenna (only on RFX-series boards)") + parser.add_option("-f", "--freq", type="eng_float", default=450e6, + help="set frequency to FREQ", metavar="FREQ") + parser.add_option("-g", "--gain", type="eng_float", default=0, + help="set gain in dB [default=%default]") + parser.add_option("-R", "--rate", type="eng_float", default=200000, + help="set USRP sample rate [default=%default]") + parser.add_option("-T", "--trigger", action="store_true", default=False, + help="Use internal trigger instead of detector [default=%default]") (options, args) = parser.parse_args() - frequency = 450e6 - samp_rate = samp_rate = 200000 - uhd_addr = "192.168.10.2" + frequency = options.freq + samp_rate = samp_rate = options.rate + uhd_addr = options.address + trigger = options.trigger - tb = uhd_burst_detector(frequency, samp_rate, uhd_addr) + tb = uhd_burst_detector(frequency, samp_rate, uhd_addr, trigger) tb.run() -- cgit From 3751671d1b596113e441ca326280bdcc94fdcc6f Mon Sep 17 00:00:00 2001 From: Tom Rondeau Date: Tue, 28 Dec 2010 12:48:18 -0500 Subject: PFB channelizer can be specified without external taps. Uses optfir to generate an internal filter to cover the channel bandwidth; user can specify the attenuation of this filter if desired. --- gnuradio-examples/python/pfb/channelize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/python/pfb/channelize.py b/gnuradio-examples/python/pfb/channelize.py index 27d87e558..f845c05c6 100755 --- a/gnuradio-examples/python/pfb/channelize.py +++ b/gnuradio-examples/python/pfb/channelize.py @@ -36,7 +36,7 @@ class pfb_top_block(gr.top_block): # Create a set of taps for the PFB channelizer self._taps = gr.firdes.low_pass_2(1, self._fs, 475.50, 50, - attenuation_dB=10, window=gr.firdes.WIN_BLACKMAN_hARRIS) + attenuation_dB=100, window=gr.firdes.WIN_BLACKMAN_hARRIS) # Calculate the number of taps per channel for our own information tpc = scipy.ceil(float(len(self._taps)) / float(self._M)) -- cgit From 9739742f0b90968a8aaf0f5c2e24f9bbadda5e80 Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Thu, 30 Dec 2010 14:10:00 -0800 Subject: Move example waveforms to gnuradio-examples/waveforms. --- gnuradio-examples/Makefile.am | 3 +++ gnuradio-examples/waveforms/.gitignore | 6 +++++ gnuradio-examples/waveforms/Makefile.am | 26 ++++++++++++++++++++ gnuradio-examples/waveforms/README | 23 ++++++++++++++++++ gnuradio-examples/waveforms/dial-tone.wfd | 40 +++++++++++++++++++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 gnuradio-examples/waveforms/.gitignore create mode 100644 gnuradio-examples/waveforms/Makefile.am create mode 100644 gnuradio-examples/waveforms/README create mode 100644 gnuradio-examples/waveforms/dial-tone.wfd (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/Makefile.am b/gnuradio-examples/Makefile.am index 9ea890c12..e0c1b1d15 100644 --- a/gnuradio-examples/Makefile.am +++ b/gnuradio-examples/Makefile.am @@ -25,3 +25,6 @@ SUBDIRS = c++ if PYTHON SUBDIRS += python grc endif +if GUILE +SUBDIRS += waveforms +endif diff --git a/gnuradio-examples/waveforms/.gitignore b/gnuradio-examples/waveforms/.gitignore new file mode 100644 index 000000000..16c984055 --- /dev/null +++ b/gnuradio-examples/waveforms/.gitignore @@ -0,0 +1,6 @@ +/Makefile +/Makefile.in +/.deps +/.libs +/*.la +/*.lo diff --git a/gnuradio-examples/waveforms/Makefile.am b/gnuradio-examples/waveforms/Makefile.am new file mode 100644 index 000000000..c07020a5c --- /dev/null +++ b/gnuradio-examples/waveforms/Makefile.am @@ -0,0 +1,26 @@ +# +# Copyright 2010 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +include $(top_srcdir)/Makefile.common + +ourdatadir = $(exampledir)/waveforms + +dist_ourdata_DATA = \ + README \ + dial-tone.wfd diff --git a/gnuradio-examples/waveforms/README b/gnuradio-examples/waveforms/README new file mode 100644 index 000000000..1f109ef53 --- /dev/null +++ b/gnuradio-examples/waveforms/README @@ -0,0 +1,23 @@ +# +# Copyright 2010 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# GNU Radio is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# GNU Radio is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +FIXME explain this stuff :-) + +This directory contains example "Waveform Description Files" that are +designed to be loaded and run using the gr-run-waveform command. diff --git a/gnuradio-examples/waveforms/dial-tone.wfd b/gnuradio-examples/waveforms/dial-tone.wfd new file mode 100644 index 000000000..ced3df572 --- /dev/null +++ b/gnuradio-examples/waveforms/dial-tone.wfd @@ -0,0 +1,40 @@ +;;; Emacs, format this using -*-scheme-*- mode. +;;; +;;; Copyright 2010 Free Software Foundation, Inc. +;;; +;;; This file is part of GNU Radio +;;; +;;; GNU Radio is free software; you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3, or (at your option) +;;; any later version. +;;; +;;; GNU Radio is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see . +;;; + +;;; This example waveform outputs a signal to an audio_alsa_sink +;;; that sounds like North American dial tone. + +(use-modules (gnuradio audio_alsa)) + + +(define-waveform (dial-tone cmd-line-args) + (vars + (sample-rate 48000) + (ampl 0.1)) + + (blocks + (src0 (gr:sig-source-f sample-rate (gr:GR-SIN-WAVE) 350 ampl)) + (src1 (gr:sig-source-f sample-rate (gr:GR-SIN-WAVE) 440 ampl)) + (sink (gr:audio-alsa-sink sample-rate "plughw:0,0")) + ) + + (connections + (src0 (list sink 0)) ; src0 to left input + (src1 (list sink 1)))) ; src1 to right input -- cgit From dad65db9c2046a113e704394beac01852ac2b35c Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Wed, 5 Jan 2011 19:56:00 -0800 Subject: Have swig/guile wrap enums and constants as scheme variables, not functions. --- gnuradio-examples/waveforms/dial-tone.wfd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/waveforms/dial-tone.wfd b/gnuradio-examples/waveforms/dial-tone.wfd index ced3df572..5ab60075a 100644 --- a/gnuradio-examples/waveforms/dial-tone.wfd +++ b/gnuradio-examples/waveforms/dial-tone.wfd @@ -30,8 +30,8 @@ (ampl 0.1)) (blocks - (src0 (gr:sig-source-f sample-rate (gr:GR-SIN-WAVE) 350 ampl)) - (src1 (gr:sig-source-f sample-rate (gr:GR-SIN-WAVE) 440 ampl)) + (src0 (gr:sig-source-f sample-rate gr:GR-SIN-WAVE 350 ampl)) + (src1 (gr:sig-source-f sample-rate gr:GR-SIN-WAVE 440 ampl)) (sink (gr:audio-alsa-sink sample-rate "plughw:0,0")) ) -- cgit From fa0ee85a13c067fa05a6ecb4c0bd3327a3a5fcf5 Mon Sep 17 00:00:00 2001 From: Eric Blossom Date: Wed, 5 Jan 2011 21:57:34 -0800 Subject: Add documentation for gr-run-waveform and define-waveform --- gnuradio-examples/waveforms/README | 249 ++++++++++++++++++++++++++++++++++++- 1 file changed, 248 insertions(+), 1 deletion(-) (limited to 'gnuradio-examples') diff --git a/gnuradio-examples/waveforms/README b/gnuradio-examples/waveforms/README index 1f109ef53..afaf1db73 100644 --- a/gnuradio-examples/waveforms/README +++ b/gnuradio-examples/waveforms/README @@ -17,7 +17,254 @@ # along with this program. If not, see . # -FIXME explain this stuff :-) +Introduction +------------ This directory contains example "Waveform Description Files" that are designed to be loaded and run using the gr-run-waveform command. + +"Waveform Description Files" are written in an extended dialect of the +Scheme language. The dialect is "The Revised^5 Report on the +Algorithmic Language Scheme" (R5RS)[1] as implemented and extended by +Guile 1.8 [2], extended with the GNU Radio specific "define-waveform" +macro and "gr-run-waveform" command. + +For those of you who may be unfamiliar with the Scheme language, +it's a very simple high-level language defined by a brief 50 page +specification[1]. Those 50 pages define the language, standard +libraries and the formal semantics! + +For a quick tutorial introduction see the first 30 pages of "How to +Teach Yourself Scheme in Fixnum Days"[3] (This covers a different +Scheme dialect, but the first 30 pages or so are valid for Guile too.) + +Another text worth mentioning is "How To Design Programs"[4], a book +on the systematic design of computer programs which utilizes Scheme. + + +A Quick Walk-Through +-------------------- + +We'll use dial-tone.wfd as our example. + +Assuming that you've already built and installed GNU Radio, you can +run dial-tone.wfd using: + + $ gr-run-waveform /share/gnuradio/examples/waveforms/dial-tone.wfd + +where is the location where GNU Radio is installed, typically /usr/local. + + +Here is dial-tone.wfd in its entirety: + +;; Start of dial-tone.wfd + +(use-modules (gnuradio audio_alsa)) + +(define-waveform (dial-tone cmd-line-args) + (vars + (sample-rate 48000) + (ampl 0.1)) + + (blocks + (src0 (gr:sig-source-f sample-rate gr:GR-SIN-WAVE 350 ampl)) + (src1 (gr:sig-source-f sample-rate gr:GR-SIN-WAVE 440 ampl)) + (sink (gr:audio-alsa-sink sample-rate "plughw:0,0"))) + + (connections + (src0 (list sink 0)) ; src0 to left input + (src1 (list sink 1)))) ; src1 to right input + +;; End of dial-tone.wfd + + +By default, waveforms have all of gnuradio-core available for their +use. This line: + + (use-modules (gnuradio audio_alsa)) + +imports the audio_alsa module, which we need for the audio sink. +Unlike python, there's no gr. notation. All names exported by +the (gnuradio audio_alsa) module are made available in the current +module. + + +"define-waveform" is where the real work gets done. +It has this general structure: + +(define-waveform ( cmd-line-args) + (vars + ( ) + ...) + + (blocks + ( ) + ...) + + (connections + ( ...) + ...)) + + + is an identifier that names the waveform. + +Identifiers are similar to identifiers in other programming languages. +They are a sequence of letters, digits and "extended alphabetic +characters" that begins with a character that cannot begin a number. +"extended alphabetic characters" include: + + ! $ % & * + - . / : < = > ? @ ^ _ - + +By convention in Scheme and LISP, '-' is used in preference to '_' in identifiers. + + and name variables that store +associated values, which may be any Scheme value. ( +should contain only instances of GNU Radio blocks.) + + + and may be any valid Scheme expression. +E.g., constants, nested function calls, bindings using "let", or +lambda expressions. + + +The (connections ...) section contains 0 or more lists of endpoints, +specifying which endpoints are to be connected together. In the +general case, endpoints have both a block and a port number, though +the port number defaults to zero if not specified. + +To specify a port number, create a two element list of the block and +port number as illustrated above. + +Like the python implementation, more than a pair of endpoints can be +strung together. Assuming blk0, blk1 and blk2 are block variables, +this would connect blk0, output 0, to blk1, input 0; blk1, output 0 to +blk2, input 0: + + (connect + (blk0 blk1 blk2)) + +It could also be written like this: + + (connect + (blk0 blk1) + (blk1 blk2)) + +Or even more verbosely as: + + (connect + ((list blk0 0) (list blk1 0)) + ((list blk1 0) (list blk2 0))) + +And finally, using Scheme's quasiquote mechanism, this works too: + + (connect + (`(,blk0 0) (,blk1 0)) + (`(,blk1 0) (,blk2 0))) + + +When gr-run-waveform loads the waveform file, it expands the +define-waveform section into code that creates a GNU Radio top block, +creates and initializes all variables and blocks specified in the +respective sections and connects them together according the +connections specifications. Finally it runs the resulting GNU Radio +flowgraph. + + +Naming conventions (or what's my block called???!!!) +---------------------------------------------------- + +All GNU Radio block constructors as well as everything else wrapped +for export by SWIG starts with a "gr:" prefix. This is to avoid +collisions with any built in Scheme procedures. + +All blocks contained in gnuradio-core are named like this: + + C++ name Python name Guile name + -------- ----------- ---------- + gr_head gr.head gr:head + gr_add_const_ff gr.add_const_ff gr:add-const-ff + + +GNU Radio blocks in any other component besides gnuradio-core use a +slightly different convention. They also start with gr: but in +addition include the component name after the gr:. This is because +Scheme implements its namespace differently than Python does. +Thus: + + C++ name Python name Guile name + -------- ----------- ---------- + audio_alsa_sink audio_alsa.sink gr:audio-alsa-sink + audio_jack_sink audio_jack.sink gr:audio-jack-sink + usrp2_sink_32fc usrp2.sink_32fc gr:usrp2-sink-32fc + + +Now, because we're working in Scheme and not C++ or Python, the +calling of class methods (member functions) is different too. SWIG +converts C++ member functions into what are called "generic functions" +using GOOPS[5], Guile's object oriented extension. (For those familar +with Common Lisp, GOOPS is very close in spirit to CLOS, the Common +Lisp Object System, but adapted for the Scheme language.) + +Assuming "u2" is a variable holding an instance of a usrp2 sink, +these all retrieve the current interpolation value: + + C++ Python Guile + -------- ----------- ---------- + u2->interp() u2.interp() (gr:interp u2) + + +Mapping of Guile types to/from C++ +---------------------------------- + +The mapping is similar in flavor to the Python <-> C++ mapping + + C++ Python Guile + -------- ----------- ---------- + true True #t + false False #f + "a string" "a string" "a string" + 3.14159 3.14159 3.14159 + gr_complex(1,-1) 1-1j 1-1i + vector (1, 2, 3) #(1 2 3) + vector (1.0, 2.0, 3.0) #(1.0 2.0 3.0) + + +You can find examples of each block constructor being called by +looking in the guile QA code contained in gnuradio-core/src/guile/tests/*.test +The types and values passed are syntactically correct, but don't +necessarily doing anything meaningful. + + +gr-run-waveform vs gr-run-waveform-script vs gr-run-waveform-binary +------------------------------------------------------------------- + +There are two implementations of gr-run-waveform: +gr-run-waveform-script and gr-run-waveform-binary. gr-run-waveform is +symlinked to one of them, with preference to gr-run-waveform-binary if +the gr-run-waveform component was built and installed. + +gr-run-waveform-script is contained in gnuradio-core and uses the +system's Guile interpreter and assocated files to implement this +functionality. + +gr-run-waveform-binary is built by the optional standalone component +gr-run-waveform. gr-run-waveform-binary is a C binary that requires +only handful of shared libraries and a single data file. To function +it requires the main program: gr-run-waveform-binary; the GNU Radio +C++ libraries: libgnuradio-*.so; the SWIG generated wrapper libraries: +libguile-gnuradio-*.so; and one additional file: +/share/gnuradio/gr-run-waveform/filesystem.dat. + +The two programs run waveform files identically. They differ only in +the details of how they are implemented. + + +References +---------- + +[1] http://www.schemers.org/Documents/Standards/R5RS/r5rs.pdf +[2] http://www.gnu.org/software/guile/guile.html +[3] html: http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html + pdf: http://download.plt-scheme.org/doc/205/pdf/t-y-scheme.pdf +[4] http://www.htdp.org/2003-09-26 +[5] http://www.gnu.org/software/guile/docs/goops/index.html -- cgit