Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MIMO Channel Estimation #29

Open
wants to merge 22 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
9a617cf
VBLAST: Add encoder block and QA test.
MLsmd Jun 7, 2018
94b4268
VBLAST: Init decoder block.
MLsmd Jun 11, 2018
3c566a9
VBLAST: Add precalculated ZF equalizer for 2x2 MIMO scheme.
MLsmd Jun 13, 2018
a6db048
VBLAST: Add precalculated MMSE equalizer for 2x2 MIMO scheme.
MLsmd Jun 18, 2018
01ed484
VBLAST: Add qa test for 2x2 MMSE case.
MLsmd Jun 19, 2018
64dba72
VBLAST: Add MxM ZF case with Eigen inverse calculation and qa test.
MLsmd Jun 19, 2018
d5f6179
VBLAST: Add ZF and MMSE equalizer for MIMO 1x1 scheme (SISO case).
MLsmd Jun 19, 2018
d6339ee
VBLAST: Wrap up qa test for decoder.
MLsmd Jun 19, 2018
4a127c0
VBLAST: Add MxM MMSE case with Eigen pseudo-inverse calculation.
MLsmd Jun 20, 2018
896870a
VBLAST: Add loopback test for ZF and MMSE.
MLsmd Jun 20, 2018
6d1fba3
VBLAST: Wrap up code and doxygen docu.
MLsmd Jun 20, 2018
5e0328f
VBLAST: Add xml files for GRC.
MLsmd Jun 20, 2018
a4d1e21
VBLAST: Find package Eigen3 in CMake and replace Eigen code with runt…
MLsmd Jun 21, 2018
25d6184
mimo_channel_est: Init channel estimation C++ block with precalculate…
MLsmd Jun 27, 2018
e8995e6
mimo_channel_est: Expand estimation to a general MxN MIMO scheme, usi…
MLsmd Jul 2, 2018
1b2f71b
mimo_channel_est: Add python qa test for 2x2 scheme.
MLsmd Jul 3, 2018
25a6cc3
mimo_channel_est: Generalize 1x1 and 2x2 MIMO scheme to 1xN and 2xN.
MLsmd Jul 3, 2018
482e5e4
mimo_channel_est: Wrap up QA test.
MLsmd Jul 3, 2018
6b4cf64
mimo_channel_est: Avoid extension of training sequence over multiple …
MLsmd Jul 10, 2018
05f4083
mimo_channel_est: Insert head block in qa test to avoid infinite work…
MLsmd Jul 10, 2018
37a3a63
mimo_channel_est: Wrap up and docu.
MLsmd Jul 11, 2018
69ee3e0
mimo_channel_est: Change data type of training_sequence from uint16_t…
MLsmd Aug 8, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions gr-digital/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,17 @@ SET(GR_PKG_DIGITAL_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/digital)
########################################################################
if(ENABLE_GR_DIGITAL)

########################################################################
# Find package Eigen3 (for optional MIMO features)
########################################################################
find_package(Eigen3)
add_definitions(-DEIGEN3_ENABLED=${Eigen3_FOUND})
if(Eigen3_FOUND)
message([STATUS] "Eigen3 found.")
else()
message([STATUS] "Eigen3 not found. Eigen3 is required for MxM MIMO schemes with M>2.")
endif(Eigen3_FOUND)

