维特比译码程序
viterbi译码算法详解

viterbi译码算法详解Viterbi译码算法是一种常用的序列解码算法,广泛应用于语音识别、自然语言处理、通信等领域。
本文将详细介绍Viterbi译码算法的原理和步骤,以及它的应用。
Viterbi译码算法是一种动态规划算法,用于在给定观测序列的情况下,求解最可能的隐藏状态序列。
在这个过程中,算法会基于概率模型和观测数据,通过计算每个可能的状态路径的概率,选择概率最大的路径作为输出。
Viterbi译码算法的基本原理是利用动态规划的思想,将问题分解为一系列子问题,并利用子问题的最优解来求解整体问题的最优解。
在Viterbi译码算法中,我们假设隐藏状态的转移概率和观测数据的发射概率已知,然后通过计算每个时刻的最优路径来递推地求解整个序列的最优路径。
具体而言,Viterbi译码算法包括以下步骤:1. 初始化:对于初始时刻t=0,计算每个隐藏状态的初始概率,即P(x0=s)。
2. 递推计算:对于时刻t>0,计算每个隐藏状态的最大概率路径。
假设在时刻t-1,每个隐藏状态的最大概率路径已知,则在时刻t,可以通过以下公式计算:P(xt=s) = max(P(xt-1=i) * P(xi=s) * P(ot=s|xi=s))其中,P(xt=s)表示在时刻t,隐藏状态为s的最大概率路径;P(xt-1=i)表示在时刻t-1,隐藏状态为i的最大概率路径;P(xi=s)表示从隐藏状态i转移到隐藏状态s的转移概率;P(ot=s|xi=s)表示在隐藏状态s的情况下,观测到观测值为s的发射概率。
3. 回溯路径:在最后一个时刻T,选择概率最大的隐藏状态作为最终的输出,并通过回溯的方式找到整个序列的最优路径。
通过上述步骤,Viterbi译码算法可以求解出给定观测序列下的最可能的隐藏状态序列。
这个算法的时间复杂度为O(N^2T),其中N 是隐藏状态的个数,T是观测序列的长度。
Viterbi译码算法在实际应用中有着广泛的应用。
基于TMS320C6000系列DSP的维特比译码程序优化设计

基于TMS320C6000系列DSP的维特比译码程序优化设计基于TMS320C6000系列DSP的维特比译码程序优化设计基于TMS320C6000系列DSP的维特比译码程序优化设计关键字:数字信号处理器维特比译码器软件无线电卷积码因为其编码器简单、编码增益高以及具有很强的纠正随机错误的能力,在通信系统中得到了广泛的应用。
基于最大似然准则的维特比算法(VA)是在加性高斯白噪声(AWGN)信道下性能最佳的卷积码译码算法,也是常用的一种算法[1~2]。
一般来说,实现软判决维特比译码可以有三种方案供选择:专用集成电路(ASIC)芯片、可编程逻辑阵列(FPGA)芯片以及数字信号处理器(DSP)芯片。
参考文献[3]对这三种方案的优劣做了详细的比较。
使用DSP芯片实现译码是最为灵活的一种方案,但速度也是最慢的,因为整个译码过程都是由软件来实现的。
在近年来兴起的软件无线电技术中,要求采用可编程能力强的的器件(DSP、CPU等)代替专用的数字电路。
对信道编解码而言,这样做的优点在于只需要在程序上加以少量改动,就可以适应不同的编码速率以及各种通信系统所要求的不同的编解码方法。
然而速度的瓶颈限制了DSP译码在实时系统中的应用,因此提高DSP的译码速度对于软件无线电有着重要的意义。
本文的目的就是通过对译码程序结构优化,来提高DSP芯片执行VA算法的速度。
1 维特比译码器首先,需要定义两个将在本文中用到的术语[2]:输入帧——每次输入译码器的比特;输出帧——对应一个输入帧,译码器输出的比特。
图1所示是卷积码译码器(VA算法)的一种典型结构。
以(2,1,7)卷积码为例(输入帧含2比特,输出帧为1比特),来说明译码器的三个主要部分。
1.1 支路度量计算单元(BMG)计算当前输入帧对应的128条支路的路径度量值,并将其存入支路度量存储单元(BMM)。
1.2 加比选单元(ACS)将支路度量值与相连的前面的路径度量值相加得到延伸后的新路径的度量值;比较连接在同一个状态上的两条新路径的度量值;选择其中度量值较小的那条路径(幸存路径),并将它的度量值存储到新路径度量存储器(SM)中,幸存路径值(对应编码状态的输入比特)存储到路径存储器(PM)中。
请简述卷积码译码的维特比算法

