您的当前位置:首页正文

卷积码

2021-09-04 来源:好走旅游网
#include #include 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;icout<<\"请输入(\"<for(i=0;i>h[i][j]; //检测,输出h

cout<<\"您输入的基本监督矩阵h[\"<for(j=0;j{

cout<cout<cout<G[i]=new int[m*n0]; }

//由基本监督矩阵h导出一致监督矩阵H并打印输出

void JuanjiCode::Trans_h_to_H() {

cout<<\"该卷积码对应的一致监督矩阵H[\"<for(t=0;tfor(i=0;ifor(j=0;j<(t+1)*n0;j++)

{

H[t*r0+i][j]=h[i][(m-t-1)*n0+j];

cout<if((j+1)%n0==0)

cout<<\" \"; }

cout<cout<//由基本监督矩阵h导出基本生成矩阵g并打印输出

void JuanjiCode::Trans_h_to_g() {

for(t=0;tfor(i=0;ifor(j=0;jif(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[\"<for(i=0;ifor(j=0;jcout<if((i+1)%k0==0)

cout<cout<//由基本生成矩阵g导出一致生成矩阵G并打印输出

void JuanjiCode::Trans_g_to_G() {

for(t=0;tfor(i=0;ifor(j=0;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[\"<for(i=0;ifor(j=0;jif(jcout<<\" \";//为0的块不输出 else

cout<if((j+1)%n0==0)

cout<<\" \"; }

if((i+1)%k0==0)

cout<cout</**********************编码模块**********************/ //利用一致生成矩阵G及基本生成矩阵g编码

void JuanjiCode::Before_Encoding()//编码前的准备 { C: int flag;

cout<<\"请输入待编码的0、1信息序列:\"<cin>>Info_str;

flag=Check(Info_str);

if(!flag) {

cout<<\"您输入的信息序列含除0、1外的其他字符,请重新输入!\"<if(total_numcout<<\"您输入的信息元个数不足,无法进行编码,请重新输入!\"<else if(total_num%k0!=0) {

cout<<\"您输入的信息序列存在冗余,无法进行编码,请重新输入!\"<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;ifor(j=0;jif(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{

for(i=0;ifor(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<<\"经编码后,得到如下序列:\"<for(i=0;icout<if((i+1)%n0==0)

cout<<\" \"; }

cout<<\"...\"</**********************主函数**********************/ 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<<\"操作错误!请执行初始化操作后再进行本操作!\"<goto C; } //编码

J_Code.Encoding(); }

else if(choice=='3') {

exit(0);//退出 }

else//如果选了选项之外的就让用户重新选择 {

cout<<\"您没有输入正确的步骤,请重新输入!\"<cout<

因篇幅问题不能全部显示,请点此查看更多更全内容