########################################################################
# Setup CPack components
########################################################################
Expand Down
32 changes: 32 additions & 0 deletions gr-digital/grc/digital_mimo_channel_estimator_cc.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<block>
<name>MIMO Channel estimator</name>
<key>digital_mimo_channel_estimator_cc</key>
<category>[MIMO]</category>
<import>from gnuraido import digital</import>
<make>digital.mimo_channel_estimator_cc($M, $N, $training_sequence)</make>
<param>
<name>M</name>
<key>M</key>
<type>int</type>
</param>
<param>
<name>N</name>
<key>N</key>
<type>int</type>
</param>
<param>
<name>Training Sequence</name>
<key>training_sequence</key>
<type>raw</type>
</param>
<sink>
<name>in</name>
<type>complex</type>
<nports>N</nports>
</sink>
<source>
<name>out</name>
<type>complex</type>
<nports>N</nports>
</source>
</block>
36 changes: 36 additions & 0 deletions gr-digital/grc/digital_vblast_decoder_cc.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<block>
<name>V-BLAST Decoder</name>
<key>digital_vblast_decoder_cc</key>
<category>[MIMO]</category>
<import>from gnuradio import digital</import>
<make>digital.vblast_decoder_cc($num_inputs, $equalizer_type)</make>
<param>
<name>Number of Inputs</name>
<key>num_inputs</key>
<value>2</value>
<type>int</type>
</param>
<param>
<name>Equalizer Type</name>
<key>equalizer_type</key>
<value>"ZF"</value>
<type>string</type>
<option>
<name>Zero Forcing</name>
<key>"ZF"</key>
</option>
<option>
<name>Minimum Mean Squared Error</name>
<key>"MMSE"</key>
</option>
</param>
<sink>
<name>in</name>
<type>complex</type>
<nports>$num_inputs</nports>
</sink>
<source>
<name>out</name>
<type>complex</type>
</source>
</block>
22 changes: 22 additions & 0 deletions gr-digital/grc/digital_vblast_encoder_cc.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<block>
<name>V-BLAST Encoder</name>
<key>digital_vblast_encoder_cc</key>
<category>[MIMO]</category>
<import>from gnuradio import digital</import>
<make>digital.vblast_encoder_cc($num_outputs)</make>
<param>
<name>Number of Outputs</name>
<key>num_outputs</key>
<value>2</value>
<type>int</type>
</param>
<sink>
<name>in</name>
<type>complex</type>
</sink>
<source>
<name>out</name>
<type>complex</type>
<nports>$num_outputs</nports>
</source>
</block>
5 changes: 4 additions & 1 deletion gr-digital/include/gnuradio/digital/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,9 @@ install(FILES
header_payload_demux.h
alamouti_encoder_cc.h
alamouti_decoder_cc.h
diversity_combiner_cc.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/digital
diversity_combiner_cc.h
vblast_encoder_cc.h
vblast_decoder_cc.h
mimo_channel_estimator_cc.h DESTINATION ${GR_INCLUDE_DIR}/gnuradio/digital
COMPONENT "digital_devel"
)
73 changes: 73 additions & 0 deletions gr-digital/include/gnuradio/digital/mimo_channel_estimator_cc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/* -*- c++ -*- */
/*
* Copyright 2018 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* GNU Radio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU Radio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/


#ifndef INCLUDED_DIGITAL_MIMO_CHANNEL_ESTIMATOR_CC_H
#define INCLUDED_DIGITAL_MIMO_CHANNEL_ESTIMATOR_CC_H

#include <gnuradio/digital/api.h>
#include <gnuradio/block.h>

namespace gr {
namespace digital {

/*! \brief Estimates a MIMO channel matrix.
*
* The block estimates the channel matrix of a MIMO scheme with the help of
* training sequences. The training sequence for each transmitting antenna
* equals one subvector/row of the 2-dimensional vector training_sequence.
* The training sequence should be appended as a pilot to the data at the transmitter.
* The beginning of the pilot must be tagged at the receiver with the key 'pilot'.
* This tag can be set from a preceding sync block, for example.
*
* This block has N inports and N outports. It estimates the channel matrix which each incoming
* 'pilot' tag, dumps the pilot symbol of each stream and passes the rest of the data through without
* changing anything. A tag is set at the beginning of each symbol (= a data sequence between to training sequences)
* with the key 'csi' that contains the estimated MxN channel matrix.
*
* For 1xN and 2xN MIMO schemes, the equalizer is calculated internally. For MxN schemes with M > 2,
* the C++ template library Eigen is used for the linear algebra operations
* and is a requirement in this case.
* The training_length is not bounded above, but the minimum length is M
* (to avoid an underdetermined equation system).
*/
class DIGITAL_API mimo_channel_estimator_cc : virtual public gr::block
{
public:
typedef boost::shared_ptr<mimo_channel_estimator_cc> sptr;

/*!
* \brief Return a shared_ptr to a new instance of digital::mimo_channel_estimator_cc.
*
* To avoid accidental use of raw pointers, digital::mimo_channel_estimator_cc's
* constructor is in a private implementation
* class. digital::mimo_channel_estimator_cc::make is the public interface for
* creating new instances.
*/
static sptr make(uint16_t M, uint16_t N, std::vector<std::vector<gr_complex> > training_sequence);
};

} // namespace digital
} // namespace gr

