Beispiel #1
0
    def do(self, nb_tx, nb_rx):
        # Set seed
        seed(17121996)

        prod_nb = nb_tx * nb_rx

        # Real channel
        chan = MIMOFlatChannel(nb_tx, nb_rx)
        assert_allclose(chan.k_factor, 0,
                        err_msg='k-factor should be 0 with Rayleigh fading in SISO channels')
        mean = randn(nb_rx, nb_tx)
        mean *= sqrt(prod_nb * 0.75 / einsum('ij,ij->', absolute(mean), absolute(mean)))
        Rs = self.random_SDP_matrix(nb_tx) * sqrt(prod_nb) * 0.5
        Rr = self.random_SDP_matrix(nb_rx) * sqrt(prod_nb) * 0.5
        chan.fading_param = mean, Rs, Rr
        assert_allclose(chan.k_factor, 3,
                        err_msg='Wrong k-factor with rician fading in SISO channels')

        # Complex channel
        chan.fading_param = (zeros((nb_rx, nb_tx), complex), identity(nb_tx), identity(nb_rx))
        assert_allclose(chan.k_factor, 0,
                        err_msg='k-factor should be 0 with Rayleigh fading in SISO channels')
        mean = randn(nb_rx, nb_tx) + 1j * randn(nb_rx, nb_tx)
        mean *= sqrt(prod_nb * 0.75 / einsum('ij,ij->', absolute(mean), absolute(mean)))
        Rs = self.random_SDP_matrix(nb_tx) * sqrt(prod_nb) * 0.5
        Rr = self.random_SDP_matrix(nb_rx) * sqrt(prod_nb) * 0.5
        chan.fading_param = (mean, Rs, Rr)
        assert_allclose(chan.k_factor, 3,
                        err_msg='Wrong k-factor with rician fading in SISO channels')
Beispiel #2
0
    def do(self, nb_tx, nb_rx):
        prod_nb = nb_tx * nb_rx

        # Real channel
        chan = MIMOFlatChannel(nb_tx, nb_rx)
        assert_allclose(chan.k_factor, 0,
                        err_msg='k-factor should be 0 with Rayleigh fading in SISO channels')
        mean = randn(nb_rx, nb_tx)
        mean *= sqrt(prod_nb * 0.75 / einsum('ij,ij->', absolute(mean), absolute(mean)))
        Rs = self.random_SDP_matrix(nb_tx) * sqrt(prod_nb) * 0.5
        Rr = self.random_SDP_matrix(nb_rx) * sqrt(prod_nb) * 0.5
        chan.fading_param = mean, Rs, Rr
        assert_allclose(chan.k_factor, 3,
                        err_msg='Wrong k-factor with rician fading in SISO channels')

        # Complex channel
        chan.fading_param = (zeros((nb_rx, nb_tx), complex), identity(nb_tx), identity(nb_rx))
        assert_allclose(chan.k_factor, 0,
                        err_msg='k-factor should be 0 with Rayleigh fading in SISO channels')
        mean = randn(nb_rx, nb_tx) + 1j * randn(nb_rx, nb_tx)
        mean *= sqrt(prod_nb * 0.75 / einsum('ij,ij->', absolute(mean), absolute(mean)))
        Rs = self.random_SDP_matrix(nb_tx) * sqrt(prod_nb) * 0.5
        Rr = self.random_SDP_matrix(nb_rx) * sqrt(prod_nb) * 0.5
        chan.fading_param = (mean, Rs, Rr)
        assert_allclose(chan.k_factor, 3,
                        err_msg='Wrong k-factor with rician fading in SISO channels')
