# include <iostream.h>
# include <string.h>
# include <math.h>
# include <iostream.h>
# include <string.h>
# include <math.h>
int b2d(int x[4]) //二进制转化为十进制数
{ int i = 1,results = 0;
for (i; i <4; i ++)
{
//将计算的值累加得到最终结果
// 注意pow(2,i)函数,该函数用作计算某个数的N次方这里计算2的i次方
results += x[i] * pow(2,3-i);
}
return results;
}
void code1(int sta,int t,int x,int code[4])
{
//段内编码
//输入为抽样值,对应段的初始值和该段的间隔
//输出为段内编码
if(x>sta+8*t)
{ code[0]=1;
if(x>sta+8*t+4*t)
{ code[1]=1;
if(x>sta+8*t+4*t+2*t)
{ code[2]=1;
if(x>sta+8*t+4*t+2*t+t)
code[3]=1;//当抽样值位于段内第16段时编码为1111
else
code[3]=0;//当抽样值位于段内第15段时编码为1110
}
else
{ code[2]=0;
if(x>sta+8*t+4*t+t)
code[3]=1;//当抽样值位于段内第14段时编码为1101
else code[3]=0;//当抽样值位于段内第13段时编码为1100
}
}
else
{ code[1]=0;
if(x>sta+8*t+2*t)
{ code[2]=1;
if(x>sta+8*t+2*t+t)
code[3]=1;//当抽样值位于段内第12段时编码为1011
else code[3]=0;//当抽样值位于段内第11段时编码为1010
}
else
{ code[2]=0;
if(x>sta+8*t+t)
code[3]=1;//当抽样值位于段内第10段时编码为1001
else code[3]=0;//当抽样值位于段内第9段时编码为1000
}
}
}
else
{ code[0]=0;
if(x>sta+4*t)
{ code[1]=1;
if(x>sta+4*t+2*t)
{ code[2]=1;
if(x>sta+4*t+2*t+t)
code[3]=1;//当抽样值位于段内第8段时编码为0111
else code[3]=0;//当抽样值位于段内第7段时编码为0110
}
else
{ code[2]=0;
if(x>sta+4*t+t)
code[3]=1;//当抽样值位于段内第6段时编码为0101
else code[3]=0;//当抽样值位于段内第5段时编码为0100
}
}
else
{ code[1]=0;
if(x>sta+2*t)
{ code[2]=1;
if(x>sta+2*t+t)
code[3]=1;//当抽样值位于段内第4段时编码为0011
else code[3]=0;//当抽样值位于段内第3段时编码为0010
}
else
{ code[2]=0;
if(x>sta+t)
code[3]=1;//当抽样值位于段内第2段时编码为0001
else code[3]=0;//当抽样值位于段内第16段时编码为0000
}
}
}
//return code;
}
void main()
{
int sample; //抽样值
int temp;//临时存放抽样值的绝对值
int n=0;//用以存code的二进制转十进制数
int i=0;//for循环计数器
int m=2;//初始值大于0,进入while循环
int start;//每段对应的初始值,0、16、32、64、128、256、512、1024
int t;//每段对应的间隔,1、1、2、4、8、16、32、64
int code[4]; //存放符号位和段编码
int code2[4]; //存放段内编码
cout<<"PCM coding\n";
while (m>0)
{
cout<<"Please key the sample value \n";
cin>>sample;
if(sample>0)//抽样值大于0,符号位为1,否则为0
code[0]=1;
else code[0]=0;
temp=abs(sample);//temp用以存放抽样值的绝对值
if(temp>128)
{ code[1]=1;
if(temp>512)
{ code[2]=1;
if(temp>1024)
code[3]=1;//抽样值位于第八段时,段编码为111
else code[3]=0;//抽样值位于第七段时,段编码为110
}
else
{ code[2]=0;
if(temp>256)
code[3]=1;//抽样值位于第六段时,段编码为101
else code[3]=0; //抽样值位于第五段时,段编码为100
}
}
else
{ code[1]=0;
if(temp>32)
{ code[2]=1;
if(temp>64)
code[3]=1;//抽样值位于第四段时,段编码为011
else code[3]=0;//抽样值位于第三段时,段编码为010
}
else
{ code[2]=0;
if(temp>16)
code[3]=1;//抽样值位于第二段时,段编码为001
else code[3]=0;//抽样值位于第一段时,段编码为000
}
}
n=b2d(code);
//将段编码转化为十进制,根据抽样值所处的段,选择相应的初始值和段内间隔
//然后调用段内编码函数,进行段内编码
switch (n)
{ case 0: start=0;
t=1;
code1(start,t,temp,code2);
break;
case 1: start=16;
t=1;
code1(start,t,temp,code2);
break;
case 2: start=32;
t=2;
code1(start,t,temp,code2);
break;
case 3: start=64;
t=4;
code1(start,t,temp,code2);
break;
case 4: start=128;
t=8;
code1(start,t,temp,code2);
break;
case 5: start=256;
t=16;
code1(start,t,temp,code2);
break;
case 6: start=512;
t=32;
code1(start,t,temp,code2);
break;
case 7: start=1024;
t=64;
code1(start,t,temp,code2);
break;
}
cout<<code[0]<<code[1]<<code[2]<<code[3];
cout<<code2[0]<<code2[1]<<code2[2]<<code2[3];
cout<<"\n";
//cout<<sample;
// cout<<n;
// cout<<"Please key the sample value \t";
// cin>>sample;
cout<<"Please choose:0,stop;1,continue coding \n";
cin>>m;
}
}
评论0