標(biāo)題: 香農(nóng)編碼 求信源熵 編碼效率 c語言程序 [打印本頁]
作者: 李l潔 時(shí)間: 2017-6-4 09:37
標(biāo)題: 香農(nóng)編碼 求信源熵 編碼效率 c語言程序
#include<stdio.h>
#include<math.h> //使用各種數(shù)學(xué)函數(shù)
#define N 7
main()
{
int i,j;
double p[N]={0},max,sum=0,R,H=0,K1=0,n;
double q[N]={0};//概率數(shù)組
int length[N];//碼長(zhǎng)數(shù)組
double K[N]={0},I[N]={0};//求碼長(zhǎng)的中間數(shù)組
int a[N][N]={0};//二進(jìn)制存儲(chǔ)數(shù)組
for (i=0;i<N;i++)
scanf("%lf",&p[ i]);
printf("\n");
//判斷輸入概率是否正確
for(i=0;i<N;i++)
{
sum+=p[ i];
}
printf("概率之和=%lf\n",sum);
printf("\n");
if(sum==1.000000)
{
printf("輸入概率p(i):\n");
for(i=0;i<N;i++)
{
printf("p[%d]=%lf\n",i,p[ i]);
}
printf("\n");
}
else
{printf("error\n");return 0;}
//將概率進(jìn)行排序操作
for(i=0;i<N;i++)
{
for(j=i+1;j<N;j++)
{
if(p[ i]<p[j])
{
max=p[ i];
p[ i]=p[j];
p[j]=max;
}
}
}
//輸出排序后的數(shù)組
printf("排序:\n");
for(i=0;i<N;i++)
{
printf("p[%d]=%lf\n",i,p[ i]);
}
printf("\n");
//求累加概率
for(i=0;i<N;i++)
{
q[i+1]=q+p[ i];//從第二個(gè)開始加
}
//輸出累加概率數(shù)組
printf("累加概率:\n");
for(i=0;i<N;i++)
{
printf("q[%d]=%lf\n",i,q);
}
printf("\n");
//求-logp(i)
for(i=0,j=0;i<N;i++,j++)
{
K[j]=-log(p[ i])/log(2);
}
printf("-logp(i): \n");
for(j=0;j<N;j++)
printf("-logp(%d)=%.2lf\n",j,K[j]);
printf("\n");
//求碼字長(zhǎng)度
for(i=0,j=0;i<N;i++,j++)
{
K[j]=-log(p[ i])/log(2);
I[j]=K[j]+1;
if(I[j]>(int)(I[j]))//香農(nóng)編碼的第三個(gè)步驟
length[j]=(int)I[j];
else length[j]=K[j];
K1+=p[ i]*length[j];//求平均碼長(zhǎng)
}
//輸出碼字長(zhǎng)度
printf("碼長(zhǎng):\n");
for(i=0;i<N;i++)
{
printf("length[%d]=%d\n",i,length);
}
printf("\n");
//求累加概率的二進(jìn)制形式,即碼字
for(i=0;i<N;i++)
{
for(j=0;j<length;j++)
{
q=q*2;
if(q>=1)
{
q=q-1;
a[j]=1;
}
else a[j]=0;
}
}
//輸出碼字
printf("碼字:\n");
for(i=0;i<N;i++)
{
for(j=0;j<length;j++)
printf("%d",a[j]);
printf("\n");
}
//求信源熵 編碼效率
for(i=0,j=0;i<N;i++,j++)
{
K[j]=-log(p[ i])/log(2);
H+=p[ i]*K[j];
n=H/K1;
}
printf("H(x)=%.2lf,n=%lf",H,n);
}
歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |