From 26e7851318dfc691fd4412823a392a15bd1c475e Mon Sep 17 00:00:00 2001 From: Ben Reynwar Date: Fri, 3 Dec 2010 21:25:47 -0700 Subject: Added a new example python script (a stripped down version of benchmark_loopback.py). Made minor change to blks2.demod_pkts. --- gnuradio-examples/python/digital/simple.py | 64 ++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 gnuradio-examples/python/digital/simple.py (limited to 'gnuradio-examples/python/digital') diff --git a/gnuradio-examples/python/digital/simple.py b/gnuradio-examples/python/digital/simple.py new file mode 100644 index 000000000..6d340db36 --- /dev/null +++ b/gnuradio-examples/python/digital/simple.py @@ -0,0 +1,64 @@ + +from gnuradio import gr, blks2, packet_utils + +# Some constants +TX_AMPLITUDE = 0.25 +SAMPLE_RATE = 1e5 +# NOISE_VOLTAGE = 0.01 +NOISE_VOLTAGE = 0.01 +# FREQUENCY_OFFSET = 0 +FREQUENCY_OFFSET = 0.01 +TIMING_OFFSET = 1.0 +SAMPLES_PER_SYMBOL = 2 +GAIN = 1.0 +SW_DECIM = 1 +BAND_MIDPOINT = 1.0 +BAND_WIDTH = 0.5 + +# Modulation/Demodulation methods +modulator = blks2.dbpsk2_mod() +demodulator = blks2.dbpsk2_demod() + +#Transmission Blocks +packet_transmitter = blks2.mod_pkts(modulator, access_code=None, msgq_limit=4, + pad_for_usrp=True) +amp = gr.multiply_const_cc(TX_AMPLITUDE) +throttle = gr.throttle(gr.sizeof_gr_complex, SAMPLE_RATE) +# Channel +channel = gr.channel_model(NOISE_VOLTAGE, FREQUENCY_OFFSET, TIMING_OFFSET) +# Receiver Blocks +chan_coeffs = gr.firdes.low_pass(GAIN, SW_DECIM * SAMPLES_PER_SYMBOL, + BAND_MIDPOINT, BAND_WIDTH, gr.firdes.WIN_HANN) +channel_filter = gr.fft_filter_ccc(SW_DECIM, chan_coeffs) +packet_receiver = blks2.demod_pkts(demodulator, access_code=None, callback=None, + threshold=-1) +# Put it all together and start it up (although nothing will be done +# until we send some packets). +tb = gr.top_block() +tb.connect(packet_transmitter, amp, throttle, channel, channel_filter, + packet_receiver) +tb.start() + +# The queue into which recieved packets are placed +pkq = packet_receiver._rcvd_pktq + +# The function to create a packet and place it in a queue to be sent. +sender = packet_transmitter.send_pkt + +# Some some packets (The second will not be recieved because it gets cut off +# before it can finish. I think this occurs during modulation.) +sender('hello there I wonder how long this needs to be before I start to see any errors.') +sender('world') +sender(eof=True) + +# Wait for all the packets to get sent and received. +tb.wait() + +# Check how many messages have been received and print them. +cnt = pkq.count() +print('There are %s messages' % cnt) +for a in range(0, cnt): + msg = pkq.delete_head() + ok, payload = packet_utils.unmake_packet(msg.to_string(), int(msg.arg1())) + print("Message %s is %s" % (a, payload)) + -- cgit From 2863f40d5d0bca8713252bb3618f9844fccf673c Mon Sep 17 00:00:00 2001 From: Ben Reynwar Date: Thu, 9 Dec 2010 15:12:14 -0700 Subject: Added support for modulation/demodulation of a generic constellation. Not yet robust enough. Inefficient QAM modulation/demodulation also added (via the generic implementation). --- gnuradio-examples/python/digital/simple_qam.py | 64 ++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 gnuradio-examples/python/digital/simple_qam.py (limited to 'gnuradio-examples/python/digital') diff --git a/gnuradio-examples/python/digital/simple_qam.py b/gnuradio-examples/python/digital/simple_qam.py new file mode 100644 index 000000000..dee57baeb --- /dev/null +++ b/gnuradio-examples/python/digital/simple_qam.py @@ -0,0 +1,64 @@ + +from gnuradio import gr, blks2, packet_utils + +# Some constants +NOISE_VOLTAGE = 0 +FREQUENCY_OFFSET = 0 +TIMING_OFFSET = 1.0 +SAMPLES_PER_SYMBOL = 2 +GAIN = 1.0 +SW_DECIM = 1 +BAND_MIDPOINT = 1.0 +BAND_WIDTH = 0.5 + +# Modulation/Demodulation methods +modulator = blks2.qam_mod(4, SAMPLES_PER_SYMBOL) +demodulator = blks2.qam_demod(4, SAMPLES_PER_SYMBOL) + +#Transmission Blocks +packet_transmitter = blks2.mod_pkts(modulator, access_code=None, msgq_limit=4, + pad_for_usrp=True) +# Channel +channel = gr.channel_model(NOISE_VOLTAGE, FREQUENCY_OFFSET, TIMING_OFFSET) +# Receiver Blocks +chan_coeffs = gr.firdes.low_pass(GAIN, SW_DECIM * SAMPLES_PER_SYMBOL, + BAND_MIDPOINT, BAND_WIDTH, gr.firdes.WIN_HANN) +channel_filter = gr.fft_filter_ccc(SW_DECIM, chan_coeffs) +packet_receiver = blks2.demod_pkts(demodulator, access_code=None, callback=None, + threshold=-1) +# Put it all together and start it up (although nothing will be done +# until we send some packets). +tb = gr.top_block() +tb.connect(packet_transmitter, channel, channel_filter, + packet_receiver) +tb.start() + +# The queue into which recieved packets are placed +pkq = packet_receiver._rcvd_pktq + +# The function to create a packet and place it in a queue to be sent. +sender = packet_transmitter.send_pkt + +# Some some packets (The second will not be recieved because it gets cut off +# before it can finish. I think this occurs during modulation.) +sender('hello1') +sender('hello2') +sender('hello3') +sender('hello4') +sender('hello5') +sender('hello6') +sender('hello7') +sender('world') +sender(eof=True) + +# Wait for all the packets to get sent and received. +tb.wait() + +# Check how many messages have been received and print them. +cnt = pkq.count() +print('There are %s messages' % cnt) +for a in range(0, cnt): + msg = pkq.delete_head() + ok, payload = packet_utils.unmake_packet(msg.to_string(), int(msg.arg1())) + print("Message %s is %s" % (a, payload)) + -- cgit From ee21aaed629cfe9cec2e561c0e3d10374ec80e29 Mon Sep 17 00:00:00 2001 From: Ben Reynwar Date: Fri, 10 Dec 2010 23:42:13 -0700 Subject: Fixing generic demodulation. --- gnuradio-examples/python/digital/simple_qam.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'gnuradio-examples/python/digital') diff --git a/gnuradio-examples/python/digital/simple_qam.py b/gnuradio-examples/python/digital/simple_qam.py index dee57baeb..947d7faad 100644 --- a/gnuradio-examples/python/digital/simple_qam.py +++ b/gnuradio-examples/python/digital/simple_qam.py @@ -2,18 +2,20 @@ from gnuradio import gr, blks2, packet_utils # Some constants -NOISE_VOLTAGE = 0 -FREQUENCY_OFFSET = 0 +NOISE_VOLTAGE = 0.1 +FREQUENCY_OFFSET = 0.0000 TIMING_OFFSET = 1.0 SAMPLES_PER_SYMBOL = 2 GAIN = 1.0 SW_DECIM = 1 BAND_MIDPOINT = 1.0 BAND_WIDTH = 0.5 +FREQ_ALPHA = 0.005 +EXCESS_BW = 0.35 # Modulation/Demodulation methods -modulator = blks2.qam_mod(4, SAMPLES_PER_SYMBOL) -demodulator = blks2.qam_demod(4, SAMPLES_PER_SYMBOL) +modulator = blks2.qam_mod(16, SAMPLES_PER_SYMBOL) +demodulator = blks2.qam_demod(16, SAMPLES_PER_SYMBOL, freq_alpha=FREQ_ALPHA) #Transmission Blocks packet_transmitter = blks2.mod_pkts(modulator, access_code=None, msgq_limit=4, @@ -41,6 +43,11 @@ sender = packet_transmitter.send_pkt # Some some packets (The second will not be recieved because it gets cut off # before it can finish. I think this occurs during modulation.) + +# Send some large messages to start off with to let things lock. +for i in range(0, int(20.0/SAMPLES_PER_SYMBOL)): + sender('a'*4000) + sender('hello1') sender('hello2') sender('hello3') @@ -48,6 +55,11 @@ sender('hello4') sender('hello5') sender('hello6') sender('hello7') +sender('hello8') +sender('hello9') +sender('hello10') +sender('hello11') +sender('hello12') sender('world') sender(eof=True) -- cgit From f6547e103e6cae44ff2a81b0f83675ccc897f2e9 Mon Sep 17 00:00:00 2001 From: Ben Reynwar Date: Thu, 27 Jan 2011 12:36:31 -0700 Subject: Minor changes to a benchmark example in gnuradio-examples/python/digital. --- .../python/digital/benchmark_qt_loopback2.py | 25 ++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'gnuradio-examples/python/digital') diff --git a/gnuradio-examples/python/digital/benchmark_qt_loopback2.py b/gnuradio-examples/python/digital/benchmark_qt_loopback2.py index 02ae4b25f..a36f4fbd4 100755 --- a/gnuradio-examples/python/digital/benchmark_qt_loopback2.py +++ b/gnuradio-examples/python/digital/benchmark_qt_loopback2.py @@ -20,11 +20,11 @@ # Boston, MA 02110-1301, USA. # -from gnuradio import gr, gru, modulation_utils2 +from gnuradio import gr, modulation_utils2 from gnuradio import eng_notation from gnuradio.eng_option import eng_option from optparse import OptionParser -import random, time, struct, sys, os, math +import struct, sys, math from threading import Thread @@ -319,6 +319,13 @@ class my_top_block(gr.top_block): # Connect components self.connect(self.txpath, self.throttle, self.rxpath) + if options.verbose: + self._print_verbage() + + if options.log: + self._setup_logging() + + # System Parameters @@ -396,6 +403,15 @@ class my_top_block(gr.top_block): self.rxpath.packet_receiver._demodulator.freq_recov.set_beta(self._gain_freq/10.0) #self.rxpath.packet_receiver._demodulator.freq_recov.set_beta(self._gain_fre_beta) + def _print_verbage(self): + print "\nChannel:" + print "SNR: %d" % self.snr() + print "Noise voltage: %.2e" % self.get_noise_voltage(self.snr()) + print "Frequency offset: %.2e" % self.frequency_offset() + print "Timing offset: %.2e" % self.timing_offset() + + def _setup_logging(self): + pass # ///////////////////////////////////////////////////////////////////////////// # Thread to handle the packet sending procedure @@ -466,7 +482,7 @@ def main(): channel_grp = parser.add_option_group("Channel") parser.add_option("-m", "--modulation", type="choice", choices=mods.keys(), - default='dbpsk2', + default='psk', help="Select modulation from: %s [default=%%default]" % (', '.join(mods.keys()),)) @@ -512,6 +528,7 @@ def main(): tb = my_top_block(mods[options.modulation], demods[options.modulation], rx_callback, options) + tb.start() packet_sender = th_send(send_pkt, options.megabytes, options.size) @@ -527,7 +544,7 @@ def main(): packet_sender.join(1) except KeyboardInterrupt: packet_sender.stop() - + if __name__ == '__main__': try: -- cgit