找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3612|回复: 0

我的毕设:卷积码的viterbi译码

[复制链接]
发表于 2014-3-16 17:22:18 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
这个不是最终版本,又由于很早的代码,因为怎么正确运行我也不记得了,只看代码吧

加密模块encode.h
  1. //encode.h
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5. #define PI 3.14
  6. #define length 10
  7. #define M 3
  8. #define N 3
  9. void gensignal(int* origin,int mode)//产生信号
  10. {//生成随机二进制数作为编码前的信息序列
  11.     if(mode==0) for(int i=0;i<length;i++) origin[ i]=0;//生成一位信息位
  12.     if(mode==1) for(int i=0;i<length;i++) origin[ i]=1;//生成一位信息位
  13.     if(mode==2) for(int i=0;i<length;i++) origin[ i]=i&1;//生成一位信息位
  14.     if(mode==3)
  15.     {
  16.         for(int i=0;i<length;i++) origin[ i]=rand()&1;//生成一位信息位
  17.     }
  18. }
  19. void encode(int encodeori[length][N],int* origin,int* generate)//编码器
  20. {//生成卷积码,码率为1/N,一个码元有N比特
  21.     int shifter;//模拟左移移位寄存器当前状态[b(M-1),b(M-2),b(M-3),...,b(1)],最大表示16位
  22.     int i,j,k,temp=shifter;
  23.     for(k=0;k<length;k++)
  24.     {//由此信息位生成N bit码元
  25.         temp=(temp<<1)^origin[k];//模拟移位寄存器左移
  26.         for(i=0;i<N;i++)
  27.         {//生成此卷积码码元的1bit
  28.             int sum=0,temp1=temp&generate[ i];
  29.             encodeori[k][ i]=0;
  30.             for(j=0;j<M;j++) sum^=(temp1>>j)&1;
  31.             //实现卷积码编码电路输入输出关系,乘矩阵的列后自模2加
  32.             encodeori[k][ i]=(encodeori[k][ i]<<1)^sum;//组合成卷积码码元
  33.         }
  34.         shifter=temp;
  35.     }
  36.     if((encodeori[0][0]!=encodeori[0][1])||(encodeori[0][1]!=encodeori[0][2])||(encodeori[0][0]!=encodeori[0][2])) cout<<"\\\\\\\";
  37. }
  38. void PSK(int encodeori[length][N],int PSKmaker[length][N])//PSK调制(1-->-1;0-->1)
  39. {
  40.     for(int i=0;i<length;i++)
  41.         for(int j=0;j<N;j++)
  42.             {
  43.                 if(encodeori[ i][j]) PSKmaker[ i][j]=-1;
  44.                 else PSKmaker[ i][j]=1;
  45.             }
  46. }
  47. double gaosimaker(double DX)
  48. {
  49.     double rand1,rand2,result;
  50.     rand1=(double)(rand())/RAND_MAX;//均匀分布
  51.     rand2=(double)(rand())/RAND_MAX;//均匀分布
  52.     result=sqrt((-2)*log(rand1))*cos(2*PI*rand2);
  53.     //变换抽样,均匀分布变为正态分布
  54.     return DX*result;
  55. }
  56. void addgaosi(double send[length][N],int PSKmaker[length][N],double DX)
  57. {
  58.     for(int i=0;i<length;i++)
  59.         for(int j=0;j<N;j++)
  60.             send[ i][j]=PSKmaker[ i][j]+gaosimaker(DX);
  61. }
  62. int result(int x)
  63. {
  64.     if(x=1) return 1;
  65.     else if(x>1)
  66.     {
  67.         return result(x-1)+(int)pow(10,x-1);
  68.     }
  69.     else return 65535;
  70. }
复制代码




