算数编码(c++实现)

最近老师布置了一道题目,要求用c++来实现算数编码,题目要求为:

无记忆信源 a1 a2 a3 a4 ,其概率分布为:p(a1)=0.5,p(a2)=0.25,p(a3)=0.125,p(a4)=0.125

信源序列:u=a2 a1 a1 a3 a4 a1 a2 a1

对信源进行编码。

代码实现部分如下:

#include<iostream>
#include<math.h>
using namespace std;

double p[]={0.5,0.25,0.125,0.125}; //信源概率分布
char u[]={2,1,1,3,4,1,2,1}; //信源序列
double fu[]={0,0.5,0.75,0.875}; //信源F分布

/**********************************/
/*传入参数:
double f_u:信源F(ui)
int m :码元的长度
***********************************/
void display_code(double f_u,int m)
{
int i=0;
char code[20];
for(i=0;i<m;i++) //将十进制小数转化为二进制数
{
f_u=f_u*2;
if(f_u>=1.0)
{
code[i]='1';
f_u=f_u-1;
}
else
code[i]='0';
}
cout<<"码元序列为:";
for(i=0;i<m;i++)
cout<<code[i];
cout<<endl;
}

 

int main()
{
double p_u=1.0;
double f_u=0;
int i,m,n;
static double pu=1.0;

n=strlen(u); //信源序列长度n

for(i=0;i<n;i++)
{
int j;
j=u[i];
p_u=p[j-1]*p_u;
}
p_u=1/p_u;
m=(int)(log(p_u)/log(2.0)); //码元长度m

for(i=0;i<n;i++)
{
int j=u[i];
f_u=f_u+pu*fu[j-1];
pu=pu*p[j-1];
}

cout<<"码元长度为:"<<m<<endl;

display_code(f_u,m);

system("pause");
}

原文链接: https://www.cnblogs.com/boyuan/archive/2011/11/27/2265171.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    算数编码(c++实现)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/37371

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午2:01
下一篇 2023年2月8日 下午2:02

相关推荐