连载:有限状态机以及维特比(Viterbi)译码器(二)

上一节,我们实现了一个通用的有限状态机编码器及维特比译码器。这一节,实现两种卷积码(前向、反馈)的状态机初始化类。

前向码需要一组参数,分别是 n,k,m ,还有具体的管脚描述。

管脚描述采用Matlab的八进制格式。

前向卷积码, front_conv_lsmaker.h

/** \brief 本文件实现了前向卷积码的状态机回调函数
 */
#if !defined (FRONT_CONV_LSMAKER_HEADER_VER)
#define  FRONT_CONV_LSMAKER_HEADER_VER 101
namespace LSMVIT
{
    /** \brief 前向卷积码有限状态机生成器
     */
	template 
	class fconv_lsmaker{
	protected:
		int OutPin[n][k][m+1];
	public:
		fconv_lsmaker(const int octPins[/*k*/][n])
		{
			init_Pins(octPins);
		}
		fconv_lsmaker(){}
		~fconv_lsmaker(){}

        /** \brief 根据抽头初始化本类对象
         *
         * \param octPins[k][n] int 抽头,分别是第k组寄存器对第n个输出管脚的影响
         * \return void
         *
         */
		void init_Pins(const int octPins[/*k*/][n])
		{
			for (int i=0;i>(m-v)) & 0x01;
				}// end j
			}// end i
		}
	public:

        /** \brief 回调函数,会递交给状态机
         */
		bool cb_status (int reg, int data, int *pNextReg, int * pOutput)
		{
			if (pNextReg == nullptr || pOutput == nullptr) return false;
			int nOutput[n], nReg[k][m+1];
			for (int i = 0; i< k ; i++)
			{
				nReg[i][0] = (data >> (k-i-1)) & 0x01;
				for (int j = 0;j>((k-i-1)*m + (m-1-j))) & 0x01;

			}// end i
			for (int i=0;i


反馈码除了上述参数,还需要反馈管脚描述。

反馈卷积码 feedback_conv_lsmaker.h

/** \brief 本文件实现了反馈卷积码的状态机回调函数
 */
#if !defined (FEEDBACK_CONV_LSMAKER_HEADER_VER)
#define  FEEDBACK_CONV_LSMAKER_HEADER_VER 101
namespace LSMVIT
{
    /** \brief 反馈卷积码有限状态机生成器
     */
	template 
	class feedback_lsmaker{
	protected:
		int OutPin[n][k][m+1];
		int FeedBackPin[k][k][m+1];
	public:
		feedback_lsmaker(const int octPins[/*k*/][n],const int fbPins[/*k*/][k])
		{
			init_Pins(octPins,fbPins);
		}
		feedback_lsmaker(){}
		~feedback_lsmaker(){}

        /** \brief 根据抽头初始化本类对象
         *
         * \param octPins[k][n] int 抽头,分别是第k组寄存器对第n个输出管脚的影响
         * \param fbPins[k][k] int 反馈抽头,分别是第k组寄存器对第k个输入管脚的影响
         * \return void
         *
         */
		void init_Pins(const int octPins[/*k*/][n],const int fbPins[/*k*/][k])
		{
			for (int i=0;i>(m-v)) & 0x01;
				}// end j
			}// end i
            		for (int i=0;i>(m-v)) & 0x01;
				}// end j
			}// end i
        }
	public:

        /** \brief 回调函数,会递交给状态机
         */
		bool cb_status (int reg, int data, int *pNextReg, int * pOutput)
		{
			if (pNextReg == nullptr || pOutput == nullptr) return false;
			int nOutput[n], nReg[k][m+1];
			for (int i = 0; i< k ; i++)
			{
				nReg[i][0] = (data >> (k-i-1)) & 0x01;
				for (int j = 0;j>((k-i-1)*m + (m-1-j))) & 0x01;
			}// end i
			//反馈
			for (int i=0;i


 

下一节,我们用一个简单的控制台程序测试成果

你可能感兴趣的:(C++,现代C/C++工具链)