揭秘模块decode.h

  1. //decode.h
  2. #include <math.h>
  3. #include <iostream.h>
  4. #include <stdlib>
  5. #define length 10
  6. #define M 3
  7. #define N 3
  8. #define statenum (int)pow(2,M-1)
  9. struct fencenode{
  10.     int currentstate;//左移寄存器当前状态(...000,...001,...010,...)
  11.     int incode[2];//输入数据后先后到达此点的两个点分别生成的卷积码
  12.     int outcode[2];//outcode[0]:输入0后生成的卷积码;outcode[1]:输入1后生成的卷积码
  13.     fencenode* in[2];//输入数据后到达此点的两个点
  14.     fencenode* out[2];//out[0]:输入0后从此点到达的点;out[1]:输入1后从此点到达的点
  15. };
  16. struct survive{
  17.     int hamingdist;//累积汉明距离
  18.     int sufferstate[length+1];//历经状态
  19.     int outcode[length];//对应的原信号
  20. };
  21. fencenode* initstatediag(int* generate);
  22. int dist(int dist1,int* dist2);
  23. int distcomp(int dist1,int dist2,int* dist0,int ham1,int ham2);
  24. void copysur(survive* mysurvivenew,survive* survive,int i);
  25. void copysur1(survive* surv1,int m,survive* surv2,int n,int i);
  26. survive* findmin(survive* surv,int i);
  27. void demodulate(int demodule[length][N],double receive[length][N])//解调2PSK信号
  28. {//硬判决,判决门限0(小于0-->1,大于0-->0)
  29.     for(int i=0;i<length;i++)
  30.     {
  31.         for(int j=0;j<N;j++)
  32.         {
  33.             if(receive[ i][j]<0) demodule[ i][j]=1;
  34.             else demodule[ i][j]=0;
  35.         }
  36.     }
  37. }
  38. survive* viterbidecoder(int demodule[length][N],int* recover,int* generate)
  39. {
  40.     int i,j;
  41.     survive* mysurvive=new survive[statenum];//最多有状态数(statenum)个幸存路径
  42.     survive* mysurvivenew=new survive[statenum];//最多有状态数(statenum)个幸存路径
  43.     fencenode* myfence=initstatediag(generate);
  44.     for(i=0;i<statenum;i++)//对幸存路径的初始化
  45.     {
  46.         mysurvive[ i].hamingdist=0;//设置汉明初值
  47.         mysurvive[ i].sufferstate[0]=0;//初始状态为0
  48.         mysurvivenew[ i].hamingdist=0;
  49.         mysurvivenew[ i].sufferstate[0]=0;
  50.         for(j=0;j<length;j++)
  51.         {
  52.             mysurvive[ i].sufferstate[j+1]=0;
  53.             mysurvivenew[ i].outcode[j]=0;
  54.             mysurvive[ i].sufferstate[j+1]=0;
  55.             mysurvivenew[ i].outcode[j]=0;
  56.         }
  57.     }
  58.     for(i=1;i<=length;i++)
  59.     {//生成第i个时间段内的幸存路线片段
  60.         if(pow(2,i)<=statenum)//对应篱笆图左部下落区
  61.         {
  62.             for(j=0;j<statenum;j++)
  63.             {//生成第j状态对应的幸存路线
  64.                 int temp1=(j>>(M-i))&3,temp2=(j>>(M-1-i))&1;
  65.                 mysurvive[j].sufferstate[ i]=myfence[temp1].out[temp2]->currentstate;
  66.                 mysurvive[j].hamingdist+=dist(myfence[temp1].outcode[temp2],demodule[i-1]);
  67.                 mysurvive[j].outcode[i-1]=temp2;
  68.             }
  69.         }
  70.         else
  71.         {//此篱笆图区域内每个状态必由2条路径到达,取汉明距离较小的为此时间段内此状态的幸存路径
  72.             copysur(mysurvivenew,mysurvive,i);
  73.             //准备由前一次结果重新排序幸存队列,将mysurvive赋给mysurvivenew
  74.             for(j=0;j<statenum;j++)
  75.             {
  76.                 fencenode* node1=myfence[j].in[0];fencenode* node2=myfence[j].in[1];//找到转移至状态j的两个状态的地址
  77.                 int code1=myfence[j].incode[0],code2=myfence[j].incode[1];
  78.                 int k=distcomp(code1,code2,demodule[i-1],mysurvivenew[node1->currentstate].hamingdist,mysurvivenew[node2->currentstate].hamingdist);
  79.                 if(0==k)
  80.                 {//node1的距离小
  81.                     copysur1(mysurvive,j,mysurvivenew,node1->currentstate,i);//赋予新路径
  82.                     mysurvive[j].sufferstate[ i]=j;
  83.                     mysurvive[j].hamingdist+=dist(code1,demodule[i-1]);
  84.                     mysurvive[j].outcode[i-1]=j&1;
  85.                 }
  86.                 else if(1==k)
  87.                 {//node2的距离小
  88.                     copysur1(mysurvive,j,mysurvivenew,node2->currentstate,i);//赋予新路径
  89.                     mysurvive[j].sufferstate[ i]=j;
  90.                     mysurvive[j].hamingdist+=dist(code2,demodule[i-1]);
  91.                     mysurvive[j].outcode[i-1]=j&1;
  92.                 }
  93.                 else
  94.                 {
  95.                     if(rand()<RAND_MAX/2)
  96.                     {
  97.                         copysur1(mysurvive,j,mysurvivenew,node1->currentstate,i);//赋予新路径
  98.                         mysurvive[j].sufferstate[ i]=j;
  99.                         mysurvive[j].hamingdist+=dist(code1,demodule[i-1]);
  100.                         mysurvive[j].outcode[i-1]=j&1;
  101.                     }
  102.                     else
  103.                     {
  104.                         copysur1(mysurvive,j,mysurvivenew,node2->currentstate,i);//赋予新路径
  105.                         mysurvive[j].sufferstate[ i]=j;
  106.                         mysurvive[j].hamingdist+=dist(code2,demodule[i-1]);
  107.                         mysurvive[j].outcode[i-1]=j&1;
  108.                     }
  109.                 }
  110.             }
  111.         }
  112.     }   
  113.     survive* thebest=findmin(mysurvive,statenum);//找出statenum条路径中汉明距离最小的
  114.     for(i=0;i<statenum;i++)
  115.     {
  116.         for(j=0;j<length;j++) recover[j]=thebest->outcode[j];
  117.     }
  118.     delete []mysurvive;
  119.     delete []mysurvivenew;
  120.     delete []myfence;
  121.     return mysurvive;
  122. }
  123. fencenode* initstatediag(int* generate)
  124. {
  125.     fencenode* trellisdiagram=new fencenode[statenum];//网格图雏形
  126.     for(int i=0;i<statenum;i++) trellisdiagram[ i].currentstate=i;
  127.     trellisdiagram[0].in[0]=&trellisdiagram[0];trellisdiagram[0].incode[0]=0;
  128.     trellisdiagram[0].in[1]=&trellisdiagram[2];trellisdiagram[0].incode[1]=3;
  129.     trellisdiagram[0].out[0]=&trellisdiagram[0];trellisdiagram[0].outcode[0]=0;
  130.     trellisdiagram[0].out[1]=&trellisdiagram[1];trellisdiagram[0].outcode[1]=7;
  131.     trellisdiagram[1].in[0]=&trellisdiagram[0];trellisdiagram[1].incode[0]=7;
  132.     trellisdiagram[1].in[1]=&trellisdiagram[2];trellisdiagram[1].incode[1]=4;
  133.     trellisdiagram[1].out[0]=&trellisdiagram[2];trellisdiagram[1].outcode[0]=1;
  134.     trellisdiagram[1].out[1]=&trellisdiagram[3];trellisdiagram[1].outcode[1]=6;
  135.     trellisdiagram[2].in[0]=&trellisdiagram[1];trellisdiagram[2].incode[0]=1;
  136.     trellisdiagram[2].in[1]=&trellisdiagram[3];trellisdiagram[2].incode[1]=2;
  137.     trellisdiagram[2].out[0]=&trellisdiagram[0];trellisdiagram[2].outcode[0]=3;
  138.     trellisdiagram[2].out[1]=&trellisdiagram[1];trellisdiagram[2].outcode[1]=4;
  139.     trellisdiagram[3].in[0]=&trellisdiagram[1];trellisdiagram[3].incode[0]=6;
  140.     trellisdiagram[3].in[1]=&trellisdiagram[3];trellisdiagram[3].incode[1]=5;
  141.     trellisdiagram[3].out[0]=&trellisdiagram[2];trellisdiagram[3].outcode[0]=2;
  142.     trellisdiagram[3].out[1]=&trellisdiagram[3];trellisdiagram[3].outcode[1]=5;
  143.     return trellisdiagram;
  144. }
  145. int dist(int dist1,int* dist2)//dist1:二进制数,dist2:十进制数组,宽均为N
  146. {
  147.     int sum=0;
  148.     switch(4*dist2[0]+2*dist2[1]+dist2[2])
  149.     {
  150.         case 0:
  151.             switch(dist1)
  152.             {
  153.                 case 0:sum=0;break;
  154.                 case 1: case 2: case 4:sum=1;break;
  155.                 case 3: case 5: case 6:sum=2;break;
  156.                 case 7:sum=3;break;
  157.             }
  158.             break;
  159.         case 1:
  160.             switch(dist1)
  161.             {
  162.                 case 1:sum=0;break;
  163.                 case 0: case 3: case 5:sum=1;break;
  164.                 case 2: case 4: case 7:sum=2;break;
  165.                 case 6:sum=3;break;
  166.             }
  167.             break;
  168.         case 2:
  169.             switch(dist1)
  170.             {
  171.                 case 2:sum=0;break;
  172.                 case 0: case 3: case 6:sum=1;break;
  173.                 case 1: case 4: case 7:sum=2;break;
  174.                 case 5:sum=3;break;
  175.             }
  176.             break;
  177.         case 3:
  178.             switch(dist1)
  179.             {
  180.                 case 3:sum=0;break;
  181.                 case 1: case 2: case 7:sum=1;break;
  182.                 case 0: case 5: case 6:sum=2;break;
  183.                 case 4:sum=3;break;
  184.             }
  185.             break;
  186.         case 4:
  187.             switch(dist1)
  188.             {
  189.                 case 4:sum=0;break;
  190.                 case 0: case 5: case 6:sum=1;break;
  191.                 case 1: case 2: case 7:sum=2;break;
  192.                 case 3:sum=3;break;
  193.             }
  194.             break;
  195.         case 5:
  196.             switch(dist1)
  197.             {
  198.                 case 5:sum=0;break;
  199.                 case 1: case 4: case 7:sum=1;break;
  200.                 case 0: case 3: case 6:sum=2;break;
  201.                 case 2:sum=3;break;
  202.             }
  203.             break;
  204.         case 6:
  205.             switch(dist1)
  206.             {
  207.                 case 6:sum=0;break;
  208.                 case 2: case 4: case 7:sum=1;break;
  209.                 case 0: case 3: case 5:sum=2;break;
  210.                 case 1:sum=3;break;
  211.             }
  212.             break;
  213.         case 7:
  214.             switch(dist1)
  215.             {
  216.                 case 7:sum=0;break;
  217.                 case 3: case 5: case 6:sum=1;break;
  218.                 case 1: case 2: case 4:sum=2;break;
  219.                 case 0:sum=3;break;
  220.             }
  221.             break;
  222.         default:break;
  223.     }
  224. /*
  225.     int temp,sum=0,i;//按位异或
  226.     for(i=0;i<N;i++)
  227.     {
  228.         temp=((dist1>>i)&1)^dist2[N-1-i];
  229.         sum=sum+temp;
  230.     }//求汉明距离*/
  231.     return sum;
  232. }
  233. int distcomp(int dist1,int dist2,int* dist0,int ham1,int ham2)
  234. {
  235.     if((dist(dist1,dist0)+ham1)<(dist(dist2,dist0)+ham2)) return 0;
  236.     else if((dist(dist1,dist0)+ham1)>(dist(dist2,dist0)+ham2)) return 1;
  237.     else return 2;
  238. }
  239. void copysur(survive* mysurvivenew,survive* mysurvive,int i)
  240. {//将路径数组mysurvive中每个路径的前i个数据赋给mysurvivene中的每个路径
  241.     for(int j=0;j<statenum;j++)
  242.     {
  243.         for(int l=1;l<i;l++)//找到不同路径的源头
  244.         {
  245.             if(mysurvivenew[j].sufferstate[l]!=mysurvive[j].sufferstate[l]) break;
  246.         }
  247.         mysurvivenew[j].hamingdist=mysurvive[j].hamingdist;
  248.         for(int k=l;k<i;k++)
  249.         {
  250.             mysurvivenew[j].sufferstate[k]=mysurvive[j].sufferstate[k];
  251.             mysurvivenew[j].outcode[k-1]=mysurvive[j].outcode[k-1];
  252.         }
  253.     }
  254. }
  255. void copysur1(survive* surv1,int m,survive* surv2,int n,int i)
  256. {//将路径surv2的前i个数据赋给surv1,变成新的surv1
  257.     for(int l=1;l<i;l++)//找到不同路径的源头
  258.     {
  259.         if(surv1[m].sufferstate[l]!=surv2[n].sufferstate[l]) break;
  260.     }
  261.     surv1[m].hamingdist=surv2[n].hamingdist;
  262.     for(int k=l;k<i;k++)
  263.     {
  264.         surv1[m].sufferstate[k]=surv2[n].sufferstate[k];
  265.         surv1[m].outcode[k-1]=surv2[n].outcode[k-1];
  266.     }
  267. }
  268. survive* findmin(survive* surv,int i)//在i个路径中找汉明距离最小的
  269. {
  270.     int j,k=0,best=0,smaller=surv[0].hamingdist;
  271.     for(j=0;j<i;j++)
  272.     {
  273.         if(surv[j].hamingdist<smaller) {smaller=surv[j].hamingdist;best=j;}
  274. /*
  275.         else if(surv[j].hamingdist=smaller)
  276.         {
  277.             if(rand()&1) best=j;
  278.         }*/
  279.     }
  280.     return &surv[best];
  281. }
  282. int pe(int* origin,int* recover)
  283. {
  284.     int i,sum=0;
  285.     for(i=0;i<length;i++)
  286.         if(origin[ i]!=recover[ i]) return 1;
  287.     return 0;
  288. }

