diff options
Diffstat (limited to 'gr-fec/lib/ldpc_H_matrix_impl.h')
-rw-r--r-- | gr-fec/lib/ldpc_H_matrix_impl.h | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/gr-fec/lib/ldpc_H_matrix_impl.h b/gr-fec/lib/ldpc_H_matrix_impl.h new file mode 100644 index 0000000000..67929a82a3 --- /dev/null +++ b/gr-fec/lib/ldpc_H_matrix_impl.h @@ -0,0 +1,128 @@ +/* -*- c++ -*- */ +/* + * Copyright 2015 Free Software Foundation, Inc. + * + * This 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. + * + * This software 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 this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_ldpc_H_matrix_impl_H +#define INCLUDED_ldpc_H_matrix_impl_H + +#include "fec_mtrx_impl.h" +#include <gnuradio/fec/ldpc_H_matrix.h> +#include <gnuradio/fec/ldpc_G_matrix.h> + +namespace gr { + namespace fec { + namespace code { + + class ldpc_H_matrix_impl + : public fec_mtrx_impl, public ldpc_H_matrix + { + private: + // Gap (assumes matrix is in TABECD form) + unsigned int d_gap; + + // Submatrices found during preprocessing, used for encoding + gsl_matrix_view d_A_view; + gsl_matrix_view d_B_view; + gsl_matrix_view d_D_view; + gsl_matrix_view d_E_view; + gsl_matrix_view d_T_view; + gsl_matrix *d_phi_inverse_ptr; + + // Temporary matrix for storing stages of encoding. + gsl_matrix *d_s, *d_p1, *d_p2; + gsl_matrix *d_temp1, *d_temp2, *d_temp3, *d_temp4, *d_temp5, *d_temp6, *d_temp7; + + //! Sets the submatrix variables needed for encoding + void set_parameters_for_encoding(); + + void back_solve_mod2(gsl_matrix *result, + const gsl_matrix *U, + const gsl_matrix *y) const; + + //! Access the A submatrix, needed during encoding + const gsl_matrix *A() const; + + //! Access the B submatrix, needed during encoding + const gsl_matrix *B() const; + + //! Access the D submatrix, needed during encoding + const gsl_matrix *D() const; + + //! Access the E submatrix, needed during encoding + const gsl_matrix *E() const; + + //! Access the T submatrix, needed during encoding + const gsl_matrix *T() const; + + /*! + * \brief Access the \f$\phi^{-1}\f$ matrix + * \details + * Access the matrix \f$\phi^{-1}\f$, which is needed during + * encoding. \f$\phi\f$ is defined as: + * \f$\phi=C-ET^{-1}A\f$. + */ + const gsl_matrix *phi_inverse() const; + + gr::fec::code::fec_mtrx *d_base_ptr; + + public: + /*! + * \brief Constructor given alist file and gap + * \param filename Name of an alist file to use. The alist + * format is described at: + * http://www.inference.phy.cam.ac.uk/mackay/codes/alist.html + * \param gap A property of the matrix being used. For alist + * files distributed with GNU Radio, this value + * is specified in the alist filename. The gap is + * found during the matrix preprocessing + * algorithm. It is equal to the number of rows in + * submatrices E, C and D. + */ + ldpc_H_matrix_impl(const std::string filename, unsigned int gap); + + //! Encode \p inbuffer with LDPC H matrix into \p outbuffer. + void encode(unsigned char *outbuffer, + const unsigned char *inbuffer) const; + + //! Decode \p inbuffer with LDPC H matrix into \p outbuffer. + void decode(unsigned char *outbuffer, + const float *inbuffer, + unsigned int frame_size, + unsigned int max_iterations) const; + + //! Redefine these here as part of the public interface + unsigned int n() const { return fec_mtrx_impl::n(); }; + + //! Redefine these here as part of the public interface + unsigned int k() const { return fec_mtrx_impl::k(); }; + + /*! + * \brief Destructor + * \details + * Calls the gsl_matrix_free function to free memory + */ + virtual ~ldpc_H_matrix_impl(); + + gr::fec::code::fec_mtrx *get_base_ptr(); + }; + } + } +} + +#endif /* INCLUDED_ldpc_H_matrix_impl_H */ |