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