复制代码



主模块

  1. //main.cpp
  2. //卷积码(N,1,M)的viterbi译码
  3. #include <iostream.h>
  4. #include "encode.h"
  5. #include "decode.h"
  6. #include <stdlib.h>
  7. #include <math.h>
  8. #include <iomanip.h>
  9. #define length 10
  10. #define M 3
  11. #define N 3
  12. #define statenum (int)pow(2,M-1)
  13. int generate[N]={1,5,7};//001,101,111
  14. int origin[length];
  15. //encodeori[length][N]由信息位生成卷积码,码率为1/N,一个码元有N比特
  16. int encodeori[length][N];
  17. //PSKmaker[length][N]将卷积码调制成PSK信号
  18. int PSKmaker[length][N];
  19. //send[length][N]加入高斯白噪声后的信号
  20. double send[length][N];
  21. //从信道里接收的信号
  22. int demodule[length][N];
  23. //解码后的信号;由statenum个幸存路径筛选得出
  24. int recover[length];
  25. int viterbikey(double DX,int mode)
  26. {
  27.     gensignal(origin,mode);
  28.     encode(encodeori,origin,generate);//产生信号
  29.     PSK(encodeori,PSKmaker);//PSK调制
  30.     addgaosi(send,PSKmaker,DX);//加高斯白噪声
  31.     demodulate(demodule,send);//解调
  32.     survive* sur=viterbidecoder(demodule,recover,generate);
  33.     int PE=pe(origin,recover);
  34.     return PE;
  35. }
  36. double viterbi()
  37. {
  38.     int mode=3,sum=0,i,j,k;
  39.     double DX=1.0;
  40.     for(i=0;i<100;i++)
  41.     {
  42.         if(viterbikey(DX,mode)==1)
  43.         {
  44.             sum=sum+1;
  45.             cout<<"origin: ";
  46.             for(j=0;j<length;j++) cout<<origin[j];
  47.             cout<<endl<<"encodeori: ";
  48.             for(j=0;j<length;j++)
  49.             {
  50.                 for(k=0;k<N;k++) cout<<encodeori[j][k];
  51.                 cout<<" ";
  52.             }
  53.             cout<<endl<<"PSKmaker: ";
  54.             for(j=0;j<length;j++)
  55.             {
  56.                 for(k=0;k<N;k++) cout<<;PSKmaker[j][k];
  57.                 cout<<" ";
  58.             }
  59.             cout<<endl<<"send ";
  60.             for(j=0;j<length;j++)
  61.             {
  62.                 for(k=0;k<N;k++) cout<<setprecision(2)<<send[j][k]<<" ";
  63.                 cout<<"  ";
  64.             }
  65.             cout<<endl<<"demodule: ";
  66.             for(j=0;j<length;j++)
  67.             {
  68.                 for(k=0;k<N;k++) cout<<demodule[j][k];
  69.                 cout<<" ";
  70.             }
  71.             cout<<endl<<"recover: ";
  72.             for(j=0;j<length;j++) cout<<recover[j];
  73.             cout<<endl<<endl;
  74.         }
  75.     }
  76.     return 1.0*sum/1000;
  77. }
  78. void main()
  79. {
  80.     unsigned long seed;
  81.     time((long*)&seed);
  82.     srand(seed);
  83.     cout<<"误码率为: "<<viterbi()<<endl;
  84. }
