openofdm/scripts/commpy/channelcoding/interleavers.py
2017-04-03 12:52:21 -04:00

85 lines
1.9 KiB
Python

# Authors: Veeresh Taranalli <veeresht@gmail.com>
# License: BSD 3-Clause
""" Interleavers and De-interleavers """
from numpy import array, arange, zeros
from numpy.random import mtrand
__all__ = ['RandInterlv']
class _Interleaver:
def interlv(self, in_array):
""" Interleave input array using the specific interleaver.
Parameters
----------
in_array : 1D ndarray of ints
Input data to be interleaved.
Returns
-------
out_array : 1D ndarray of ints
Interleaved output data.
"""
out_array = array(map(lambda x: in_array[x], self.p_array))
return out_array
def deinterlv(self, in_array):
""" De-interleave input array using the specific interleaver.
Parameters
----------
in_array : 1D ndarray of ints
Input data to be de-interleaved.
Returns
-------
out_array : 1D ndarray of ints
De-interleaved output data.
"""
out_array = zeros(len(in_array), in_array.dtype)
for index, element in enumerate(self.p_array):
out_array[element] = in_array[index]
return out_array
class RandInterlv(_Interleaver):
""" Random Interleaver.
Parameters
----------
length : int
Length of the interleaver.
seed : int
Seed to initialize the random number generator
which generates the random permutation for
interleaving.
Returns
-------
random_interleaver : RandInterlv object
A random interleaver object.
Note
----
The random number generator is the
RandomState object from NumPy,
which uses the Mersenne Twister algorithm.
"""
def __init__(self, length, seed):
rand_gen = mtrand.RandomState(seed)
self.p_array = rand_gen.permutation(arange(length))
#class SRandInterlv(_Interleaver):
#class QPPInterlv(_Interleaver):