#endif /* INCLUDED_DIGITAL_MIMO_CHANNEL_ESTIMATOR_CC_H */

68 changes: 68 additions & 0 deletions gr-digital/include/gnuradio/digital/vblast_decoder_cc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/* -*- c++ -*- */
/*
* Copyright 2018 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* GNU Radio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU Radio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/


#ifndef INCLUDED_DIGITAL_VBLAST_DECODER_CC_H
#define INCLUDED_DIGITAL_VBLAST_DECODER_CC_H

#include <gnuradio/digital/api.h>
#include <gnuradio/sync_interpolator.h>

namespace gr {
namespace digital {

/*! \brief VBLAST decoder.
* Decodes incoming MxM MIMO data by equalizing the received signals in order to extract the
* M different transmission signals. For the equalization, you can choose between a
* zero forcing (key='ZF') and a minimum mean squared error (key='MMSE') scheme. Both schemes require
* channel state information and MMSE additionally needs SNR information.
*
* The CSI and SNR information is transported via stream tags with key='csi' or 'snr', respectively.
* Initially the CSI is set to 1.0 + 0j for both branches and are updated
* with each incoming CSI. The SNR is initially set to 1.0e6; in this case is the MMSE equalizer equal
* to the ZF equalizer. The CSI and SNR tags are processed separately and they can therefore arrive
* at different positions of the stream and occur in different frequencies.
*
* For 1x1 and 2x2 MIMO schemes, the equalizer is calculated internally. For MxM schemes with M > 2,
* the C++ template library Eigen is used for the linear algebra operations.
*/
class DIGITAL_API vblast_decoder_cc : virtual public gr::sync_interpolator
{
public:
typedef boost::shared_ptr<vblast_decoder_cc> sptr;

/*!
* \brief Return a shared_ptr to a new instance of digital::vblast_decoder_cc.
*
* To avoid accidental use of raw pointers, digital::vblast_decoder_cc's
* constructor is in a private implementation
* class. digital::vblast_decoder_cc::make is the public interface for
* creating new instances.
*/
static sptr make(uint16_t num_inputs, std::string equalizer_type);
};

} // namespace digital
} // namespace gr

#endif /* INCLUDED_DIGITAL_VBLAST_DECODER_CC_H */

58 changes: 58 additions & 0 deletions gr-digital/include/gnuradio/digital/vblast_encoder_cc.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/* -*- c++ -*- */
/*
* Copyright 2018 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* GNU Radio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU Radio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/


#ifndef INCLUDED_DIGITAL_VBLAST_ENCODER_CC_H
#define INCLUDED_DIGITAL_VBLAST_ENCODER_CC_H

#include <gnuradio/digital/api.h>
#include <gnuradio/sync_decimator.h>

namespace gr {
namespace digital {

/*! \brief VBLAST encoder.
* Encodes a serial input data stream into a vertical transmission vector
* which is transmitted at once over multiple antennas.
* The functionality equals a multiplexing of the data.
*/
class DIGITAL_API vblast_encoder_cc : virtual public gr::sync_decimator
{
public:
typedef boost::shared_ptr<vblast_encoder_cc> sptr;

/*!
* \brief Return a shared_ptr to a new instance of digital::vblast_encoder_cc.
*
* To avoid accidental use of raw pointers, digital::vblast_encoder_cc's
* constructor is in a private implementation
* class. digital::vblast_encoder_cc::make is the public interface for
* creating new instances.
*/
static sptr make(uint16_t num_outputs);
};

} // namespace digital
} // namespace gr

#endif /* INCLUDED_DIGITAL_VBLAST_ENCODER_CC_H */

3 changes: 3 additions & 0 deletions gr-digital/lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,9 @@ list(APPEND digital_sources
alamouti_encoder_cc_impl.cc
alamouti_decoder_cc_impl.cc
diversity_combiner_cc_impl.cc
vblast_encoder_cc_impl.cc
vblast_decoder_cc_impl.cc
mimo_channel_estimator_cc_impl.cc
)

#Add Windows DLL resource file if using MSVC
Expand Down
Loading