#!/usr/bin/env python from gnuradio import gr from gnuradio import trellis from gnuradio import eng_notation from gnuradio.wxgui import stdgui, fftsink, waterfallsink, scopesink, form, slider import math import sys import random import wx class app_flow_graph(stdgui.gui_flow_graph): def __init__(self, frame, panel, vbox, argv): stdgui.gui_flow_graph.__init__(self) self.frame = frame self.panel = panel # TX Kb=100 packet = [0]*Kb f=trellis.fsm('awgn1o2_4.fsm') # get the FSM specification from a file for i in range(Kb-1*16): # last 16 bits = 0 to drive the final state to 0 packet[i] = random.randint(0, 1) # random 0s and 1s self.src = gr.vector_source_s(packet,True) self.enc = trellis.encoder_ss(f,0) # initial state = 0 self.mod = gr.chunks_to_symbols_sc((1,1j,-1,-1j),1) # CHANNEL self.add = gr.add_cc() self.noise = gr.noise_source_c(gr.GR_GAUSSIAN,math.sqrt(0.1/2),-666) # RX #metrics = trellis.metrics_f(f.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi #va = trellis.viterbi_s(f,K,0,-1) # Put -1 if the Initial/Final states are not set. #dst=gr.null_sink(gr.sizeof_gr_complex); samp_rate=1000 self.throttle = gr.throttle(gr.sizeof_gr_complex, samp_rate) self.dst = scopesink.scope_sink_c(self, panel, sample_rate=samp_rate, frame_decim=1, size=100, v_scale=2, t_scale=2) self.dst.win.info.xy = True self.dst.win.set_format_plus() vbox.Add(self.dst.win, 10, wx.EXPAND) self.connect (self.src,self.enc,self.mod) self.connect (self.mod,(self.add,0)) self.connect (self.noise,(self.add,1)) self.connect (self.add,self.throttle,self.dst) return def main(args): app = stdgui.stdapp(app_flow_graph, "Test Encoder", nstatus=1) app.MainLoop() if __name__ == '__main__': main (sys.argv[1:])