卷积码C++源码(完整版)

#include<iostream>
#include<string>
using namespace std;
class JuanjiCode{
private:
int i,j,t;
int n0,k0,r0,m;
int **h,**H,**g,**G;
//实现编码所需变量
int code;
string Info_str,Code_str;
int total_num,extra_num;
public:
void Initializing();
void Trans_h_to_H();
void Trans_h_to_g();
void Print_g();
void Trans_g_to_G();
void Print_G();
//编码
void Before_Encoding();//编码前的准备
int Check(string);
void Encoding();
};
/**********************初始化模块**********************/
void JuanjiCode::Initializing()
{
cout<<"请输入码字长n0=";
cin>>n0;
cout<<"请输入信息元个数k0=";
cin>>k0;
cout<<"请输入关联长度m=";
cin>>m;
/
/监督元个数
r0=n0-k0;
//动态分配存储单元
h=new int*[r0];
for(i=0;i<r0;i++) 
h[i]=new int[m*n0];
cout<<"请输入("<<n0<<","<<k0<<","<<m<<")卷积码的基本监督矩阵h["<<r0<<"]["<<m*n0<<"]:"<<endl;
for(i=0;i<r0;i++)
for(j=0;j<m*n0;j++)
cin>>h[i][j];
//检测,输出h
cout<<"您输入的基本监督矩阵h["<<r0<<"]["<<m*n0<<"]如下:\n"<<endl;
for(i=0;i<r0;i++)
{
for(j=0;j<m*n0;j++)
{
cout<<h[i][j];
if((j+1)%n0==0)
cout<<" ";
}
cout<<endl;
}
cout<<endl;
//动态分配存储单元
H=new int*[m*r0];
for(i=0;i<m*r0;i++) 
H[i]=new int[m*n0];
g=new int*[m*k0];
for(i=0;i<m*k0;i++) 
g[i]=new int[n0];
G=new int*[m*k0];
for(i=0;i<m*k0;i++) 
G[i]=new int[m*n0];
}
//由基本监督矩阵h导出一致监督矩阵H并打印输出
void JuanjiCode::Trans_h_to_H()
{
cout<<"该卷积码对应的一致监督矩阵H["<<m*r0<<"]["<<m*n0<<"]如下(未输出部分全为0):\n"<<endl;
for(t=0;t<m;t++)
{
for(i=0;i<r0;i++)
{
for(j=0;j<(t+1)*n0;j++)
{
H[t*r0+i][j]=h[i][(m-t-1)*n0+j];
cout<<H[t*r0+i][j];
if((j+1)%n0==0)
cout<<" ";
}
cout<<endl;
}
cout<<endl;
}
}
//由基本监督矩阵h导出基本生成矩阵g并打印输出
void JuanjiCode::Trans_h_to_g()
{卷积编码
for(t=0;t<m;t++)
{
for(i=0;i<k0;i++)
{
for(j=0;j<n0;j++)
{
if(j>=k0)
g[k0*t+i][j]=h[j-k0][t*n0+i];
else
{
if(t==m-1&&i==j)
g[k0*t+i][j]=1;
else
g[k0*t+i][j]=0;
}
}
}
}
Print_g();
}
void JuanjiCode::Print_g()
{
cout<<"该卷积码对应的基本生成矩阵g["<<m*k0<<"]["<<n0<<"]如下:\n"<<endl;
for(i=0;i<m*k0;i++)
{
for(j=0;j<n0;j++)
{
cout<<g[i][j];
}
if((i+1)%k0==0)
cout<<endl;
cout<<endl;
}
}
//由基本生成矩阵g导出一致生成矩阵G并打印输出
void JuanjiCode::Trans_g_to_G()
{
for(t=0;t<m;t++)
{
for(i=0;i<m*k0;i++)
{
for(j=0;j<n0;j++)
{
if(i<(t+1)*k0)
G[i][t*n0+j]=g[(m-(t+1))*k0+i][j];
else
G[i][t*n0+j]=0;
}
}
}
Print_G();
}
void JuanjiCode::Print_G()
{
cout<<"该卷积码对应的一致生成矩阵G["<<m*k0<<"]["<<m*n0<<"]如下(未输
出部分全为0):\n"<<endl;
for(i=0;i<m*k0;i++)
{
for(j=0;j<m*n0;j++)
{
if(j<i/k0*n0)
cout<<" ";//为0的块不输出
else
cout<<G[i][j];
if((j+1)%n0==0)
cout<<" ";
}
if((i+1)%k0==0)
cout<<endl;
cout<<endl;
}
}
/**********************编码模块**********************/
//利用一致生成矩阵G及基本生成矩阵g编码
void JuanjiCode::Before_Encoding()//编码前的准备
{
C: int flag;
cout<<"请输入待编码的0、1信息序列:"<<endl;
cin>>Info_str;
flag=Check(Info_str);
if(!flag)
{
cout<<"您输入的信息序列含除0、1外的其他字符,请重新输入!"<<endl;
goto C;
}
else
{
if(total_num<m*k0)
{
cout<<"您输入的信息元个数不足,无法进行编码,请重新输入!"<<endl;
goto C;
}
else if(total_num%k0!=0)
{
cout<<"您输入的信息序列存在冗余,无法进行编码,请重新输入!"<<endl;
goto C;
}
}
}
int JuanjiCode::Check(string Info_str)
{
int flag=1;
total_num=0;
for(i=0;Info_str[i]!='\0';i++)
{
if(!(Info_str[i]=='0'||Info_str[i]=='1'))
{
flag=0;
break;
}
total_num++;//统计输入的0、1的数目
}
return flag;
}
void JuanjiCode::Encoding()
{
Before_Encoding();
Code_str="";
//前m个码组通过一致生成矩阵G编出
for(i=0;i<m*n0;i++)
{
code=0;
for(j=0;j<m*k0;j++)
{
if(Info_str[j]=='1')
code+=G[j][i];
else
code+=0;
}
if(code%2==0)
Code_str+='0';
else
Code_str+='1';
}
//其余的码组由基本生成矩阵编出
extra_num=total_num/k0-m;
for(t=0;t<extra_num;t++)
{
for(i=0;i<n0;i++)
{
code=0;
for(j=(t+1)*k0;j<(m+t+1)*k0;j++)
{
if(Info_str[j]=='1')
code+=g[j-(t+1)*k0][i];
else
code+=0;
}
if(code%2==0)
Code_str+='0';
else
Code_str+='1';
}
}
//输出截短码组
cout<<"经编码后,得到如下序列:"<<endl;
for(i=0;i<total_num/k0*n0;i++)
{
cout<<Code_str[i];
if((i+1)%n0==0)
cout<<" ";
}
cout<<"..."<<endl;
}
/**********************主函数**********************/
void main()
{
JuanjiCode J_Code;
char choice=' ';
int flag=0;
cout<<"\n";
while(choice!='3')
{
C: cout<<"      "<<"*************************卷积码简易编码器*************************\n";
cout<<"                  "<<"1.初始化"<<"        "<<"2.编码"<<"        "<<"3.退出\n";
cout<<"请输入您要操作的步骤:";
cin>>choice;
if(choice=='1')
{
if(!flag){//初次执行初始化操作
flag=1;
}
J_Code.Initializing();
J_Code.Trans_h_to_H();
J_Code.Trans_h_to_g();
J_Code.Trans_g_to_G();
}
else if(choice=='2')
{
if(!flag)
{
cout<<"操作错误!请执行初始化操作后再进行本操作!"<<endl;
goto C;
}
//编码
J_Code.Encoding();
}
else if(choice=='3')
{
exit(0);//退出
}
else
//如果选了选项之外的就让用户重新选择
{
cout<<"您没有输入正确的步骤,请重新输入!"<<endl;
}
cout<<endl;
}
}

本文发布于:2024-09-23 04:37:41,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/377224.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:矩阵   输入   生成   编码   基本   监督   信息
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议