Statistics
| Branch: | Tag: | Revision:

root / gr-digital / examples / tx_voice.py @ fcc37807

History | View | Annotate | Download (5.6 kB)

1 5d69a524 jcorgan
#!/usr/bin/env python
2 5d69a524 jcorgan
#
3 46168fbd Tom Rondeau
# Copyright 2005-2007,2009,2011 Free Software Foundation, Inc.
4 5d69a524 jcorgan
# 
5 5d69a524 jcorgan
# This file is part of GNU Radio
6 5d69a524 jcorgan
# 
7 5d69a524 jcorgan
# GNU Radio is free software; you can redistribute it and/or modify
8 5d69a524 jcorgan
# it under the terms of the GNU General Public License as published by
9 937b719d eb
# the Free Software Foundation; either version 3, or (at your option)
10 5d69a524 jcorgan
# any later version.
11 5d69a524 jcorgan
# 
12 5d69a524 jcorgan
# GNU Radio is distributed in the hope that it will be useful,
13 5d69a524 jcorgan
# but WITHOUT ANY WARRANTY; without even the implied warranty of
14 5d69a524 jcorgan
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 5d69a524 jcorgan
# GNU General Public License for more details.
16 5d69a524 jcorgan
# 
17 5d69a524 jcorgan
# You should have received a copy of the GNU General Public License
18 5d69a524 jcorgan
# along with GNU Radio; see the file COPYING.  If not, write to
19 86f5c924 eb
# the Free Software Foundation, Inc., 51 Franklin Street,
20 86f5c924 eb
# Boston, MA 02110-1301, USA.
21 5d69a524 jcorgan
# 
22 5d69a524 jcorgan
23 fcc37807 Tom Rondeau
from gnuradio import gr, blks2, audio, uhd
24 5d69a524 jcorgan
from gnuradio import eng_notation
25 5d69a524 jcorgan
from gnuradio.eng_option import eng_option
26 5d69a524 jcorgan
from optparse import OptionParser
27 5d69a524 jcorgan
28 46168fbd Tom Rondeau
from gnuradio import digital
29 fcc37807 Tom Rondeau
from gnuradio import vocoder
30 46168fbd Tom Rondeau
31 5d69a524 jcorgan
import random
32 5d69a524 jcorgan
import time
33 5d69a524 jcorgan
import struct
34 5d69a524 jcorgan
import sys
35 5d69a524 jcorgan
36 5d69a524 jcorgan
# from current dir
37 46168fbd Tom Rondeau
from transmit_path import transmit_path
38 fcc37807 Tom Rondeau
from uhd_interface import uhd_transmitter
39 5d69a524 jcorgan
40 5d69a524 jcorgan
#import os
41 5d69a524 jcorgan
#print os.getpid()
42 5d69a524 jcorgan
#raw_input('Attach and press enter')
43 5d69a524 jcorgan
44 5d69a524 jcorgan
45 e692e713 jcorgan
class audio_rx(gr.hier_block2):
46 e692e713 jcorgan
    def __init__(self, audio_input_dev):
47 e692e713 jcorgan
        gr.hier_block2.__init__(self, "audio_rx",
48 e692e713 jcorgan
                                gr.io_signature(0, 0, 0), # Input signature
49 e692e713 jcorgan
                                gr.io_signature(0, 0, 0)) # Output signature
50 fcc37807 Tom Rondeau
        self.sample_rate = sample_rate = 8000
51 f1c41f80 eb
        src = audio.source(sample_rate, audio_input_dev)
52 5d69a524 jcorgan
        src_scale = gr.multiply_const_ff(32767)
53 5d69a524 jcorgan
        f2s = gr.float_to_short()
54 fcc37807 Tom Rondeau
        voice_coder = vocoder.gsm_fr_encode_sp()
55 5d69a524 jcorgan
        self.packets_from_encoder = gr.msg_queue()
56 5d69a524 jcorgan
        packet_sink = gr.message_sink(33, self.packets_from_encoder, False)