请简述卷积码译码的维特比算法
卷积码译码的维特比算法是一种概率译码方法,通过计算接收序列的每个可能的发送序列的概率,然后选择具有最大概率的发送序列作为译码输出。
具体步骤如下:
1. 计算每个时刻每个状态下的分支度量。
2. 对于每个时刻,计算每个状态下的部分路径和。
3. 将部分路径和与该时刻的接收路径进行比较,计算汉明码距离。
4. 选择具有最小汉明码距离的状态作为幸存路径。
5. 将幸存路径的最后一个时刻作为输出,并删除所有其他路径。
6. 重复步骤3-5,直到所有接收序列都被译码。
该算法的核心思想是“加、比、选”,即先将每个时刻每个状态下的分支度量进行累积,然后比较每个时刻每个状态下的部分路径和,选择具有最小汉明码距离的状态作为幸存路径。
通过重复执行这些步骤,最终得到译码输出。
viterbi译码算法详解

viterbi译码算法详解Viterbi译码算法详解Viterbi译码算法是一种在序列估计问题中广泛应用的动态规划算法。
它被用于恢复在一个已知的输出序列中最有可能的输入序列。
该算法最初由Andrew Viterbi在1967年提出,并被广泛应用于各种领域,如语音识别、自然语言处理、无线通信等。
Viterbi译码算法的基本思想是在一个已知的输出序列中寻找最有可能的输入序列。
它通过计算每个可能的输入序列的概率,并选择概率最大的输入序列作为最终的估计结果。
该算法的关键是定义一个状态转移模型和一个观测模型。
状态转移模型描述了输入序列的转移规律,即从一个输入状态转移到另一个输入状态的概率。
观测模型描述了输入序列和输出序列之间的关系,即给定一个输入状态,产生一个输出状态的概率。
在Viterbi译码算法中,首先需要进行初始化。
假设有n个可能的输入状态和m个可能的输出状态,我们需要初始化两个矩阵:状态概率矩阵和路径矩阵。
状态概率矩阵记录了每个时刻每个状态的最大概率,路径矩阵记录了每个时刻每个状态的最大概率对应的前一个状态。
接下来,我们通过递归的方式计算状态概率和路径矩阵。
对于每个时刻t和每个可能的输入状态i,我们计算当前状态的最大概率和对应的前一个状态。
具体的计算方式是通过上一个时刻的状态概率、状态转移概率和观测概率来计算当前时刻的状态概率,并选择其中最大的概率作为当前状态的最大概率。
我们通过回溯的方式找到最有可能的输入序列。
从最后一个时刻开始,选择具有最大概率的状态作为最终的估计结果,并通过路径矩阵一直回溯到第一个时刻,得到整个输入序列的最有可能的估计结果。
Viterbi译码算法的优势在于它能够处理大规模的状态空间和观测空间。
由于使用动态规划的思想,该算法的时间复杂度为O(nmT),其中n和m分别为可能的输入状态和输出状态的数量,T为输出序列的长度。
因此,在实际应用中,Viterbi译码算法能够高效地处理各种序列估计问题。
维特比译码算法

维特比译码算法
维特比译码算法是一种卷积码的译码算法,其基本原理是利用动态规划的方法,通过计算每个状态转移的路径度量值,找到最小路径度量的路径作为幸存路径,从而得到译码输出。
维特比译码算法的复杂度与信道质量无关,其计算量和存储量都随约束长度N和信息元分组k呈指数增长,因此当约束长度和信息元分组较大时并不适用。
为了充分利用信道信息,提高卷积码译码的可靠性,可以采用软判决维特比译码算法。
此时解调器不进行判决而是直接输出模拟量,或是将解调器输出波形进行多电平量化,而不是简单的0、1两电平量化,然后送往译码器。
即编码信道的输出是没有经过判决的“软信息”。
维特比译码原理

