📄 alaw.c
字号:
#include<c6x.h>
#include<math.h>
#define CODENUMBER 64
#define DPI 2*3.1415926/CODENUMBER
unsigned char IntToALaw(int nInput);
int ALawToInt(unsigned char nInput);
int nData[CODENUMBER];
unsigned char nCode[CODENUMBER];
int nDecode[CODENUMBER];
int nError[CODENUMBER];
main()
{
float fData;
int i;
for ( i=0;i<CODENUMBER;i++ )
{
nData[i]=(int)(sin((double)i*DPI)*2048); // 生成测试曲线
nCode[i]=IntToALaw(nData[i]); // 转换成A律压缩编码
nDecode[i]=ALawToInt(nCode[i]); // 解码
nError[i]=abs(nData[i]-nDecode[i]); // 统计压缩误差
}
while ( 1 ); // BreakPoint
}
unsigned char IntToALaw(int nInput)
{
char segment;
unsigned int i, sign,quant;
unsigned int absol, temp;
int nOutput;
unsigned char cOutput;
temp=absol=abs(nInput);
sign=(nInput >= 0)?1:0;
for(i=0;i<16;i++){
nOutput=temp&0x8000;
if(nOutput)break;
temp<<=1;
}
segment=11-i;
if(segment<=0){
segment=0;
quant=(absol>>1)&0x0F;
}
else
quant=(absol>>segment)&0x0F;
segment<<=4;
nOutput=segment+quant;
if(absol>4095) nOutput=0x7F;
if(sign)
nOutput^=0xD5;
else
nOutput^=0x55;
cOutput=(unsigned char)nOutput;
return cOutput;
}
int ALawToInt(unsigned char nInput)
{
int sign, segment;
int temp, quant,nOutput;
temp=nInput^0xD5;
sign=(temp&0x80)>>7;
segment=(temp&0x70)>>4;
quant=temp&0x0F;
quant<<=1;
if(!segment)
quant+=1;
else{
quant+=33;
quant<<=segment-1;
}
if ( sign )
nOutput=-quant;
else
nOutput=quant;
return nOutput;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -