Statistics
| Branch: | Tag: | Revision:

root / gr-wxgui / src / python / constsink_gl.py @ c5241cca

History | View | Annotate | Download (4.6 kB)

1 36649d4e jcorgan
#
2 36649d4e jcorgan
# Copyright 2008 Free Software Foundation, Inc.
3 36649d4e jcorgan
#
4 36649d4e jcorgan
# This file is part of GNU Radio
5 36649d4e jcorgan
#
6 36649d4e jcorgan
# GNU Radio is free software; you can redistribute it and/or modify
7 36649d4e jcorgan
# it under the terms of the GNU General Public License as published by
8 36649d4e jcorgan
# the Free Software Foundation; either version 3, or (at your option)
9 36649d4e jcorgan
# any later version.
10 36649d4e jcorgan
#
11 36649d4e jcorgan
# GNU Radio is distributed in the hope that it will be useful,
12 36649d4e jcorgan
# but WITHOUT ANY WARRANTY; without even the implied warranty of
13 36649d4e jcorgan
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 36649d4e jcorgan
# GNU General Public License for more details.
15 36649d4e jcorgan
#
16 36649d4e jcorgan
# You should have received a copy of the GNU General Public License
17 36649d4e jcorgan
# along with GNU Radio; see the file COPYING.  If not, write to
18 36649d4e jcorgan
# the Free Software Foundation, Inc., 51 Franklin Street,
19 36649d4e jcorgan
# Boston, MA 02110-1301, USA.
20 36649d4e jcorgan
#
21 36649d4e jcorgan
22 36649d4e jcorgan
##################################################
23 36649d4e jcorgan
# Imports
24 36649d4e jcorgan
##################################################
25 36649d4e jcorgan
import const_window
26 36649d4e jcorgan
import common
27 36649d4e jcorgan
from gnuradio import gr, blks2
28 36649d4e jcorgan
from pubsub import pubsub
29 36649d4e jcorgan
from constants import *
30 36649d4e jcorgan
31 36649d4e jcorgan
##################################################
32 36649d4e jcorgan
# Constellation sink block (wrapper for old wxgui)
33 36649d4e jcorgan
##################################################
34 36649d4e jcorgan
class const_sink_c(gr.hier_block2, common.prop_setter):
35 36649d4e jcorgan
        """!
36 36649d4e jcorgan
        A constellation block with a gui window.
37 36649d4e jcorgan
        """
38 36649d4e jcorgan
39 36649d4e jcorgan
        def __init__(
40 36649d4e jcorgan
                self,
41 36649d4e jcorgan
                parent,
42 36649d4e jcorgan
                title='',
43 36649d4e jcorgan
                sample_rate=1,
44 36649d4e jcorgan
                size=const_window.DEFAULT_WIN_SIZE,
45 36649d4e jcorgan
                frame_rate=const_window.DEFAULT_FRAME_RATE,
46 36649d4e jcorgan
                const_size=const_window.DEFAULT_CONST_SIZE,
47 36649d4e jcorgan
                #mpsk recv params
48 36649d4e jcorgan
                M=4,
49 36649d4e jcorgan
                theta=0,
50 36649d4e jcorgan
                alpha=0.005,
51 36649d4e jcorgan
                fmax=0.06,
52 36649d4e jcorgan
                mu=0.5,
53 36649d4e jcorgan
                gain_mu=0.005,
54 36649d4e jcorgan
                symbol_rate=1,
55 36649d4e jcorgan
                omega_limit=0.005,
56 36649d4e jcorgan
        ):
57 36649d4e jcorgan
                #init
58 36649d4e jcorgan
                gr.hier_block2.__init__(
59 36649d4e jcorgan
                        self,
60 36649d4e jcorgan
                        "const_sink",
61 36649d4e jcorgan
                        gr.io_signature(1, 1, gr.sizeof_gr_complex),
62 36649d4e jcorgan
                        gr.io_signature(0, 0, 0),
63 36649d4e jcorgan
                )
64 36649d4e jcorgan
                #blocks
65 36649d4e jcorgan
                sd = blks2.stream_to_vector_decimator(
66 36649d4e jcorgan
                        item_size=gr.sizeof_gr_complex,
67 36649d4e jcorgan
                        sample_rate=sample_rate,
68 36649d4e jcorgan
                        vec_rate=frame_rate,
69 36649d4e jcorgan
                        vec_len=const_size,
70 36649d4e jcorgan
                )
71 36649d4e jcorgan
                beta = .25*alpha**2 #redundant, will be updated
72 36649d4e jcorgan
                fmin = -fmax
73 36649d4e jcorgan
                gain_omega = .25*gain_mu**2 #redundant, will be updated
74 36649d4e jcorgan
                omega = 1 #set_sample_rate will update this
75 36649d4e jcorgan
                # Costas frequency/phase recovery loop
76 36649d4e jcorgan
                # Critically damped 2nd order PLL
77 36649d4e jcorgan
                self._costas = gr.costas_loop_cc(alpha, beta, fmax, fmin, M)
78 36649d4e jcorgan
                # Timing recovery loop
79 36649d4e jcorgan
                # Critically damped 2nd order DLL
