@@ -0,0 +1,146 | |||||
|
1 | import numpy | |||
|
2 | import scipy.signal | |||
|
3 | import matplotlib | |||
|
4 | matplotlib.use("TKAgg") | |||
|
5 | import pylab as pl | |||
|
6 | ||||
|
7 | import time | |||
|
8 | ||||
|
9 | def getInverseFilter(code, lenfilter=None): | |||
|
10 | ||||
|
11 | nBauds = len(code) | |||
|
12 | ||||
|
13 | if lenfilter == None: | |||
|
14 | lenfilter = 10*nBauds | |||
|
15 | ||||
|
16 | codeBuffer = numpy.zeros((lenfilter), dtype=numpy.float32) | |||
|
17 | codeBuffer[0:nBauds] = code | |||
|
18 | ||||
|
19 | inverse_filter = numpy.real(numpy.fft.ifft(1.0/numpy.fft.fft(codeBuffer))) | |||
|
20 | inverse_filter = numpy.roll(inverse_filter, shift=120) | |||
|
21 | ||||
|
22 | # pl.plot(codeBuffer) | |||
|
23 | # pl.plot(inverse_filter) | |||
|
24 | # pl.show() | |||
|
25 | ||||
|
26 | return inverse_filter | |||
|
27 | ||||
|
28 | def getSignal(nChannels, nHeis): | |||
|
29 | ||||
|
30 | u = numpy.complex(1,2) | |||
|
31 | u /= numpy.abs(u) | |||
|
32 | ||||
|
33 | signal = numpy.random.rand(nChannels, nHeis) | |||
|
34 | signal = signal.astype(numpy.complex) | |||
|
35 | ||||
|
36 | signal *= u | |||
|
37 | ||||
|
38 | return signal | |||
|
39 | ||||
|
40 | def time_decoding(signal, code): | |||
|
41 | ||||
|
42 | ini = time.time() | |||
|
43 | ||||
|
44 | nBauds = len(code) | |||
|
45 | nChannels, nHeis = signal.shape | |||
|
46 | datadec = numpy.zeros((nChannels, nHeis - nBauds + 1), dtype=numpy.complex) | |||
|
47 | ||||
|
48 | tmpcode = code.astype(numpy.complex) | |||
|
49 | ####################################### | |||
|
50 | ini = time.time() | |||
|
51 | ||||
|
52 | for i in range(nChannels): | |||
|
53 | datadec[i,:] = numpy.correlate(signal[i,:], code, mode='valid')/nBauds | |||
|
54 | ||||
|
55 | print time.time() - ini | |||
|
56 | ||||
|
57 | return datadec | |||
|
58 | ||||
|
59 | def freq_decoding(signal, code): | |||
|
60 | ||||
|
61 | ini = time.time() | |||
|
62 | ||||
|
63 | nBauds = len(code) | |||
|
64 | nChannels, nHeis = signal.shape | |||
|
65 | ||||
|
66 | codeBuffer = numpy.zeros((nHeis), dtype=numpy.float32) | |||
|
67 | ||||
|
68 | codeBuffer[0:nBauds] = code | |||
|
69 | ||||
|
70 | fft_code = numpy.conj(numpy.fft.fft(codeBuffer)).reshape(1, -1) | |||
|
71 | ||||
|
72 | ###################################### | |||
|
73 | ini = time.time() | |||
|
74 | ||||
|
75 | fft_data = numpy.fft.fft(signal, axis=1) | |||
|
76 | ||||
|
77 | conv = fft_data*fft_code | |||
|
78 | ||||
|
79 | data = numpy.fft.ifft(conv, axis=1)/nBauds | |||
|
80 | ||||
|
81 | datadec = data[:,:-nBauds+1] | |||
|
82 | ||||
|
83 | print time.time() - ini | |||
|
84 | ||||
|
85 | return datadec | |||
|
86 | ||||
|
87 | def fftconvol_decoding(signal, code): | |||
|
88 | ||||
|
89 | ini = time.time() | |||
|
90 | ||||
|
91 | nBauds = len(code) | |||
|
92 | nChannels, nHeis = signal.shape | |||
|
93 | datadec = numpy.zeros((nChannels, nHeis - nBauds + 1), dtype=numpy.complex) | |||
|
94 | ||||
|
95 | tmpcode = code.astype(numpy.complex) | |||
|
96 | ####################################### | |||
|
97 | ini = time.time() | |||
|
98 | ||||
|
99 | for i in range(nChannels): | |||
|
100 | datadec[i,:] = scipy.signal.fftconvolve(signal[i,:], code[-1::-1], mode='valid')/nBauds | |||
|
101 | ||||
|
102 | print time.time() - ini | |||
|
103 | ||||
|
104 | return datadec | |||
|
105 | ||||
|
106 | def filter_decoding(signal, code): | |||
|
107 | ||||
|
108 | ini = time.time() | |||
|
109 | ||||
|
110 | nBauds = len(code) | |||
|
111 | nChannels, nHeis = signal.shape | |||
|
112 | ||||
|
113 | inverse_filter = getInverseFilter(code) | |||
|
114 | ||||
|
115 | datadec = numpy.zeros((nChannels, nHeis + len(inverse_filter) - 1), dtype=numpy.complex) | |||
|
116 | ####################################### | |||
|
117 | ini = time.time() | |||
|
118 | ||||
|
119 | for i in range(nChannels): | |||
|
120 | datadec[i,:] = numpy.convolve(signal[i,:], inverse_filter, mode='full') | |||
|
121 | ||||
|
122 | datadec = datadec[:,120:120+nHeis] | |||
|
123 | ||||
|
124 | print time.time() - ini | |||
|
125 | ||||
|
126 | return datadec | |||
|
127 | ||||
|
128 | nChannels, nHeis = 8, 3900 | |||
|
129 | index = 300 | |||
|
130 | code = numpy.array([1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1, 1, -1, -1, 1, -1]) | |||
|
131 | signal = getSignal(nChannels, nHeis) | |||
|
132 | signal[0,index:index+len(code)] = code*10 | |||
|
133 | ||||
|
134 | signalout = time_decoding(signal, code) | |||
|
135 | signalout1 = freq_decoding(signal, code) | |||
|
136 | signalout2 = fftconvol_decoding(signal, code) | |||
|
137 | signalout3 = filter_decoding(signal, code) | |||
|
138 | ||||
|
139 | #pl.plot(numpy.abs(signal[0])) | |||
|
140 | pl.plot(numpy.abs(signalout[0])) | |||
|
141 | #pl.plot(numpy.abs(signalout1[0])) | |||
|
142 | #pl.plot(numpy.abs(signalout2[0])) | |||
|
143 | pl.plot(numpy.abs(signalout3[0])+1.0) | |||
|
144 | pl.show() | |||
|
145 | ||||
|
146 | No newline at end of file |
General Comments 0
You need to be logged in to leave comments.
Login now