57 e692e713 jcorgan
        self.connect(src, src_scale, f2s, voice_coder, packet_sink)
58 f1c41f80 eb
59 f1c41f80 eb
    def get_encoded_voice_packet(self):
60 f1c41f80 eb
        return self.packets_from_encoder.delete_head()
61 f1c41f80 eb
        
62 f1c41f80 eb
63 e692e713 jcorgan
class my_top_block(gr.top_block):
64 f1c41f80 eb
65 f1c41f80 eb
    def __init__(self, modulator_class, options):
66 e692e713 jcorgan
        gr.top_block.__init__(self)
67 46168fbd Tom Rondeau
        self.txpath = transmit_path(modulator_class, options)
68 e692e713 jcorgan
        self.audio_rx = audio_rx(options.audio_input)
69 5d69a524 jcorgan
70 fcc37807 Tom Rondeau
        if(options.tx_freq is not None):
71 fcc37807 Tom Rondeau
            self.sink = uhd_transmitter(options.address, options.bitrate,
72 fcc37807 Tom Rondeau
                                        options.samples_per_symbol,
73 fcc37807 Tom Rondeau
                                        options.tx_freq, options.tx_gain,
74 fcc37807 Tom Rondeau
                                        options.antenna, options.verbose)
75 fcc37807 Tom Rondeau
            options.samples_per_symbol = self.sink._sps
76 fcc37807 Tom Rondeau
            audio_rate = self.audio_rx.sample_rate
77 fcc37807 Tom Rondeau
            usrp_rate = self.sink.get_sample_rate()
78 fcc37807 Tom Rondeau
            rrate = usrp_rate / audio_rate
79 fcc37807 Tom Rondeau
            
80 fcc37807 Tom Rondeau
        elif(options.to_file is not None):
81 46168fbd Tom Rondeau
            self.sink = gr.file_sink(gr.sizeof_gr_complex, options.to_file)
82 fcc37807 Tom Rondeau
            rrate = 1
83 46168fbd Tom Rondeau
        else:
84 46168fbd Tom Rondeau
            self.sink = gr.null_sink(gr.sizeof_gr_complex)
85 fcc37807 Tom Rondeau
            rrate = 1
86 46168fbd Tom Rondeau
87 fcc37807 Tom Rondeau
        self.resampler = blks2.pfb_arb_resampler_ccf(rrate)
88 fcc37807 Tom Rondeau
            
89 46168fbd Tom Rondeau
        self.connect(self.audio_rx)
90 fcc37807 Tom Rondeau
        self.connect(self.txpath, self.resampler, self.sink)
91 46168fbd Tom Rondeau
            
92 5d69a524 jcorgan
93 5d69a524 jcorgan
# /////////////////////////////////////////////////////////////////////////////
94 5d69a524 jcorgan
#                                   main
95 5d69a524 jcorgan
# /////////////////////////////////////////////////////////////////////////////
96 5d69a524 jcorgan
97 5d69a524 jcorgan
def main():
98 5d69a524 jcorgan
99 5d69a524 jcorgan
    def send_pkt(payload='', eof=False):
100 e692e713 jcorgan
        return tb.txpath.send_pkt(payload, eof)
101 5d69a524 jcorgan
102 5d69a524 jcorgan
    def rx_callback(ok, payload):
103 5d69a524 jcorgan
        print "ok = %r, payload = '%s'" % (ok, payload)
104 5d69a524 jcorgan
105 46168fbd Tom Rondeau
    mods = digital.modulation_utils2.type_1_mods()
106 f1c41f80 eb
107 f1c41f80 eb
    parser = OptionParser(option_class=eng_option, conflict_handler="resolve")
108 f1c41f80 eb
    expert_grp = parser.add_option_group("Expert")