Beispiel #3
0
    def do(self, nb_tx, nb_rx):
        # Set seed
        seed(17121996)

        def check_chan_gain(mod, chan):
            msg = choice(mod, self.msg_length)
            chan.propagate(msg)

            P_msg = signal_power(msg)
            P_unnoisy = signal_power(chan.unnoisy_output)

            assert_allclose(P_unnoisy, P_msg * chan.nb_tx, rtol=0.2,
                            err_msg='Channel add or remove energy')

        def expo_correlation(t, r):
            # Construct the exponent matrix
            expo_tx = fromiter((j - i for i in range(chan.nb_tx) for j in range(chan.nb_tx)), int, chan.nb_tx ** 2)
            expo_rx = fromiter((j - i for i in range(chan.nb_rx) for j in range(chan.nb_rx)), int, chan.nb_rx ** 2)

            # Reshape
            expo_tx = expo_tx.reshape(chan.nb_tx, chan.nb_tx)
            expo_rx = expo_rx.reshape(chan.nb_rx, chan.nb_rx)

            return t ** expo_tx, r ** expo_rx

        def check_correlation(chan, Rt, Rr):
            nb_ant = chan.nb_tx * chan.nb_rx
            Rdes = kron(Rt, Rr)
            H = chan.channel_gains
            Ract = zeros_like(Rdes)
            for i in range(len(H)):
                Ract += H[i].T.reshape(nb_ant, 1).dot(H[i].T.reshape(1, nb_ant).conj())
            Ract /= len(H)
            assert_allclose(Rdes, Ract, atol=0.05,
                            err_msg='Wrong correlation matrix')

        # Test value checking in constructor construction
        with assert_raises(ValueError):
            MIMOFlatChannel(nb_tx, nb_tx, 0, (ones((nb_tx, nb_tx)), ones((nb_tx, nb_tx)), ones((nb_rx, nb_rx))))

        chan = MIMOFlatChannel(nb_tx, nb_rx, 0)
        prod_nb = nb_tx * nb_rx

        # Test on real channel
        for mod in self.real_mods:
            # Test value checking after construction
            with assert_raises(ValueError):
                chan.fading_param = (ones((nb_tx, nb_tx)), ones((nb_tx, nb_tx)), ones((nb_rx, nb_rx)))

            # Test with Rayleigh fading
            chan.fading_param = (zeros((nb_rx, nb_tx)), identity(nb_tx), identity(nb_rx))
            check_chan_gain(mod, chan)

            # Test with rician fading
            mean = randn(nb_rx, nb_tx)
            mean *= sqrt(prod_nb * 0.75 / einsum('ij,ij->', absolute(mean), absolute(mean)))
            Rt = self.random_SDP_matrix(nb_tx) * sqrt(prod_nb) * 0.5
            Rr = self.random_SDP_matrix(nb_rx) * sqrt(prod_nb) * 0.5
            chan.fading_param = (mean, Rt, Rr)
            check_chan_gain(mod, chan)

            # Test helper functions
            chan.uncorr_rayleigh_fading(float)
            check_chan_gain(mod, chan)
            assert_allclose(chan.k_factor, 0,
                            err_msg='Wrong k-factor with uncorrelated Rayleigh fading')

            mean = randn(nb_rx, nb_tx)
            chan.uncorr_rician_fading(mean, 10)
            check_chan_gain(mod, chan)
            assert_allclose(chan.k_factor, 10,
                            err_msg='Wrong k-factor with uncorrelated rician fading')

        # Test on complex channel
        for mod in self.all_mods:
            # Test value checking after construction
            with assert_raises(ValueError):
                chan.fading_param = (ones((nb_tx, nb_tx)), ones((nb_tx, nb_tx)), ones((nb_rx, nb_rx)))

            # Test with Rayleigh fading
            chan.fading_param = (zeros((nb_rx, nb_tx), complex), identity(nb_tx), identity(nb_rx))
            check_chan_gain(mod, chan)
            assert_allclose(chan.channel_gains.mean(), 0, atol=1e-2,
                            err_msg='Wrong channel mean with complex channel')
            assert_allclose(chan.channel_gains.var(), 1, atol=5e-2,
                            err_msg='Wrong channel variance with complex channel')

            # Test with rician fading
            mean = randn(nb_rx, nb_tx) + 1j * randn(nb_rx, nb_tx)
            mean *= sqrt(prod_nb * 0.75 / einsum('ij,ij->', absolute(mean), absolute(mean)))
            Rt = self.random_SDP_matrix(nb_tx) * sqrt(prod_nb) * 0.5
            Rr = self.random_SDP_matrix(nb_rx) * sqrt(prod_nb) * 0.5
            chan.fading_param = (mean, Rt, Rr)
            check_chan_gain(mod, chan)

            assert_allclose(chan.channel_gains.mean(0).real, mean.real, atol=0.1,
                            err_msg='Wrong channel mean with complex channel')
            assert_allclose(chan.channel_gains.mean(0).imag, mean.imag, atol=0.1,
                            err_msg='Wrong channel mean with complex channel')

            # Test helper functions
            chan.uncorr_rayleigh_fading(complex)
            check_chan_gain(mod, chan)
            assert_allclose(chan.k_factor, 0,
                            err_msg='Wrong k-factor with uncorrelated Rayleigh fading')

            mean = randn(nb_rx, nb_tx) + randn(nb_rx, nb_tx) * 1j
            chan.uncorr_rician_fading(mean, 10)
            check_chan_gain(mod, chan)
            assert_allclose(chan.k_factor, 10,
                            err_msg='Wrong k-factor with uncorrelated rician fading')

            chan.expo_corr_rayleigh_fading(exp(-0.2j * pi), exp(-0.1j * pi))
            check_chan_gain(mod, chan)
            assert_allclose(chan.k_factor, 0,
                            err_msg='Wrong k-factor with correlated Rayleigh fading')
            Rt, Rr = expo_correlation(exp(-0.2j * pi), exp(-0.1j * pi))
            check_correlation(chan, Rt, Rr)

            mean = randn(nb_rx, nb_tx) + randn(nb_rx, nb_tx) * 1j
            chan.expo_corr_rician_fading(mean, 10, exp(-0.1j * pi), exp(-0.2j * pi))
            check_chan_gain(mod, chan)
            assert_allclose(chan.k_factor, 10,
                            err_msg='Wrong k-factor with correlated rician fading')

            # Test with beta > 0
            chan.expo_corr_rayleigh_fading(exp(-0.2j * pi), exp(-0.1j * pi), 1, 0.5)
            check_chan_gain(mod, chan)
            assert_allclose(chan.k_factor, 0,
                            err_msg='Wrong k-factor with correlated Rayleigh fading')

            mean = randn(nb_rx, nb_tx) + randn(nb_rx, nb_tx) * 1j
            chan.expo_corr_rician_fading(mean, 5, exp(-0.1j * pi), exp(-0.2j * pi), 3, 2)
            check_chan_gain(mod, chan)
            assert_allclose(chan.k_factor, 5,
                            err_msg='Wrong k-factor with correlated rician fading')
