~ubuntu-branches/ubuntu/trusty/gnuradio/trusty

« back to all changes in this revision

Viewing changes to gnuradio-examples/python/digital/benchmark_loopback.py

  • Committer: Bazaar Package Importer
  • Author(s): Kamal Mostafa
  • Date: 2010-03-13 07:46:01 UTC
  • mfrom: (2.1.2 sid)
  • Revision ID: james.westby@ubuntu.com-20100313074601-zjsa893a87bozyh7
Tags: 3.2.2.dfsg-1ubuntu1
* Fix build for Ubuntu lucid (LP: #260406)
  - add binary package dep for libusrp0, libusrp2-0: adduser
  - debian/rules clean: remove pre-built Qt moc files

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
#
 
3
# Copyright 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
 
4
 
5
# This file is part of GNU Radio
 
6
 
7
# GNU Radio is free software; you can redistribute it and/or modify
 
8
# it under the terms of the GNU General Public License as published by
 
9
# the Free Software Foundation; either version 3, or (at your option)
 
10
# any later version.
 
11
 
12
# GNU Radio is distributed in the hope that it will be useful,
 
13
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
# GNU General Public License for more details.
 
16
 
17
# You should have received a copy of the GNU General Public License
 
18
# along with GNU Radio; see the file COPYING.  If not, write to
 
19
# the Free Software Foundation, Inc., 51 Franklin Street,
 
20
# Boston, MA 02110-1301, USA.
 
21
 
22
 
 
23
from gnuradio import gr, gru, modulation_utils
 
24
from gnuradio import eng_notation
 
25
from gnuradio.eng_option import eng_option
 
26
from optparse import OptionParser
 
27
 
 
28
import random, time, struct, sys, math
 
29
 
 
30
# from current dir
 
31
from transmit_path import transmit_path
 
32
from receive_path import receive_path
 
33
 
 
34
class my_top_block(gr.top_block):
 
35
    def __init__(self, mod_class, demod_class, rx_callback, options):
 
36
        gr.top_block.__init__(self)
 
37
 
 
38
        channelon = True;
 
39
 
 
40
        SNR = 10.0**(options.snr/10.0)
 
41
        frequency_offset = options.frequency_offset
 
42
        
 
43
        power_in_signal = abs(options.tx_amplitude)**2
 
44
        noise_power = power_in_signal/SNR
 
45
        noise_voltage = math.sqrt(noise_power)
 
46
 
 
47
        self.txpath = transmit_path(mod_class, options)
 
48
        self.throttle = gr.throttle(gr.sizeof_gr_complex, options.sample_rate)
 
49
        self.rxpath = receive_path(demod_class, rx_callback, options)
 
50
 
 
51
        if channelon:
 
52
            self.channel = gr.channel_model(noise_voltage, frequency_offset, 1.01)
 
53
 
 
54
            if options.discontinuous:
 
55
                z = 20000*[0,]
 
56
                self.zeros = gr.vector_source_c(z, True)
 
57
                packet_size = 5*((4+8+4+1500+4) * 8)
 
58
                self.mux = gr.stream_mux(gr.sizeof_gr_complex, [packet_size-0, int(9e5)])
 
59
 
 
60
                # Connect components
 
61
                self.connect(self.txpath, (self.mux,0))
 
62
                self.connect(self.zeros, (self.mux,1))
 
63
                self.connect(self.mux, self.channel, self.rxpath)
 
64
 
 
65
            else:
 
66
                self.connect(self.txpath, self.channel, self.rxpath)
 
67
 
 
68
        else:
 
69
            # Connect components
 
70
            self.connect(self.txpath, self.throttle, self.rxpath)
 
71
 
 
72
 
 
73
# /////////////////////////////////////////////////////////////////////////////
 
74
#                                   main
 
75
# /////////////////////////////////////////////////////////////////////////////
 
76
 
 
77
def main():
 
78
 
 
79
    global n_rcvd, n_right
 
80
 
 
81
    n_rcvd = 0
 
82
    n_right = 0
 
83
    
 
84
    def rx_callback(ok, payload):
 
85
        global n_rcvd, n_right
 
86
        (pktno,) = struct.unpack('!H', payload[0:2])
 
87
        n_rcvd += 1
 
88
        if ok:
 
89
            n_right += 1
 
90
 
 
91
        print "ok = %5s  pktno = %4d  n_rcvd = %4d  n_right = %4d" % (
 
92
            ok, pktno, n_rcvd, n_right)
 
93
        # print payload[2:len(payload)]
 
94
 
 
95
    def send_pkt(payload='', eof=False):
 
96
        return tb.txpath.send_pkt(payload, eof)
 
97
 
 
98
 
 
99
    mods = modulation_utils.type_1_mods()
 
100
    demods = modulation_utils.type_1_demods()
 
101
 
 
102
    parser = OptionParser(option_class=eng_option, conflict_handler="resolve")
 
103
    expert_grp = parser.add_option_group("Expert")
 
104
    channel_grp = parser.add_option_group("Channel")
 
105
 
 
106
    parser.add_option("-m", "--modulation", type="choice", choices=mods.keys(),
 
107
                      default='dbpsk',
 
108
                      help="Select modulation from: %s [default=%%default]"
 
109
                            % (', '.join(mods.keys()),))
 
110
 
 
111
    parser.add_option("-s", "--size", type="eng_float", default=1500,
 
112
                      help="set packet size [default=%default]")
 
113
    parser.add_option("-M", "--megabytes", type="eng_float", default=1.0,
 
114
                      help="set megabytes to transmit [default=%default]")
 
115
    parser.add_option("","--discontinuous", action="store_true", default=False,
 
116
                      help="enable discontinous transmission (bursts of 5 packets)")
 
117
 
 
118
    channel_grp.add_option("", "--sample-rate", type="eng_float", default=1e5,
 
119
                           help="set speed of channel/simulation rate to RATE [default=%default]") 
 
120
    channel_grp.add_option("", "--snr", type="eng_float", default=30,
 
121
                           help="set the SNR of the channel in dB [default=%default]")
 
122
    channel_grp.add_option("", "--frequency-offset", type="eng_float", default=0,
 
123
                           help="set frequency offset introduced by channel [default=%default]")
 
124
    channel_grp.add_option("", "--seed", action="store_true", default=False,
 
125
                           help="use a random seed for AWGN noise [default=%default]")
 
126
 
 
127
    transmit_path.add_options(parser, expert_grp)
 
128
    receive_path.add_options(parser, expert_grp)
 
129
 
 
130
    for mod in mods.values():
 
131
        mod.add_options(expert_grp)
 
132
    for demod in demods.values():
 
133
        demod.add_options(expert_grp)
 
134
 
 
135
    (options, args) = parser.parse_args ()
 
136
 
 
137
    if len(args) != 0:
 
138
        parser.print_help()
 
139
        sys.exit(1)
 
140
 
 
141
    r = gr.enable_realtime_scheduling()
 
142
    if r != gr.RT_OK:
 
143
        print "Warning: failed to enable realtime scheduling"
 
144
        
 
145
    # Create an instance of a hierarchical block
 
146
    tb = my_top_block(mods[options.modulation], demods[options.modulation], rx_callback, options)
 
147
    tb.start()
 
148
 
 
149
    # generate and send packets
 
150
    nbytes = int(1e6 * options.megabytes)
 
151
    n = 0
 
152
    pktno = 0
 
153
    pkt_size = int(options.size)
 
154
 
 
155
    while n < nbytes:
 
156
        send_pkt(struct.pack('!H', pktno & 0xffff) + (pkt_size - 2) * chr(pktno & 0xff))
 
157
        n += pkt_size
 
158
        pktno += 1
 
159
        
 
160
    send_pkt(eof=True)
 
161
 
 
162
    tb.wait()
 
163
    
 
164
if __name__ == '__main__':
 
165
    try:
 
166
        main()
 
167
    except KeyboardInterrupt:
 
168
        pass