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

来源:互联网 发布:mrtg windows下载 编辑:程序博客网 时间:2024/04/29 11:16

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

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

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

前向卷积码, front_conv_lsmaker.h

[cpp] view plaincopy
  1. /** \brief 本文件实现了前向卷积码的状态机回调函数 
  2.  */  
  3. #if !defined (FRONT_CONV_LSMAKER_HEADER_VER)  
  4. #define  FRONT_CONV_LSMAKER_HEADER_VER 101  
  5. namespace LSMVIT  
  6. {  
  7.     /** \brief 前向卷积码有限状态机生成器 
  8.      */  
  9.     template <int n, int k, int m>  
  10.     class fconv_lsmaker{  
  11.     protected:  
  12.         int OutPin[n][k][m+1];  
  13.     public:  
  14.         fconv_lsmaker(const int octPins[/*k*/][n])  
  15.         {  
  16.             init_Pins(octPins);  
  17.         }  
  18.         fconv_lsmaker(){}  
  19.         ~fconv_lsmaker(){}  
  20.   
  21.         /** \brief 根据抽头初始化本类对象 
  22.          * 
  23.          * \param octPins[k][n] int 抽头,分别是第k组寄存器对第n个输出管脚的影响 
  24.          * \return void 
  25.          * 
  26.          */  
  27.         void init_Pins(const int octPins[/*k*/][n])  
  28.         {  
  29.             for (int i=0;i<k;i++)  
  30.             {  
  31.                 for (int j=0;j<n;j++)  
  32.                 {  
  33.                     int noctp = octPins[i][j];  
  34.                     int cpin = 0, ct = 0;  
  35.                     while (noctp)  
  36.                     {  
  37.                         cpin += (noctp % 10) << (ct * 3);  
  38.                         noctp /= 10;  
  39.                         ct ++;  
  40.                     }//end while  
  41.                     for (int v = 0; v < m+1; v++)  
  42.                         OutPin[j][i][v] = (cpin>>(m-v)) & 0x01;  
  43.                 }// end j  
  44.             }// end i  
  45.         }  
  46.     public:  
  47.   
  48.         /** \brief 回调函数,会递交给状态机 
  49.          */  
  50.         bool cb_status (int reg, int data, int *pNextReg, int * pOutput)  
  51.         {  
  52.             if (pNextReg == nullptr || pOutput == nullptr) return false;  
  53.             int nOutput[n], nReg[k][m+1];  
  54.             for (int i = 0; i< k ; i++)  
  55.             {  
  56.                 nReg[i][0] = (data >> (k-i-1)) & 0x01;  
  57.                 for (int j = 0;j<m;j++)  
  58.                     nReg[i][j+1] = (reg>>((k-i-1)*m + (m-1-j))) & 0x01;  
  59.   
  60.             }// end i  
  61.             for (int i=0;i<n;i++)  
  62.             {  
  63.                 int cc = 0;  
  64.                 for (int j = 0;j<k;j++)  
  65.                 {  
  66.                     for (int v = 0;v <m+1;v++)  
  67.                         cc += OutPin[i][j][v] * nReg[j][v];  
  68.                 }// end j  
  69.                 nOutput[i] = cc % 2;  
  70.             }//end i  
  71.             int newreg = 0, out = 0;  
  72.             for (int i=0;i<n;i++)  
  73.             {  
  74.                 out <<=1;  
  75.                 out += nOutput[i];  
  76.             }  
  77.             for (int j=0;j<k;j++)  
  78.             {  
  79.                 for (int v = 0;v < m ; v++)  
  80.                 {  
  81.                     newreg <<= 1;  
  82.                     newreg += nReg[j][v];  
  83.                 }  
  84.             }  
  85.             *pNextReg = newreg;  
  86.             *pOutput = out;  
  87.             return true;  
  88.         } // end function cb_status  
  89.     };// end class  
  90. };// end name space  
  91. #endif  


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

反馈卷积码 feedback_conv_lsmaker.h

