1、维特比译码程序 (n,k,N)卷积码的维特比译码算法实现#include#define t_src 0#define t_des 1#define t_len 2#define t_flag 3#define t_in 4using namespace std;int myn=0;int stalen=0;int myg110=0;int myg210=0;int stan02562=0;/输入0时个状态的输出int stan12562=0;/输入1时各状态的输出int stachn2562=0;/状态装换表int path256100=0;/存储路径int calpath256=0;/存储路
2、径长度int myin24; /一次处理12次int myout200; /int myoutsym=0;int pthsym;int outfull=0; /决定是否输出int table18=1,2,4,8,16,32,64,128;void chartobits(char ch,int *bits);char bitstochar(int *bits);int calluj(int a1,int a2,int b1,int b2);void initpath(void);void selpath(int a1,int a2);void wridata(void);void viterbi
3、t(void);void writdataedn(void);void creatsta(void);void myinput(void);int main() myinput(); creatsta(); viterbit();void myinput(void) int i,j; cout输入编码的约束长度N:(3N9)myn; stalen=int(pow,myn-1); cout选择默认的编码矢量则输入1,输入2则可输入其他的编码矢量i; if(i=1) switch(myn) case 3: myg10=1,myg11=1,myg12=1; myg20=1,myg21=0,myg22
4、=1; break; case 4: myg10=1,myg11=1,myg12=1,myg13=1; myg20=1,myg21=0,myg22=1,myg23=1; break; case 5: myg10=1,myg11=0,myg12=1,myg13=1,myg14=1; myg20=1,myg21=1,myg22=0,myg23=1,myg24=1; break; case 6: myg10=1,myg11=0,myg12=1,myg13=1,myg14=1,myg15=1; myg20=1,myg21=1,myg22=0,myg23=1,myg24=0,myg25=1; break
5、; case 7: myg10=1,myg11=0,myg12=0,myg13=1,myg14=1,myg15=1,myg16=1; myg20=1,myg21=1,myg22=0,myg23=1,myg24=1,myg25=0,myg26=1; break; case 8: myg10=1,myg11=0,myg12=0,myg13=1,myg14=1,myg15=1,myg16=1,myg17=1; myg20=1,myg21=1,myg22=1,myg23=0,myg24=0,myg25=1,myg26=0,myg27=1; break; case 9: myg10=1,myg11=1,
6、myg12=0,myg13=1,myg14=0,myg15=1,myg16=1,myg17=1,myg18=1; myg20=1,myg21=0,myg22=0,myg23=0,myg24=1,myg25=1,myg26=1,myg27=0,myg28=1; break; else cout输入g1endl; for(j=0;jmyg1j; cout输入g2endl; for(j=0;jmyg2j; cout连接矢量1为endl; for(j=0;jmyn;j+) coutmyg1j ; coutendl; cout连接矢量2为endl; for(j=0;jmyn;j+) coutmyg2j
7、; coutendl; coutstalen: stalen; coutendl;void creatsta(void) int i,j,k,myi; int tembits10; for(i=0;istalen;i+) stan1i0=0; stan1i1=0; stan0i0=0; stan0i1=0; stachni0=i/2; myi=i; for(j=0;j=pow,myn-1-j) tembitsj=1; myi=myi-pow,myn-1-j); else tembitsj=0; for(k=0;kmyn;k+) stan0i0+=myg1k*tembitsk; stan0i1+
8、=myg2k*tembitsk; stan0i0=stan0i0%2; stan0i1=stan0i1%2; myi=i+int(pow,myn-1); stachni1=myi/2; for(j=0;j=pow,myn-1-j) tembitsj=1; myi=myi-pow,myn-1-j); else tembitsj=0; for(k=0;kmyn;k+) stan1i0+=myg1k*tembitsk; stan1i1+=myg2k*tembitsk; stan1i0=stan1i0%2; stan1i1=stan1i1%2; cout状态转移出endl; for(i=0;istal
9、en;i+) coutstachni0,stachni1 ; coutendl; cout输入0状态转移后的输出endl; for(i=0;istalen;i+) coutstan0i0,stan0i1 ; coutendl; cout输入1状态转移后的输出endl; for(i=0;istalen;i+) coutstan1i0,stan1i1 ; coutendl;void chartobits(char ch,int *bits) int i; for(i=0;i8;i+) if(ch0) bitsi=1; else bitsi=0; ch=ch1; char bitstochar(in
10、t *bits) char temp=0; int i; for(i=0;i8;i+) if(bitsi=1) temp+=table17-i; return temp;int calluj(int a1,int a2,int b1,int b2) int y=0; if(a1!=b1) y+; if(a2!=b2) y+; return(y);void initpath() int tem; int t_tem2565=0; int i,j,k,l; int ljtem256100; int pttem256=0; int staflag256=0; staflag0=1; int a1,a
11、2; for(l=0;lmyn-1;l+) for(i=0;istalen;i+) for(j=0;jpthsym;j+) ljtemij=pathij; i=0; a1=myin2*l; a2=myin2*l+1; for(j=0;jstalen;j+) if(staflagj=1) tem=calluj(a1,a2,stan0j0,stan0j1); t_temit_src=j; t_temit_des=stachnj0; t_temit_len=calpathj+tem; t_temit_in=0; tem=calluj(a1,a2,stan1j0,stan1j1); t_temi+1t
12、_src=j; t_temi+1t_des=stachnj1; t_temi+1t_len=calpathj+tem; t_temi+1t_in=1; i=i+2; for(k=0;kstalen;k+) staflagk=0; for(k=0;ki;k+) staflagt_temkt_des=1; calpatht_temkt_des=t_temkt_len; for(j=0;jpthsym;j+) patht_temkt_desj=ljtemt_temkt_srcj; patht_temkt_despthsym=t_temkt_in; pthsym+; /*cout初始化后的路径长度en
13、dl; for(int i=0;i8;i+) coutcalpathi ; coutendl;*/void selpath(int a1,int a2)/16选8 int t_tem5125=0; int i,j,tem; int ljtem256100; j=0; for(i=0;i2*stalen;i=i+2) tem=calluj(a1,a2,stan0j0,stan0j1); t_temit_src=j; t_temit_des=stachnj0; t_temit_len=calpathj+tem; t_temit_flag=0; t_temit_in=0; /t_temit_rep=
14、0; tem=calluj(a1,a2,stan1j0,stan1j1); t_temi+1t_src=j; t_temi+1t_des=stachnj1; t_temi+1t_len=calpathj+tem; t_temi+1t_flag=0; t_temi+1t_in=1; /t_temit_rep=0; j+; for(i=0;i2*stalen;i+) for(j=i+1;j2*stalen;j+) if(t_temit_des=t_temjt_des) if(t_temit_len=t_temjt_len) t_temit_flag=1; else t_temjt_flag=1;
15、for(i=0;istalen;i+) for(j=0;jpthsym;j+) ljtemij=pathij; for(i=0;i2*stalen;i+) if(t_temit_flag=1) calpatht_temit_des=t_temit_len; for(j=0;j16) outfull=1; pthsym+;void wridata() int i,j,icout,equcout; icout=0; equcout=0; for(i=0;ipthsym;i+) for(j=0;jstalen-1;j+) if(pathji=pathj+1i) equcout+; if(equcou
16、t=stalen-1) myoutmyoutsym+=path0i; icout+; equcout=0; else break; if(icout!=0) for(i=0;ipthsym-icout;i+) for(j=0;jstalen;j+) pathji=pathji+icout; pthsym=pthsym-icout; outfull=0;void writdataedn(void) int i,j; i=0; for(j=1;jcalpathj) i=j; for(j=0;jpthsym;j+) myoutmyoutsym+=pathij;void viterbit() FILE
17、 *fp_input,*fp_output; if(!(fp_input=fopen(,r)=1) coutfailed to open endl; exit(0); else coutwe opened the output_file endl; if(!(fp_output=fopen(,w+)=1) coutfailed to open output_fileendl; exit(0); else coutwe opened the endl; char ch; int count=0; int i,j; char wch; int wcout=0; int mybit8; ch=fge
18、tc(fp_input); chartobits(ch,mybit); for(i=0;i8;i+) myini=mybiti; while(feof(fp_input)=0) ch=fgetc(fp_input); /cout输入 ch ; /*cout输入数据1为endl; for(temi=0;temi8;temi+) coutmyintemi ; coutendl;*/ if(count=0) chartobits(ch,mybit); for(i=0;i8;i+) myini+8=mybiti; initpath(); for(j=myn-1;j8;j=j+) selpath(myi
19、n2*j,myin2*j+1); else chartobits(ch,myin); for(j=0;j=8) wcout=int(myoutsym/8); for(i=0;iwcout;i+) for(j=0;j8;j+) mybitj=myout8*i+j; wch=bitstochar(mybit); /cout输出为 wch ; fputc(wch,fp_output); for(i=0;i=3) for(i=0;i8-myoutsym;i+) myoutmyoutsym+=0; wch=bitstochar(myout); fputc(wch,fp_output); fclose(fp_input); fclose(fp_output); coutinput any integer to endi;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1