复制代码

matlab版

  1. length=1000;M=3;N=3;statenum=2^(M-1);error=zeros(1,101);
  2. for xyz=1:1:101
  3.     DX=(xyz-1)/10;
  4.     origin=randi([0,1],1,length);generate=[0,1,1;0,0,1;1,1,1];
  5.     encodeori=zeros(length,N);PSKmaker=zeros(length,N);
  6.     send=zeros(length,N);demodule=zeros(length,N);recover=zeros(1,length);
  7.     shift=zeros(length,M);
  8.     shift(1,M)=origin(1);
  9.     for i=2:1:length
  10.         shift(i,:)=[shift(i-1,2:end),origin(i)];
  11.     end
  12.     encodeori=mod(shift*generate,2);
  13.     PSKmaker=ones(size(encodeori))-encodeori*2;
  14.     send=PSKmaker+DX*randn(size(PSKmaker));
  15.     demodule=send<0;
  16.     shift=zeros(statenum,1,2*M-3);
  17.     for i=1:1:statenum
  18.         j=i-1;k=0;
  19.         while j~=0
  20.             shift(i,1,end-k)=mod(j,2);
  21.             j=bitshift(j,-1);
  22.             k=k+1;
  23.         end
  24.     end
  25.     arraytonum=ones(M-1,1);
  26.     for i=M-1:-1:2
  27.         arraytonum(i-1)=2*arraytonum(i);
  28.     end
  29.     shift1=squeeze(shift(:,:,end-M+2:end));
  30.     myfence.incode(1).value=mod([zeros(statenum,1),shift1]*generate,2);
  31.     myfence.incode(2).value=mod([ones(statenum,1),shift1]*generate,2);
  32.     mysurvive.hamingdist=zeros(statenum,length);
  33.     mysurvive.sufferstate=zeros(statenum,length+1,M-1);
  34.     mysurvive.outcode=zeros(statenum,length);
  35.     for i=2:1:M
  36.         mysurvive.sufferstate(:,i,:)=shift(:,1,(i-1):(i+M-3));
  37.     end
  38.     mysurvive.outcode(:,1:M-1)=shift1;
  39.     mysurvive.sufferstate1=cat(3,zeros(statenum,M-1,1),mysurvive.sufferstate(:,2:M,:));
  40.     mysurvive.hamingdist(:,1)=sum(mod(squeeze(mysurvive.sufferstate1(:,1,:))*generate,2)~=(ones(statenum,1)*demodule(1,:)),2)';
  41.     for i=2:1:M-1
  42.         mysurvive.hamingdist(:,i)=sum(mod(squeeze(mysurvive.sufferstate1(:,i,:))*generate,2)~=(ones(statenum,1)*demodule(i,:)),2)+mysurvive.hamingdist(:,i-1);
  43.     end
  44.     for i=M:1:length
  45.         mysurvivenew=mysurvive;
  46.         for j=1:1:statenum
  47.             mysurvive.outcode(j,i)=mod(j-1,2);
  48.             mysurvive.sufferstate(j,i+1,:)=shift1(j,:);
  49.             state1=[0,shift1(j,1:end-1)]*arraytonum+1;state2=[1,shift1(j,1:end-1)]*arraytonum+1;
  50.             dist1=sum(myfence.incode(1).value(j,:)~=demodule(i,:))+mysurvivenew.hamingdist(state1,i-1);
  51.             dist2=sum(myfence.incode(2).value(j,:)~=demodule(i,:))+mysurvivenew.hamingdist(state2,i-1);
  52.             if (dist1<dist2)||((dist1==dist2)&&(randi([0,1])==0))
  53.                 mysurvive.outcode(j,1:i-1)=mysurvivenew.outcode(state1,1:i-1);
  54.                 mysurvive.sufferstate(j,2:i,:)=mysurvivenew.sufferstate(state1,2:i,:);
  55.                 mysurvive.hamingdist(j,1:i-1)=mysurvivenew.hamingdist(state1,1:i-1);
  56.                 mysurvive.hamingdist(j,i)=dist1;
  57.             else
  58.                 mysurvive.outcode(j,1:i-1)=mysurvivenew.outcode(state2,1:i-1);
  59.                 mysurvive.sufferstate(j,2:i,:)=mysurvivenew.sufferstate(state2,2:i,:);
  60.                 mysurvive.hamingdist(j,1:i-1)=mysurvivenew.hamingdist(state2,1:i-1);
  61.                 mysurvive.hamingdist(j,i)=dist2;            
  62.             end
  63.         end
  64.     end
  65.     thebest=min(find(mysurvive.hamingdist(:,end)==min(mysurvive.hamingdist(:,end))));
  66.     recover=mysurvive.outcode(thebest,:);
  67.     error(xyz)=sum(recover~=origin)/length;
  68. end
  69. plot(linspace(0,10,101),error)