80 36649d4e jcorgan
                self._retime = gr.clock_recovery_mm_cc(omega, gain_omega, mu, gain_mu, omega_limit)
81 36649d4e jcorgan
                #sync = gr.mpsk_receiver_cc(
82 36649d4e jcorgan
                #        M, #psk order
83 36649d4e jcorgan
                #        theta,
84 36649d4e jcorgan
                #        alpha,
85 36649d4e jcorgan
                #        beta,
86 36649d4e jcorgan
                #        fmin,
87 36649d4e jcorgan
                #        fmax,
88 36649d4e jcorgan
                #        mu,
89 36649d4e jcorgan
                #        gain_mu,
90 36649d4e jcorgan
                #        omega,
91 36649d4e jcorgan
                #        gain_omega,
92 36649d4e jcorgan
                #        omega_limit,
93 36649d4e jcorgan
                #)
94 36649d4e jcorgan
                agc = gr.feedforward_agc_cc(16, 1)
95 36649d4e jcorgan
                msgq = gr.msg_queue(2)
96 36649d4e jcorgan
                sink = gr.message_sink(gr.sizeof_gr_complex*const_size, msgq, True)
97 36649d4e jcorgan
                #connect
98 36649d4e jcorgan
                self.connect(self, self._costas, self._retime, agc, sd, sink)
99 36649d4e jcorgan
                #controller
100 36649d4e jcorgan
                def setter(p, k, x): # lambdas can't have assignments :(
101 36649d4e jcorgan
                    p[k] = x
102 36649d4e jcorgan
                self.controller = pubsub()
103 36649d4e jcorgan
                self.controller.subscribe(ALPHA_KEY, self._costas.set_alpha)
104 36649d4e jcorgan
                self.controller.publish(ALPHA_KEY, self._costas.alpha)
105 36649d4e jcorgan
                self.controller.subscribe(BETA_KEY, self._costas.set_beta)
106 36649d4e jcorgan
                self.controller.publish(BETA_KEY, self._costas.beta)
107 36649d4e jcorgan
                self.controller.subscribe(GAIN_MU_KEY, self._retime.set_gain_mu)
108 36649d4e jcorgan
                self.controller.publish(GAIN_MU_KEY, self._retime.gain_mu)
109 36649d4e jcorgan
                self.controller.subscribe(OMEGA_KEY, self._retime.set_omega)
110 36649d4e jcorgan
                self.controller.publish(OMEGA_KEY, self._retime.omega)
111 36649d4e jcorgan
                self.controller.subscribe(GAIN_OMEGA_KEY, self._retime.set_gain_omega)
112 36649d4e jcorgan
                self.controller.publish(GAIN_OMEGA_KEY, self._retime.gain_omega)
113 36649d4e jcorgan
                self.controller.subscribe(SAMPLE_RATE_KEY, sd.set_sample_rate)
114 36649d4e jcorgan
                self.controller.subscribe(SAMPLE_RATE_KEY, lambda x: setter(self.controller, OMEGA_KEY, float(x)/symbol_rate))
115 36649d4e jcorgan
                self.controller.publish(SAMPLE_RATE_KEY, sd.sample_rate)
116 36649d4e jcorgan
                #initial update
117 36649d4e jcorgan
                self.controller[SAMPLE_RATE_KEY] = sample_rate
118 36649d4e jcorgan
                #start input watcher
119 36649d4e jcorgan
                common.input_watcher(msgq, lambda x: setter(self.controller, MSG_KEY, x))
120 36649d4e jcorgan
                #create window
121 36649d4e jcorgan
                self.win = const_window.const_window(
122 36649d4e jcorgan
                        parent=parent,
123 36649d4e jcorgan
                        controller=self.controller,
124 36649d4e jcorgan
                        size=size,
125 36649d4e jcorgan
                        title=title,
126 36649d4e jcorgan
                        msg_key=MSG_KEY,
127 36649d4e jcorgan
                        alpha_key=ALPHA_KEY,
128 36649d4e jcorgan
                        beta_key=BETA_KEY,
129 36649d4e jcorgan
                        gain_mu_key=GAIN_MU_KEY,
130 36649d4e jcorgan
                        gain_omega_key=GAIN_OMEGA_KEY,
131 36649d4e jcorgan
                )
132 36649d4e jcorgan
                #register callbacks from window for external use
133 36649d4e jcorgan
                for attr in filter(lambda a: a.startswith('set_'), dir(self.win)):
134 36649d4e jcorgan
                        setattr(self, attr, getattr(self.win, attr))
135 36649d4e jcorgan
                self._register_set_prop(self.controller, ALPHA_KEY)
136 36649d4e jcorgan
                self._register_set_prop(self.controller, BETA_KEY)
137 36649d4e jcorgan
                self._register_set_prop(self.controller, GAIN_MU_KEY)
138 36649d4e jcorgan
                self._register_set_prop(self.controller, OMEGA_KEY)
139 36649d4e jcorgan
                self._register_set_prop(self.controller, GAIN_OMEGA_KEY)
140 36649d4e jcorgan
                self._register_set_prop(self.controller, SAMPLE_RATE_KEY)
141 36649d4e jcorgan