[cpp] view plaincopy
  1. /** \brief 本文件实现了反馈卷积码的状态机回调函数 
  2.  */  
  3. #if !defined (FEEDBACK_CONV_LSMAKER_HEADER_VER)  
  4. #define  FEEDBACK_CONV_LSMAKER_HEADER_VER 101  
  5. namespace LSMVIT  
  6. {  
  7.     /** \brief 反馈卷积码有限状态机生成器 
  8.      */  
  9.     template <int n, int k, int m>  
  10.     class feedback_lsmaker{  
  11.     protected:  
  12.         int OutPin[n][k][m+1];  
  13.         int FeedBackPin[k][k][m+1];  
  14.     public:  
  15.         feedback_lsmaker(const int octPins[/*k*/][n],const int fbPins[/*k*/][k])  
  16.         {  
  17.             init_Pins(octPins,fbPins);  
  18.         }  
  19.         feedback_lsmaker(){}  
  20.         ~feedback_lsmaker(){}  
  21.   
  22.         /** \brief 根据抽头初始化本类对象 
  23.          * 
  24.          * \param octPins[k][n] int 抽头,分别是第k组寄存器对第n个输出管脚的影响 
  25.          * \param fbPins[k][k] int 反馈抽头,分别是第k组寄存器对第k个输入管脚的影响 
  26.          * \return void 
  27.          * 
  28.          */  
  29.         void init_Pins(const int octPins[/*k*/][n],const int fbPins[/*k*/][k])  
  30.         {  
  31.             for (int i=0;i<k;i++)  
  32.             {  
  33.                 for (int j=0;j<n;j++)  
  34.                 {  
  35.                     int noctp = octPins[i][j];  
  36.                     int cpin = 0, ct = 0;  
  37.                     while (noctp)  
  38.                     {  
  39.                         cpin += (noctp % 10) << (ct * 3);  
  40.                         noctp /= 10;  
  41.                         ct ++;  
  42.                     }//end while  
  43.                     for (int v = 0; v < m+1; v++)  
  44.                         OutPin[j][i][v] = (cpin>>(m-v)) & 0x01;  
  45.                 }// end j  
  46.             }// end i  
  47.                     for (int i=0;i<k;i++)  
  48.             {  
  49.                 for (int j=0;j<k;j++)  
  50.                 {  
  51.                     int noctp = fbPins[i][j];  
  52.                     int cpin = 0, ct = 0;  
  53.                     while (noctp)  
  54.                     {  
  55.                         cpin += (noctp % 10) << (ct * 3);  
  56.                         noctp /= 10;  
  57.                         ct ++;  
  58.                     }//end while  
  59.                     for (int v = 0; v < m+1; v++)  
  60.                         FeedBackPin[j][i][v] = (cpin>>(m-v)) & 0x01;  
  61.                 }// end j  
  62.             }// end i  
  63.         }  
  64.     public:  
  65.   
  66.         /** \brief 回调函数,会递交给状态机 
  67.          */  
  68.         bool cb_status (int reg, int data, int *pNextReg, int * pOutput)  
  69.         {  
  70.             if (pNextReg == nullptr || pOutput == nullptr) return false;  
  71.             int nOutput[n], nReg[k][m+1];  
  72.             for (int i = 0; i< k ; i++)  
  73.             {  
  74.                 nReg[i][0] = (data >> (k-i-1)) & 0x01;  
  75.                 for (int j = 0;j<m;j++)  
  76.                     nReg[i][j+1] = (reg>>((k-i-1)*m + (m-1-j))) & 0x01;  
  77.             }// end i  
  78.             //反馈  
  79.             for (int i=0;i<k;i++)  
  80.             {  
  81.   
  82.                 int cc = 0;  
  83.                 for (int j = 0;j<k;j++)  
  84.                 {  
  85.                     for (int v = 0;v <m+1;v++)  
  86.                         cc += FeedBackPin[i][j][v] * nReg[j][v];  
  87.                 }// end j  
  88.                 nReg[i][0] += cc;  
  89.                 nReg[i][0] %= 2;  
  90.             }//end i  
  91.   
  92.             //输出  
  93.             for (int i=0;i<n;i++)  
  94.             {  
  95.                 int cc = 0;  
  96.                 for (int j = 0;j<k;j++)  
  97.                 {  
  98.                     for (int v = 0;v <m+1;v++)  
  99.                         cc += OutPin[i][j][v] * nReg[j][v];  
  100.                 }// end j  
  101.                 nOutput[i] = cc % 2;  
  102.             }//end i  
  103.             //下一状态  
  104.             int newreg = 0, out = 0;  
  105.             for (int i=0;i<n;i++)  
  106.             {  
  107.                 out <<=1;  
  108.                 out += nOutput[i];  
  109.             }  
  110.             for (int j=0;j<k;j++)  
  111.             {  
  112.                 for (int v = 0;v < m ; v++)  
  113.                 {  
  114.                     newreg <<= 1;  
  115.                     newreg += nReg[j][v];  
  116.                 }  
  117.             }  
  118.             *pNextReg = newreg;  
  119.             *pOutput = out;  
  120.             return true;  
  121.         } // end function cb_status  
  122.     };// end class  
  123. };// end name space  
  124. #endif  


 

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

0 0
原创粉丝点击