维特比译码原理
维特比译码是一种序列鉴别算法,用于解码已被编码的序列。
它主要用于纠错编码和通信领域。
维特比译码基于动态规划的思想,通过计算每个时刻的最大可能性路径来找到最优解码结果。
维特比译码的基本原理如下:
1. 建立状态图:首先根据编码方案的特点,建立一个有向无环状态图,其中每个节点表示一个状态,每个边表示从一个状态转移到另一个状态的转移。
2. 计算到达每个状态的最大概率:从起始状态开始,根据编码的输入序列逐步计算每个状态的到达概率。
对于每个状态,可以通过考虑前一个时刻的所有状态的概率和转移概率来计算到达该状态的最大概率。
3. 选择最大概率路径:在到达最后一个状态时,根据计算得到的最大概率路径,可以通过回溯的方式找到整个序列的最优解码结果。
维特比译码的核心思想是利用动态规划的方法,在计算过程中保存中间结果,以避免重复计算。
通过逐步计算每个状态的最大概率,可以在最后找到最优解码结果。
维特比译码在纠错编码和通信系统中广泛应用,可以有效地解
码受到噪声、干扰和丢失的编码序列,提高通信的可靠性和性能。
第9讲 信道编码:维特比译码

假设在信道上发送时,产生了2个突发错误,如下红色部分所示:
x1x6 x11x16 x21x2 x7 x12 x17 x22 x3 x8 x13 x18 x23 x4 x9 x14 x19 x24 x5 x10 x15 x20 x25
接收端收到这长度为25的序列先进行去交织处理,同样将序列写入 到一个55的存储阵列中,写入和读出顺序与发送端相反,即按行 写入,按列读出。写入之后的情况如下:
x1 x2 x3 x4 x5
x6 x7 x8 x9 x10
x11 x12 x13 x14 x15
x16 x17 x18 x19 x20
x21 x22 x23 x24 x25
按列读出的序列:
x1x2 x3 x4 x5 x6 x7 x8 x9 x10 x11x12 x13 x14 x15 x16 x17 x18 x19 x20 x21x22 x23 x24 x25
交织过程:
1)发送端将序列按列的顺序写入,然后按行的顺序输出;
2)接收端将接收到的序列按行写入,然后按列的顺序输出 周期性交织特性: 1)l ≤M的突发错误 → 至少被N – 1个位隔开的独立随机错误 2)l > M的突发错误 → 变成 l1 = [l / M]短突发错误
3)交织和去交织的处理会造成2MN个符号的延迟
随机过程的基本概念
初等概率论研究的主要对象是一个或有限个随机变量
但在一些科学技术中需要对一些随机现象的变化过程进 行研究,必须考虑无穷多个随机变量 用一族随机变量才能刻划这种随机现象的全部统计规律 性
可以把这样的一族随机变量称为随机过程
随机过程的数学定义:
设随机试验的样本空间 S {ei },如果对于空间的每一个样本 t T 总有一个时间函数 X (t, ei ) 与之对应。对于样本空间S 的所有样 本 ei S,有一族时间函数 e S与其对应,这族时间函数 X (t , e) 定义为随机过程
Viterbi译码的Matlab实现