Beispiel #4
0
    def do(self, nb_tx, nb_rx):
        def check_chan_gain(mod, chan):
            msg = choice(mod, self.msg_length)
            chan.propagate(msg)

            P_msg = signal_power(msg)
            P_unnoisy = signal_power(chan.unnoisy_output)

            assert_allclose(P_unnoisy, P_msg * chan.nb_tx, rtol=0.2,
                            err_msg='Channel add or remove energy')

        # Test value checking in constructor construction
        with assert_raises(ValueError):
            MIMOFlatChannel(nb_tx, nb_tx, 0, (ones((nb_tx, nb_tx)), ones((nb_tx, nb_tx)), ones((nb_rx, nb_rx))))

        chan = MIMOFlatChannel(nb_tx, nb_rx, 0)
        prod_nb = nb_tx * nb_rx

        # Test on real channel
        for mod in self.real_mods:
            # Test value checking after construction
            with assert_raises(ValueError):
                chan.fading_param = (ones((nb_tx, nb_tx)), ones((nb_tx, nb_tx)), ones((nb_rx, nb_rx)))

            # Test with Rayleigh fading
            chan.fading_param = (zeros((nb_rx, nb_tx)), identity(nb_tx), identity(nb_rx))
            check_chan_gain(mod, chan)
            assert_allclose(chan.channel_gains.mean(), 0, atol=1e-2,
                            err_msg='Wrong channel mean with real channel')
            assert_allclose(chan.channel_gains.var(), 1, atol=5e-2,
                            err_msg='Wrong channel variance with real channel')

            # Test with rician fading
            mean = randn(nb_rx, nb_tx)
            mean *= sqrt(prod_nb * 0.75 / einsum('ij,ij->', absolute(mean), absolute(mean)))
            Rs = self.random_SDP_matrix(nb_tx) * sqrt(prod_nb) * 0.5
            Rr = self.random_SDP_matrix(nb_rx) * sqrt(prod_nb) * 0.5
            chan.fading_param = (mean, Rs, Rr)
            check_chan_gain(mod, chan)

            assert_allclose(chan.channel_gains.mean(0), mean, atol=0.2,
                            err_msg='Wrong channel mean with real channel')

        # Test on all channel
        for mod in self.all_mods:
            # Test value checking after construction
            with assert_raises(ValueError):
                chan.fading_param = (ones((nb_tx, nb_tx)), ones((nb_tx, nb_tx)), ones((nb_rx, nb_rx)))

            # Test with Rayleigh fading
            chan.fading_param = (zeros((nb_rx, nb_tx), complex), identity(nb_tx), identity(nb_rx))
            check_chan_gain(mod, chan)
            assert_allclose(chan.channel_gains.mean(), 0, atol=1e-2,
                            err_msg='Wrong channel mean with complex channel')
            assert_allclose(chan.channel_gains.var(), 1, atol=5e-2,
                            err_msg='Wrong channel variance with complex channel')

            # Test with rician fading
            mean = randn(nb_rx, nb_tx) + 1j * randn(nb_rx, nb_tx)
            mean *= sqrt(prod_nb * 0.75 / einsum('ij,ij->', absolute(mean), absolute(mean)))
            Rs = self.random_SDP_matrix(nb_tx) * sqrt(prod_nb) * 0.5
            Rr = self.random_SDP_matrix(nb_rx) * sqrt(prod_nb) * 0.5
            chan.fading_param = (mean, Rs, Rr)
            check_chan_gain(mod, chan)

            assert_allclose(chan.channel_gains.mean(0).real, mean.real, atol=0.1,
                            err_msg='Wrong channel mean with complex channel')
            assert_allclose(chan.channel_gains.mean(0).imag, mean.imag, atol=0.1,
                            err_msg='Wrong channel mean with complex channel')