Revision d5c192f9 gnuradio-examples/python/channel-coding/fsm_utils.py

b/gnuradio-examples/python/channel-coding/fsm_utils.py
60 60

61 61

62 62

63

64

65
######################################################################
66
# Automaticaly generate the FSM structure for a binary feed-forward
67
# convolutional code.
68
# Input: k x n generator matrix (decimal representation)
69
######################################################################
70
def make_fsm_bin_cc_ff(k,n,GM):
71
    mem=[[]]*k
72
    max_mem_x=[-1]*k
73
    max_mem = -1
74
    for i in range(k):
75
        memr=[0]*n
76
        for j in range(n):
77
            if GM[i][j]==0:
78
                memr[j]=-1
79
            else:
80
                memr[j]=int(math.log(GM[i][j],2))
81
            if memr[j]>max_mem_x[i]:
82
                max_mem_x[i]=memr[j]
83
            if memr[j]>max_mem:
84
                max_mem=memr[j]
85
        mem[i]=memr
86

87
    sum_max_mem = 0
88
    for i in range(k):
89
       sum_max_mem = sum_max_mem+max_mem_x[i] 
90
        
91

92
    #print mem
93
    #print max_mem_x
94
    #print max_mem
95
    #print sum_max_mem
96

97
    I=2**k
98
    S=2**sum_max_mem
99
    O=2**n
100

101
    #print I, S, O
102

103
    NS=[0]*S*I;
104
    OS=[0]*S*I;
105
    for s in range(S):
106
        for i in range(I):
107
            ss=dec2base(s,2,sum_max_mem)
108
            ind=0
109
            ss_r=[]
110
            for kk in range(k):
111
                ss1 = [0]*max_mem
112
                ss1[0:max_mem_x[kk]] = ss[ind:ind+max_mem_x[kk]]
113
                ss_r.append(ss1)
114
                ind=ind+max_mem_x[kk]
115
            ii=dec2base(i,2,k)
116

117
            tt_r = ss_r
118
            for kk in range(k):
119
                tt_r[kk].insert(0,ii[kk])
120
            #print tt_r
121

122
            ns_r = []
123
            for kk in range(k):
124
                ns_r.append(tt_r[kk][0:max_mem])
125

126
            ns=[]
127
            for kk in range(k):
128
                ns = ns + ns_r[kk][0:max_mem_x[kk]]
129
            NS[s*I+i]=base2dec(ns,2);
130

131
            out_r=[0]*n
132
            for nn in range(n):
133
                out=0;
134
                for kk in range(k):
135
                    c=[0]*max_mem
136
                    gm = dec2base(GM[kk][nn],2,max_mem_x[kk]+1)
137
                    gm.reverse()
138
                    c[0:len(gm)] = gm
139
                    sy = 0
140
                    for m in range(len(c)):
141
                        sy = sy + c[m]*tt_r[kk][m];
142
                    out=operator.mod(out+sy,2);
143
                out_r[nn]=out;
144
            out_r.reverse()
145
            OS[s*I+i] = base2dec(out_r,2);
146
    
147
    #O=max(max(OS))+1;
148
    print I, S, O
149
    print NS
150
    print OS
151

152
    return (I,S,O,NS,OS)
153

154

155

156

157

158 63
######################################################################
159 64
# Automatically generate the lookup table that maps the FSM outputs
160 65
# to channel inputs corresponding to a channel 'channel' and a modulation

Also available in: Unified diff