2010年12月(上)Viterbi 译码的Matlab 实现张慧(盐城卫生职业技术学院,江苏盐城224006)[摘要]本文主要介绍了Viterbi 译码是一种最大似然译码算法,是卷积编码的最佳译码算法。
本文主要是以(2,1,2)卷积码为例,介绍了Viterbi 译码的原理和过程,并用Matlab 进行仿真。
[关键词]卷积码;Viterbi 译码1卷积码的类型卷积码的译码基本上可划分为两大类型:代数译码和概率译码,其中概率译码是实际中最常采用的卷积码译码方法。
2Viterbi 译码Viterbi 译码是由Viterbi 在1967年提出的一种概率译码,其实质是最大似然译码,是卷积码的最佳译码算法。
它利用编码网格图的特殊结构,降低了计算的复杂性。
该算法考虑的是,去除不可能成为最大似然选择对象的网格图上的路径,即,如果有两条路径到达同一状态,则具有最佳量度的路径被选中,称为幸存路径(surviving path )。
对所有状态都将进行这样的选路操作,译码器不断在网格图上深入,通过去除可能性最小的路径实现判决。
较早地抛弃不可能的路径降低了译码器的复杂性。
为了更具体的理解Viterbi 译码的过程,我们以(2,1,2)卷积码为例,为简化讨论,假设信道为BSC 信道。
译码过程的前几步如下:假定输入数据序列m ,码字U ,接收序列Z ,如图1所示,并假设译码器确知网格图的初始状态。
图1时刻t 1接收到的码元是11,从状态00出发只有两种状态转移方向,00和10,如图a 所示。
状态转换的分支量度是2;状态转换的分支径量度是0。
时刻t 2从每个状态出发都有两种可能的分支,如图b 所示。
这些分支的累积量度标识为状态量度┎a ,┎b ,┎c ,┎d ,与各自的结束状态相对应。
同样地,图c 中时刻t 3从每个状态出发都有两个分支,因此,时刻时到达每个状态的路径都有两条,这两条路径中,累积路径量度较大的将被舍弃。
如果这两条路径的路径量度恰好相等,则任意舍弃其中一条路径。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(n,k,N)卷积码的维特比译码算法实现#include<iostream>#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 myg1[10]={0};int myg2[10]={0};int stan0[256][2]={0};//输入0时个状态的输出int stan1[256][2]={0};//输入1时各状态的输出int stachn[256][2]={0};//状态装换表int path[256][100]={0};//存储路径int calpath[256]={0};//存储路径长度int myin[24];//一次处理12次int myout[200]; //int myoutsym=0;int pthsym;int outfull=0; //决定是否输出int table1[8]={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 viterbit(void);void writdataedn(void);void creatsta(void);void myinput(void);int main(){myinput();creatsta();viterbit();}void myinput(void){int i,j;cout<<"输入编码的约束长度N:(3<N<9)"<<endl;cin>>myn;stalen=int(pow(2.0,myn-1));cout<<"选择默认的编码矢量则输入1,输入2则可输入其他的编码矢量"<<endl;cin>>i;if(i==1){switch(myn){case 3:myg1[0]=1,myg1[1]=1,myg1[2]=1;myg2[0]=1,myg2[1]=0,myg2[2]=1;break;case 4:myg1[0]=1,myg1[1]=1,myg1[2]=1,myg1[3]=1;myg2[0]=1,myg2[1]=0,myg2[2]=1,myg2[3]=1;break;case 5:myg1[0]=1,myg1[1]=0,myg1[2]=1,myg1[3]=1,myg1[4]=1;myg2[0]=1,myg2[1]=1,myg2[2]=0,myg2[3]=1,myg2[4]=1;break;case 6:myg1[0]=1,myg1[1]=0,myg1[2]=1,myg1[3]=1,myg1[4]=1,myg1[5]=1;myg2[0]=1,myg2[1]=1,myg2[2]=0,myg2[3]=1,myg2[4]=0,myg2[5]=1;break;case 7: myg1[0]=1,myg1[1]=0,myg1[2]=0,myg1[3]=1,myg1[4]=1,myg1[5]=1,myg1[6]=1;myg2[0]=1,myg2[1]=1,myg2[2]=0,myg2[3]=1,myg2[4]=1,myg2[5]=0,myg2[6]=1;break;case 8: myg1[0]=1,myg1[1]=0,myg1[2]=0,myg1[3]=1,myg1[4]=1,myg1[5]=1,myg1[6]=1,myg1[7]=1;myg2[0]=1,myg2[1]=1,myg2[2]=1,myg2[3]=0,myg2[4]=0,myg2[5]=1,myg2[6]=0,myg2[7]=1;break;case 9: myg1[0]=1,myg1[1]=1,myg1[2]=0,myg1[3]=1,myg1[4]=0,myg1[5]=1,myg1[6]=1,myg1[7]=1,m yg1[8]=1;myg2[0]=1,myg2[1]=0,myg2[2]=0,myg2[3]=0,myg2[4]=1,myg2[5]=1,myg2[6]=1,myg2[7]=0,m yg2[8]=1;break;}}else{cout<<"输入g1"<<endl;for(j=0;j<myn;j++)cin>>myg1[j];cout<<"输入g2"<<endl;for(j=0;j<myn;j++)cin>>myg2[j];}cout<<"连接矢量1为"<<endl;for(j=0;j<myn;j++)cout<<myg1[j]<<" ";cout<<endl;cout<<"连接矢量2为"<<endl;for(j=0;j<myn;j++)cout<<myg2[j]<<" ";cout<<endl;cout<<"stalen: "<<stalen;cout<<endl;}void creatsta(void){int i,j,k,myi;int tembits[10];for(i=0;i<stalen;i++){stan1[i][0]=0;stan1[i][1]=0;stan0[i][0]=0;stan0[i][1]=0;stachn[i][0]=i/2;myi=i;for(j=0;j<myn;j++){if(myi>=pow(2.0,myn-1-j)){tembits[j]=1;myi=myi-pow(2.0,myn-1-j);}else{tembits[j]=0;}}for(k=0;k<myn;k++){stan0[i][0]+=myg1[k]*tembits[k];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.0,myn-1));stachn[i][1]=myi/2;for(j=0;j<myn;j++){if(myi>=pow(2.0,myn-1-j)){tembits[j]=1;myi=myi-pow(2.0,myn-1-j);}else{tembits[j]=0;}}for(k=0;k<myn;k++){stan1[i][0]+=myg1[k]*tembits[k];stan1[i][1]+=myg2[k]*tembits[k];}stan1[i][0]=stan1[i][0]%2;stan1[i][1]=stan1[i][1]%2;}cout<<"状态转移出"<<endl;for(i=0;i<stalen;i++)cout<<stachn[i][0]<<","<<stachn[i][1]<<" ";cout<<endl;cout<<"输入0状态转移后的输出"<<endl;for(i=0;i<stalen;i++)cout<<stan0[i][0]<<","<<stan0[i][1]<<" ";cout<<endl;cout<<"输入1状态转移后的输出"<<endl;for(i=0;i<stalen;i++)cout<<stan1[i][0]<<","<<stan1[i][1]<<" ";cout<<endl;}void chartobits(char ch,int *bits){int i;for(i=0;i<8;i++){if(ch<0)bits[i]=1;elsebits[i]=0;ch=ch<<1;}}char bitstochar(int *bits){char temp=0;int i;for(i=0;i<8;i++){if(bits[i]==1)temp+=table1[7-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_tem[256][5]={0};int i,j,k,l;int ljtem[256][100];int pttem[256]={0};int staflag[256]={0};staflag[0]=1;int a1,a2;for(l=0;l<myn-1;l++){for(i=0;i<stalen;i++)for(j=0;j<pthsym;j++)ljtem[i][j]=path[i][j];i=0;a1=myin[2*l];a2=myin[2*l+1];for(j=0;j<stalen;j++){if(staflag[j]==1){tem=calluj(a1,a2,stan0[j][0],stan0[j][1]);t_tem[i][t_src]=j;t_tem[i][t_des]=stachn[j][0];t_tem[i][t_len]=calpath[j]+tem;t_tem[i][t_in]=0;tem=calluj(a1,a2,stan1[j][0],stan1[j][1]);t_tem[i+1][t_src]=j;t_tem[i+1][t_des]=stachn[j][1];t_tem[i+1][t_len]=calpath[j]+tem;t_tem[i+1][t_in]=1;i=i+2;}}for(k=0;k<stalen;k++)staflag[k]=0;for(k=0;k<i;k++){staflag[t_tem[k][t_des]]=1;calpath[t_tem[k][t_des]]=t_tem[k][t_len];for(j=0;j<pthsym;j++)path[t_tem[k][t_des]][j]=ljtem[t_tem[k][t_src]][j];path[t_tem[k][t_des]][pthsym]=t_tem[k][t_in];}pthsym++;}/*cout<<"初始化后的路径长度"<<endl;for(int i=0;i<8;i++)cout<<calpath[i]<<" ";cout<<endl;*/}void selpath(int a1,int a2){//16选8int t_tem[512][5]={0};int i,j,tem;int ljtem[256][100];j=0;for(i=0;i<2*stalen;i=i+2){tem=calluj(a1,a2,stan0[j][0],stan0[j][1]);t_tem[i][t_src]=j;t_tem[i][t_des]=stachn[j][0];t_tem[i][t_len]=calpath[j]+tem;t_tem[i][t_flag]=0;t_tem[i][t_in]=0;//t_tem[i][t_rep]=0;tem=calluj(a1,a2,stan1[j][0],stan1[j][1]);t_tem[i+1][t_src]=j;t_tem[i+1][t_des]=stachn[j][1];t_tem[i+1][t_len]=calpath[j]+tem;t_tem[i+1][t_flag]=0;t_tem[i+1][t_in]=1;//t_tem[i][t_rep]=0;j++;}for(i=0;i<2*stalen;i++)for(j=i+1;j<2*stalen;j++)if(t_tem[i][t_des]==t_tem[j][t_des]){if(t_tem[i][t_len]<=t_tem[j][t_len]){t_tem[i][t_flag]=1;}else{t_tem[j][t_flag]=1;}}for(i=0;i<stalen;i++)for(j=0;j<pthsym;j++)ljtem[i][j]=path[i][j];for(i=0;i<2*stalen;i++)if(t_tem[i][t_flag]==1){calpath[t_tem[i][t_des]]=t_tem[i][t_len];for(j=0;j<pthsym;j++)path[t_tem[i][t_des]][j]=ljtem[t_tem[i][t_src]][j];path[t_tem[i][t_des]][pthsym]=t_tem[i][t_in];}if(pthsym>16)outfull=1;pthsym++;}void wridata(){int i,j,icout,equcout;icout=0;equcout=0;for(i=0;i<pthsym;i++){for(j=0;j<stalen-1;j++)if(path[j][i]==path[j+1][i])equcout++;if(equcout==stalen-1){myout[myoutsym++]=path[0][i];icout++;equcout=0;}elsebreak;}if(icout!=0){for(i=0;i<pthsym-icout;i++){for(j=0;j<stalen;j++)path[j][i]=path[j][i+icout];}}pthsym=pthsym-icout;outfull=0;}void writdataedn(void){int i,j;i=0;for(j=1;j<stalen;j++)if(calpath[i]>calpath[j])i=j;for(j=0;j<pthsym;j++)myout[myoutsym++]=path[i][j];}void viterbit(){FILE *fp_input,*fp_output;if(!(fp_input=fopen("D://output.txt","r"))==1){cout<<"failed to open output.txt"<<endl;exit(0);}elsecout<<"we opened the output_file "<<endl;if(!(fp_output=fopen("D://myinput.txt","w+"))==1){ cout<<"failed to open output_file"<<endl;exit(0);}elsecout<<"we opened the myinput.txt "<<endl;char ch;int count=0;int i,j;char wch;int wcout=0;int mybit[8];ch=fgetc(fp_input);chartobits(ch,mybit);for(i=0;i<8;i++)myin[i]=mybit[i];while(feof(fp_input)==0){ch=fgetc(fp_input);//cout<<"输入"<<ch<<" ";/*cout<<"输入数据1为"<<endl;for(temi=0;temi<8;temi++)cout<<myin[temi]<<" ";cout<<endl;*/if(count==0){chartobits(ch,mybit);for(i=0;i<8;i++)myin[i+8]=mybit[i];initpath();for(j=myn-1;j<8;j=j++)selpath(myin[2*j],myin[2*j+1]);}else{chartobits(ch,myin);for(j=0;j<4;j++)selpath(myin[2*j],myin[2*j+1]);}count++;if(count==0)count=1;//if(outfull==1)wridata();if(myoutsym>=8){wcout=int(myoutsym/8);for(i=0;i<wcout;i++){for(j=0;j<8;j++)mybit[j]=myout[8*i+j];wch=bitstochar(mybit);//cout<<"输出为"<<wch<<" ";fputc(wch,fp_output);}for(i=0;i<myoutsym-wcout*8;i++)myout[i]=myout[wcout*8+i];myoutsym=myoutsym-wcout*8;}}writdataedn();if(myoutsym>=3){for(i=0;i<8-myoutsym;i++)myout[myoutsym++]=0;wch=bitstochar(myout);fputc(wch,fp_output);}fclose(fp_input);fclose(fp_output);cout<<"input any integer to end"<<endl;cin>>i;}。