109 f1c41f80 eb
110 f1c41f80 eb
    parser.add_option("-m", "--modulation", type="choice", choices=mods.keys(),
111 f1c41f80 eb
                      default='gmsk',
112 f1c41f80 eb
                      help="Select modulation from: %s [default=%%default]"
113 f1c41f80 eb
                            % (', '.join(mods.keys()),))
114 f1c41f80 eb
    parser.add_option("-M", "--megabytes", type="eng_float", default=0,
115 f1c41f80 eb
                      help="set megabytes to transmit [default=inf]")
116 f1c41f80 eb
    parser.add_option("-I", "--audio-input", type="string", default="",
117 f1c41f80 eb
                      help="pcm input device name.  E.g., hw:0,0 or /dev/dsp")
118 46168fbd Tom Rondeau
    parser.add_option("","--to-file", default=None,
119 46168fbd Tom Rondeau
                      help="Output file for modulated samples")
120 fcc37807 Tom Rondeau
121 46168fbd Tom Rondeau
    transmit_path.add_options(parser, expert_grp)
122 fcc37807 Tom Rondeau
    uhd_transmitter.add_options(parser)
123 f1c41f80 eb
124 f1c41f80 eb
    for mod in mods.values():
125 f1c41f80 eb
        mod.add_options(expert_grp)
126 f1c41f80 eb
127 f1c41f80 eb
    parser.set_defaults(bitrate=50e3)  # override default bitrate default
128 5d69a524 jcorgan
    (options, args) = parser.parse_args ()
129 5d69a524 jcorgan
130 5d69a524 jcorgan
    if len(args) != 0:
131 5d69a524 jcorgan
        parser.print_help()
132 5d69a524 jcorgan
        sys.exit(1)
133 5d69a524 jcorgan
134 46168fbd Tom Rondeau
    if options.to_file is None:
135 46168fbd Tom Rondeau
        if options.tx_freq is None:
136 46168fbd Tom Rondeau
            sys.stderr.write("You must specify -f FREQ or --freq FREQ\n")
137 46168fbd Tom Rondeau
            parser.print_help(sys.stderr)
138 46168fbd Tom Rondeau
            sys.exit(1)
139 5d69a524 jcorgan
140 5d69a524 jcorgan
    # build the graph
141 e692e713 jcorgan
    tb = my_top_block(mods[options.modulation], options)
142 5d69a524 jcorgan
143 f1c41f80 eb
    r = gr.enable_realtime_scheduling()
144 f1c41f80 eb
    if r != gr.RT_OK:
145 f1c41f80 eb
        print "Warning: failed to enable realtime scheduling"
146 5d69a524 jcorgan
147 5d69a524 jcorgan
148 e692e713 jcorgan
    tb.start()                       # start flow graph
149 5d69a524 jcorgan
150 5d69a524 jcorgan
    # generate and send packets
151 5d69a524 jcorgan
    nbytes = int(1e6 * options.megabytes)
152 5d69a524 jcorgan
    n = 0
153 5d69a524 jcorgan
    pktno = 0
154 5d69a524 jcorgan
155 f1c41f80 eb
    while nbytes == 0 or n < nbytes:
156 e692e713 jcorgan
        packet = tb.audio_rx.get_encoded_voice_packet()
157 5d69a524 jcorgan
        s = packet.to_string()
158 5d69a524 jcorgan
        send_pkt(s)
159 5d69a524 jcorgan
        n += len(s)
160 5d69a524 jcorgan
        sys.stderr.write('.')
161 5d69a524 jcorgan
        pktno += 1
162 5d69a524 jcorgan
        
163 5d69a524 jcorgan
    send_pkt(eof=True)
164 e692e713 jcorgan
    tb.wait()                       # wait for it to finish
165 5d69a524 jcorgan
166 5d69a524 jcorgan
167 5d69a524 jcorgan
if __name__ == '__main__':
168 5d69a524 jcorgan
    try:
169 5d69a524 jcorgan
        main()
170 5d69a524 jcorgan
    except KeyboardInterrupt:
171 bc105a1e jblum
        pass