• 大小: 18KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-22
  • 语言: C/C++
  • 标签: 维特比  卷积码  C++  

资源简介

卷积码的编码和维特比译码程序,使用C/C++编写,可在Ubuntu和Windows操作系统上运行,经过修改可在嵌入式系统中运行。适合新手学习卷积码编码和维特比译码算法,也可供工程师参考。

资源截图

代码片段和文件信息

#include“convolution.h“
#include
int main(){
char exit_char;
myinput();//参数输入,编码约束长度支持3 - 9,只支持码率为1/2的卷积码,编码矢量内置选择1,手动输入选择2
creatsta();//创建卷积码的状态图
convolution();//卷积码编码
cin>>exit_char;
}

/*参数输入*/
void myinput(void){
int ij;
cout<<“输入编码的约束长度N:(3 cin>>myn;
stalen=int(pow(2.0myn-1));
cout<<“选择默认的编码矢量则输入1,输入2则可输入其他的编码矢量“< cin>>i;
if(i==1){
switch(myn){//设置所选择的约束长度,码率为1/2的卷积码的编码矢量。
case 3: myg1[0]=1myg1[1]=1myg1[2]=1;
myg2[0]=1myg2[1]=0myg2[2]=1;
break;
case 4: myg1[0]=1myg1[1]=1myg1[2]=1myg1[3]=1;
myg2[0]=1myg2[1]=0myg2[2]=1myg2[3]=1;
break;
case 5: myg1[0]=1myg1[1]=0myg1[2]=1myg1[3]=1myg1[4]=1;
myg2[0]=1myg2[1]=1myg2[2]=0myg2[3]=1myg2[4]=1;
break;
case 6: myg1[0]=1myg1[1]=0myg1[2]=1myg1[3]=1myg1[4]=1myg1[5]=1;
myg2[0]=1myg2[1]=1myg2[2]=0myg2[3]=1myg2[4]=0myg2[5]=1;
break;
case 7: myg1[0]=1myg1[1]=0myg1[2]=0myg1[3]=1myg1[4]=1myg1[5]=1myg1[6]=1;
myg2[0]=1myg2[1]=1myg2[2]=0myg2[3]=1myg2[4]=1myg2[5]=0myg2[6]=1;
break;
case 8: myg1[0]=1myg1[1]=0myg1[2]=0myg1[3]=1myg1[4]=1myg1[5]=1myg1[6]=1myg1[7]=1;
myg2[0]=1myg2[1]=1myg2[2]=1myg2[3]=0myg2[4]=0myg2[5]=1myg2[6]=0myg2[7]=1;
break;
case 9: myg1[0]=1myg1[1]=1myg1[2]=0myg1[3]=1myg1[4]=0myg1[5]=1myg1[6]=1myg1[7]=1myg1[8]=1;
myg2[0]=1myg2[1]=0myg2[2]=0myg2[3]=0myg2[4]=1myg2[5]=1myg2[6]=1myg2[7]=0myg2[8]=1;
break;
}
}
else{//手动输入编码矢量
cout<<“输入g1“< for(j=0;j cin>>myg1[j];
cout<<“输入g2“< for(j=0;j cin>>myg2[j];
}
cout<<“连接矢量1为“< for(j=0;j cout< cout< cout<<“连接矢量2为“< for(j=0;j cout< cout< cout<<“stalen:  “< cout<}

/*计算卷积码的状态转移图*/
void creatsta(void){
int ijkmyi;
int tembits[10];
for(i=0;i stan1[i][0]=0; //当前状态为i,输入为1时,编码器的两个输出
stan1[i][1]=0;
stan0[i][0]=0;//当前状态为i,输入为0时,编码器的两个输出
stan0[i][1]=0;
stachn[i][0]=i/2;//当前状态为i,输入为0时下一状态stachn[i][0]为i/2
myi=i;//myi为当前状态+输入的数0,0放在最左边
for(j=0;j if(myi>=pow(2.0myn-1-j)){
tembits[j]=1;
myi=myi-pow(2.0myn-1-j);
}
else{
tembits[j]=0;
}
}
for(k=0;k stan0[i][0]+=myg1[k]*tembits[k];//将myi和编码矢量相乘并累加
stan0[i][1]+=myg2[k]*tembits[k];
}
stan0[i][0]=stan0[i][0]%2;//计算编码器的实际输出,输出为乘加所得结果的最后一位
stan0[i][1]=stan0[i][1]%2;

myi=i+int(pow(2.0myn-1));//myi为当前状态+输入的数1,1放在最左边
stachn[i][1]=myi/2;//当前状态为i,输入为1时下一状态stachn[i][1]为(i+int(pow(2.0myn-1)))/2
for(j=0;j if(myi>=pow(2.0myn-1-j)){
tembits[j]=1;
myi=myi-pow(2.0myn-1-j);
}
else{
tembits[j]=0;
}
}
for(k=0;k stan1[i][0]+=myg1[k]*tembits[k];//将myi和编码矢量相乘并累加
stan1[i][1]+=

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-01-14 10:37  convolution\
     文件         472  2018-01-14 00:00  convolution\convolution.h
     文件        5236  2018-01-14 10:35  convolution\convolution_encoding.cpp
     文件       12735  2018-01-14 00:02  convolution\convolution_encoding.out
     文件          74  2018-01-14 00:09  convolution\decoded_data.txt
     文件        1182  2018-01-14 00:08  convolution\encoded_data.txt
     文件          96  2018-01-14 10:37  convolution\raw_data.txt
     文件         871  2018-01-14 10:45  convolution\readme.txt
     文件       17026  2018-01-14 00:07  convolution\viterbi.out
     文件         840  2018-01-14 00:04  convolution\viterbiH.h
     文件        9392  2018-01-14 10:36  convolution\viterbi_decoding.cpp

评论

共有 条评论