复制代码



  1. length=1000;M=3;N=5;statenum=2^(M-1);error=zeros(1,101);
  2. for xyz=1:1:101
  3.     DX=(xyz-1)/10;
  4.     origin=randi([0,1],1,length);generate=[1,0,0,1,1;1,0,1,0,1;0,1,1,1,1];
  5.     encodeori=zeros(length,N);PSKmaker=zeros(length,N);
  6.     send=zeros(length,N);demodule=zeros(length,N);recover=zeros(1,length);
  7.     shift=zeros(length,M);
  8.     shift(1,M)=origin(1);
  9.     for i=2:1:length
  10.         shift(i,:)=[shift(i-1,2:end),origin(i)];
  11.     end
  12.     encodeori=mod(shift*generate,2);
  13.     PSKmaker=ones(size(encodeori))-encodeori*2;
  14.     send=PSKmaker+DX*randn(size(PSKmaker));
  15.     demodule=send<0;
  16.     shift=zeros(statenum,1,2*M-3);
  17.     for i=1:1:statenum
  18.         j=i-1;k=0;
  19.         while j~=0
  20.             shift(i,1,end-k)=mod(j,2);
  21.             j=bitshift(j,-1);
  22.             k=k+1;
  23.         end
  24.     end
  25.     arraytonum=ones(M-1,1);
  26.     for i=M-1:-1:2
  27.         arraytonum(i-1)=2*arraytonum(i);
  28.     end
  29.     shift1=squeeze(shift(:,:,end-M+2:end));
  30.     myfence.incode(1).value=mod([zeros(statenum,1),shift1]*generate,2);
  31.     myfence.incode(2).value=mod([ones(statenum,1),shift1]*generate,2);
  32.     mysurvive.hamingdist=zeros(statenum,length);
  33.     mysurvive.sufferstate=zeros(statenum,length+1,M-1);
  34.     mysurvive.outcode=zeros(statenum,length);
  35.     for i=2:1:M
  36.         mysurvive.sufferstate(:,i,:)=shift(:,1,(i-1):(i+M-3));
  37.     end
  38.     mysurvive.outcode(:,1:M-1)=shift1;
  39.     mysurvive.sufferstate1=cat(3,zeros(statenum,M-1,1),mysurvive.sufferstate(:,2:M,:));
  40.     mysurvive.hamingdist(:,1)=sum(mod(squeeze(mysurvive.sufferstate1(:,1,:))*generate,2)~=(ones(statenum,1)*demodule(1,:)),2)';
  41.     for i=2:1:M-1
  42.         mysurvive.hamingdist(:,i)=sum(mod(squeeze(mysurvive.sufferstate1(:,i,:))*generate,2)~=(ones(statenum,1)*demodule(i,:)),2)+mysurvive.hamingdist(:,i-1);
  43.     end
  44.     for i=M:1:length
  45.         mysurvivenew=mysurvive;
  46.         for j=1:1:statenum
  47.             mysurvive.outcode(j,i)=mod(j-1,2);
  48.             mysurvive.sufferstate(j,i+1,:)=shift1(j,:);
  49.             state1=[0,shift1(j,1:end-1)]*arraytonum+1;state2=[1,shift1(j,1:end-1)]*arraytonum+1;
  50.             dist1=sum(myfence.incode(1).value(j,:)~=demodule(i,:))+mysurvivenew.hamingdist(state1,i-1);
  51.             dist2=sum(myfence.incode(2).value(j,:)~=demodule(i,:))+mysurvivenew.hamingdist(state2,i-1);
  52.             if (dist1<dist2)||((dist1==dist2)&&(randi([0,1])==0))
  53.                 mysurvive.outcode(j,1:i-1)=mysurvivenew.outcode(state1,1:i-1);
  54.                 mysurvive.sufferstate(j,2:i,:)=mysurvivenew.sufferstate(state1,2:i,:);
  55.                 mysurvive.hamingdist(j,1:i-1)=mysurvivenew.hamingdist(state1,1:i-1);
  56.                 mysurvive.hamingdist(j,i)=dist1;
  57.             else
  58.                 mysurvive.outcode(j,1:i-1)=mysurvivenew.outcode(state2,1:i-1);
  59.                 mysurvive.sufferstate(j,2:i,:)=mysurvivenew.sufferstate(state2,2:i,:);
  60.                 mysurvive.hamingdist(j,1:i-1)=mysurvivenew.hamingdist(state2,1:i-1);
  61.                 mysurvive.hamingdist(j,i)=dist2;            
  62.             end
  63.         end
  64.     end
  65.     thebest=min(find(mysurvive.hamingdist(:,end)==min(mysurvive.hamingdist(:,end))));
  66.     recover=mysurvive.outcode(thebest,:);
  67.     error(xyz)=sum(recover~=origin)/length;
  68. end
  69. plot(linspace(0,10,101),error)

复制代码


回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 18:13 , Processed in 0.034718 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表