|
|
import numpy
|
|
|
import scipy.signal
|
|
|
import matplotlib
|
|
|
matplotlib.use("TKAgg")
|
|
|
import pylab as pl
|
|
|
|
|
|
import time
|
|
|
|
|
|
def getInverseFilter(code, lenfilter=8*28):
|
|
|
|
|
|
nBauds = len(code)
|
|
|
|
|
|
if lenfilter == None:
|
|
|
lenfilter = 10*nBauds
|
|
|
|
|
|
codeBuffer = numpy.zeros((lenfilter), dtype=numpy.float32)
|
|
|
codeBuffer[0:nBauds] = code
|
|
|
|
|
|
inverse_filter = numpy.real(numpy.fft.ifft(1.0/numpy.fft.fft(codeBuffer)))
|
|
|
inverse_filter = numpy.roll(inverse_filter, shift=120)
|
|
|
|
|
|
# pl.plot(codeBuffer)
|
|
|
# pl.plot(inverse_filter)
|
|
|
# pl.show()
|
|
|
|
|
|
return inverse_filter
|
|
|
|
|
|
def getSignal(nChannels, nHeis):
|
|
|
|
|
|
u = numpy.complex(1,2)
|
|
|
u /= numpy.abs(u)
|
|
|
|
|
|
signal = numpy.random.rand(nChannels, nHeis)
|
|
|
signal = signal.astype(numpy.complex)
|
|
|
|
|
|
signal *= u
|
|
|
|
|
|
return signal
|
|
|
|
|
|
def time_decoding(signal, code):
|
|
|
|
|
|
ini = time.time()
|
|
|
|
|
|
nBauds = len(code)
|
|
|
nChannels, nHeis = signal.shape
|
|
|
datadec = numpy.zeros((nChannels, nHeis - nBauds + 1), dtype=numpy.complex)
|
|
|
|
|
|
tmpcode = code.astype(numpy.complex)
|
|
|
#######################################
|
|
|
ini = time.time()
|
|
|
|
|
|
for i in range(nChannels):
|
|
|
datadec[i,:] = numpy.correlate(signal[i,:], code, mode='valid')/nBauds
|
|
|
|
|
|
print time.time() - ini
|
|
|
|
|
|
return datadec
|
|
|
|
|
|
def freq_decoding(signal, code):
|
|
|
|
|
|
ini = time.time()
|
|
|
|
|
|
nBauds = len(code)
|
|
|
nChannels, nHeis = signal.shape
|
|
|
|
|
|
codeBuffer = numpy.zeros((nHeis), dtype=numpy.float32)
|
|
|
|
|
|
codeBuffer[0:nBauds] = code
|
|
|
|
|
|
fft_code = numpy.conj(numpy.fft.fft(codeBuffer)).reshape(1, -1)
|
|
|
|
|
|
######################################
|
|
|
ini = time.time()
|
|
|
|
|
|
fft_data = numpy.fft.fft(signal, axis=1)
|
|
|
|
|
|
conv = fft_data*fft_code
|
|
|
|
|
|
data = numpy.fft.ifft(conv, axis=1)/nBauds
|
|
|
|
|
|
datadec = data[:,:-nBauds+1]
|
|
|
|
|
|
print time.time() - ini
|
|
|
|
|
|
return datadec
|
|
|
|
|
|
def fftconvol_decoding(signal, code):
|
|
|
|
|
|
ini = time.time()
|
|
|
|
|
|
nBauds = len(code)
|
|
|
nChannels, nHeis = signal.shape
|
|
|
datadec = numpy.zeros((nChannels, nHeis - nBauds + 1), dtype=numpy.complex)
|
|
|
|
|
|
tmpcode = code.astype(numpy.complex)
|
|
|
#######################################
|
|
|
ini = time.time()
|
|
|
|
|
|
for i in range(nChannels):
|
|
|
datadec[i,:] = scipy.signal.fftconvolve(signal[i,:], code[-1::-1], mode='valid')/nBauds
|
|
|
|
|
|
print time.time() - ini
|
|
|
|
|
|
return datadec
|
|
|
|
|
|
def filter_decoding(signal, code):
|
|
|
|
|
|
ini = time.time()
|
|
|
|
|
|
nBauds = len(code)
|
|
|
nChannels, nHeis = signal.shape
|
|
|
|
|
|
inverse_filter = getInverseFilter(code)
|
|
|
|
|
|
datadec = numpy.zeros((nChannels, nHeis + len(inverse_filter) - 1), dtype=numpy.complex)
|
|
|
#######################################
|
|
|
ini = time.time()
|
|
|
|
|
|
for i in range(nChannels):
|
|
|
datadec[i,:] = numpy.convolve(signal[i,:], inverse_filter, mode='full')
|
|
|
|
|
|
datadec = datadec[:,120:120+nHeis]
|
|
|
|
|
|
print time.time() - ini
|
|
|
|
|
|
return datadec
|
|
|
|
|
|
nChannels, nHeis = 8, 3900
|
|
|
index = 300
|
|
|
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])
|
|
|
signal = getSignal(nChannels, nHeis)
|
|
|
signal[0,index:index+len(code)] = code*10
|
|
|
|
|
|
signalout = time_decoding(signal, code)
|
|
|
signalout1 = freq_decoding(signal, code)
|
|
|
signalout2 = fftconvol_decoding(signal, code)
|
|
|
signalout3 = filter_decoding(signal, code)
|
|
|
|
|
|
#pl.plot(numpy.abs(signal[0]))
|
|
|
pl.plot(numpy.abs(signalout[0]))
|
|
|
#pl.plot(numpy.abs(signalout1[0]))
|
|
|
#pl.plot(numpy.abs(signalout2[0]))
|
|
|
pl.plot(numpy.abs(signalout3[0])+0.5)
|
|
|
pl.show()
|
|
|
|
|
|
|